Spring MVC Hibernate MySQL集成CRUD示例教程

 2023-09-06 阅读 30 评论 0

摘要:Spring MVC Hibernate MySQL集成CRUD示例教程 我们在上一篇教程中学习了如何集成Spring和Hibernate。今天,我们将继续前进,并将Spring MVC和Hibernate框架集成到Web应用程序CRUD示例中。 我们的最终项目结构如下图所示,我们将逐一查看每个组件。 请注意

 

Spring MVC Hibernate MySQL集成CRUD示例教程

 

我们在上一篇教程中学习了如何集成Spring和Hibernate。今天,我们将继续前进,并将Spring MVC和Hibernate框架集成到Web应用程序CRUD示例中。

我们的最终项目结构如下图所示,我们将逐一查看每个组件。

Spring MVC Hibernate示例

请注意,我在我们的示例中使用了Spring 4.0.3.Release和Hibernate 4.3.5.Final版本,同样的程序也兼容Spring 4和Hibernate 3,但是您需要对上一个教程中讨论的spring bean配置文件进行小的更改。

目录[ 隐藏 ]

  • 1个 Maven依赖
  • 2部署描述符
  • 3 Hibernate Entity Bean
  • 4 Hibernate DAO实现
  • 5个春季服务类
  • 6弹簧控制器类
  • 7 Spring Bean配置
  • 8查看页面
  • 9 Spring MVC Hibernate应用程序测试
  • 10总结

 

Maven依赖

让我们来看看hibernate和spring MVC框架集成所需的所有maven依赖项。


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.journaldev.spring</groupId><artifactId>SpringMVCHibernate</artifactId><name>SpringMVCHibernate</name><packaging>war</packaging><version>1.0.0-BUILD-SNAPSHOT</version><properties><java-version>1.6</java-version><org.springframework-version>4.0.3.RELEASE</org.springframework-version><org.aspectj-version>1.7.4</org.aspectj-version><org.slf4j-version>1.7.5</org.slf4j-version><hibernate.version>4.3.5.Final</hibernate.version></properties><dependencies><!-- Spring --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${org.springframework-version}</version><exclusions><!-- Exclude Commons Logging in favor of SLF4j --><exclusion><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${org.springframework-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${org.springframework-version}</version></dependency><!-- Hibernate --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>${hibernate.version}</version></dependency><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><!-- Apache Commons DBCP --><dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency><!-- Spring ORM --><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${org.springframework-version}</version></dependency><!-- AspectJ --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>${org.aspectj-version}</version></dependency>	<!-- Logging --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${org.slf4j-version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${org.slf4j-version}</version><scope>runtime</scope></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.15</version><exclusions><exclusion><groupId>javax.mail</groupId><artifactId>mail</artifactId></exclusion><exclusion><groupId>javax.jms</groupId><artifactId>jms</artifactId></exclusion><exclusion><groupId>com.sun.jdmk</groupId><artifactId>jmxtools</artifactId></exclusion><exclusion><groupId>com.sun.jmx</groupId><artifactId>jmxri</artifactId></exclusion></exclusions><scope>runtime</scope></dependency><!-- @Inject --><dependency><groupId>javax.inject</groupId><artifactId>javax.inject</artifactId><version>1</version></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.1</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- Test --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.7</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><artifactId>maven-eclipse-plugin</artifactId><version>2.9</version><configuration><additionalProjectnatures><projectnature>org.springframework.ide.eclipse.core.springnature</projectnature></additionalProjectnatures><additionalBuildcommands><buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand></additionalBuildcommands><downloadSources>true</downloadSources><downloadJavadocs>true</downloadJavadocs></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>1.6</source><target>1.6</target><compilerArgument>-Xlint:all</compilerArgument><showWarnings>true</showWarnings><showDeprecation>true</showDeprecation></configuration></plugin><plugin><groupId>org.codehaus.mojo</groupId><artifactId>exec-maven-plugin</artifactId><version>1.2.1</version><configuration><mainClass>org.test.int1.Main</mainClass></configuration></plugin></plugins><finalName>${project.artifactId}</finalName></build>
</project>

当我创建Spring MVC项目时,STS(Spring Tool Suite)包含了上面的一些依赖项。上面的重要依赖项是spring-contextspring-webmvcspring-txhibernate-corehibernate-entitymanagerspring-orm。我使用Apache Commons DBCP进行连接池,但在现实生活中,很可能你有容器完成的连接池,我们需要的只是提供要使用的JNDI参考细节。

 

注意:我注意到有些读者遇到了数据库连接问题。请注意,在我的pom.xml中,没有数据库驱动程序。这对我有用,因为我在tomcat lib目录中有MySQL驱动程序,并且配置了一些DataSource连接。对于任何与数据库连接相关的问题,要么将数据库驱动程序放在容器lib中,要么将其包含在pom.xml依赖项中。

部署描述符

我们需要在我们的Web应用程序中插入spring框架,这是通过将Spring框架配置DispatcherServlet为前端控制器来完成的。我们的web.xml文件如下所示。


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!-- The definition of the Root Spring Container shared by all Servlets and Filters --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/root-context.xml</param-value></context-param><!-- Creates the Spring Container shared by all Servlets and Filters --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Processes application requests --><servlet><servlet-name>appServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>appServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>

大部分是样板代码,最重要的部分是弹簧上下文文件位置,我们将配置我们的spring bean和服务。如果需要,您可以根据项目要求进行更改。

Hibernate Entity Bean

我们在实体bean类中使用JPA注释,但是,我们也可以在XML文件中使用简单的java bean和映射详细信息。在这种情况下,我们需要在Spring bean配置中配置Hibernate SessionFactory时提供映射文件详细信息。


package com.journaldev.spring.model;import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;/*** Entity bean with JPA annotations* Hibernate provides JPA implementation* @author pankaj**/
@Entity
@Table(name="PERSON")
public class Person {@Id@Column(name="id")@GeneratedValue(strategy=GenerationType.IDENTITY)private int id;private String name;private String country;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}@Overridepublic String toString(){return "id="+id+", name="+name+", country="+country;}
}

我们的实体bean映射到MySQL数据库中的PERSON表,注意我没有注释带有注释的“name”和“country”字段,@Column因为它们具有相同的名称。SQL脚本下方显示了表格详细信息。


CREATE TABLE `Person` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL DEFAULT '',`country` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

Hibernate DAO实现

我们将创建PersonDAO接口来声明我们将在项目中使用的方法。接下来,我们将为它提供hibernate特定的实现。


package com.journaldev.spring.dao;import java.util.List;import com.journaldev.spring.model.Person;public interface PersonDAO {public void addPerson(Person p);public void updatePerson(Person p);public List<Person> listPersons();public Person getPersonById(int id);public void removePerson(int id);
}

特定于Hibernate的DAO实现如下所示。


package com.journaldev.spring.dao;import java.util.List;import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;import com.journaldev.spring.model.Person;@Repository
public class PersonDAOImpl implements PersonDAO {private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class);private SessionFactory sessionFactory;public void setSessionFactory(SessionFactory sf){this.sessionFactory = sf;}@Overridepublic void addPerson(Person p) {Session session = this.sessionFactory.getCurrentSession();session.persist(p);logger.info("Person saved successfully, Person Details="+p);}@Overridepublic void updatePerson(Person p) {Session session = this.sessionFactory.getCurrentSession();session.update(p);logger.info("Person updated successfully, Person Details="+p);}@SuppressWarnings("unchecked")@Overridepublic List<Person> listPersons() {Session session = this.sessionFactory.getCurrentSession();List<Person> personsList = session.createQuery("from Person").list();for(Person p : personsList){logger.info("Person List::"+p);}return personsList;}@Overridepublic Person getPersonById(int id) {Session session = this.sessionFactory.getCurrentSession();		Person p = (Person) session.load(Person.class, new Integer(id));logger.info("Person loaded successfully, Person details="+p);return p;}@Overridepublic void removePerson(int id) {Session session = this.sessionFactory.getCurrentSession();Person p = (Person) session.load(Person.class, new Integer(id));if(null != p){session.delete(p);}logger.info("Person deleted successfully, person details="+p);}}

请注意,我没有使用Hibernate Transaction,因为它将由Spring框架处理。

 

Spring 服务类

以下是我们的服务类,它们使用Hibernate DAO类来处理Person对象。


package com.journaldev.spring.service;import java.util.List;import com.journaldev.spring.model.Person;public interface PersonService {public void addPerson(Person p);public void updatePerson(Person p);public List<Person> listPersons();public Person getPersonById(int id);public void removePerson(int id);}

package com.journaldev.spring.service;import java.util.List;import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;import com.journaldev.spring.dao.PersonDAO;
import com.journaldev.spring.model.Person;@Service
public class PersonServiceImpl implements PersonService {private PersonDAO personDAO;public void setPersonDAO(PersonDAO personDAO) {this.personDAO = personDAO;}@Override@Transactionalpublic void addPerson(Person p) {this.personDAO.addPerson(p);}@Override@Transactionalpublic void updatePerson(Person p) {this.personDAO.updatePerson(p);}@Override@Transactionalpublic List<Person> listPersons() {return this.personDAO.listPersons();}@Override@Transactionalpublic Person getPersonById(int id) {return this.personDAO.getPersonById(id);}@Override@Transactionalpublic void removePerson(int id) {this.personDAO.removePerson(id);}}

请注意,使用@Transactional注释应用了spring声明式事务管理。

 

Spring控制器类

我们的DAO和Service类已准备就绪,是时候编写我们的控制器类来处理客户端请求并使用服务类来执行特定于数据库的操作,然后返回视图页面。


package com.journaldev.spring;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;import com.journaldev.spring.model.Person;
import com.journaldev.spring.service.PersonService;@Controller
public class PersonController {private PersonService personService;@Autowired(required=true)@Qualifier(value="personService")public void setPersonService(PersonService ps){this.personService = ps;}@RequestMapping(value = "/persons", method = RequestMethod.GET)public String listPersons(Model model) {model.addAttribute("person", new Person());model.addAttribute("listPersons", this.personService.listPersons());return "person";}//For add and update person both@RequestMapping(value= "/person/add", method = RequestMethod.POST)public String addPerson(@ModelAttribute("person") Person p){if(p.getId() == 0){//new person, add itthis.personService.addPerson(p);}else{//existing person, call updatethis.personService.updatePerson(p);}return "redirect:/persons";}@RequestMapping("/remove/{id}")public String removePerson(@PathVariable("id") int id){this.personService.removePerson(id);return "redirect:/persons";}@RequestMapping("/edit/{id}")public String editPerson(@PathVariable("id") int id, Model model){model.addAttribute("person", this.personService.getPersonById(id));model.addAttribute("listPersons", this.personService.listPersons());return "person";}}

请注意,我正在使用@Controller注释,因此Spring框架会将其视为Controller类来处理客户端请求。我也在使用@Autowired@Qualifier注释注入PersonService,我们也可以在spring上下文xml文件中完成它。

推荐阅读:Spring Bean Autowiring

Spring Bean配置

我们的服务已准备就绪,我们所需要的只是通过spring bean配置连接它们。我们的root-context.xml文件为空,因此我们只查看servlet-context.xml文件。


<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd"><!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --><!-- Enables the Spring MVC @Controller programming model --><annotation-driven /><!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory --><resources mapping="/resources/**" location="/resources/" /><!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --><beans:beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><beans:property name="prefix" value="/WEB-INF/views/" /><beans:property name="suffix" value=".jsp" /></beans:bean><beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><beans:property name="driverClassName" value="com.mysql.jdbc.Driver" /><beans:property name="url"value="jdbc:mysql://localhost:3306/TestDB" /><beans:property name="username" value="pankaj" /><beans:property name="password" value="pankaj123" /></beans:bean><!-- Hibernate 4 SessionFactory Bean definition --><beans:bean id="hibernate4AnnotatedSessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><beans:property name="dataSource" ref="dataSource" /><beans:property name="annotatedClasses"><beans:list><beans:value>com.journaldev.spring.model.Person</beans:value></beans:list></beans:property><beans:property name="hibernateProperties"><beans:props><beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop><beans:prop key="hibernate.show_sql">true</beans:prop></beans:props></beans:property></beans:bean><beans:bean id="personDAO" class="com.journaldev.spring.dao.PersonDAOImpl"><beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" /></beans:bean><beans:bean id="personService" class="com.journaldev.spring.service.PersonServiceImpl"><beans:property name="personDAO" ref="personDAO"></beans:property></beans:bean><context:component-scan base-package="com.journaldev.spring" /><tx:annotation-driven transaction-manager="transactionManager"/><beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"><beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" /></beans:bean></beans:beans>

dataSource bean是为org.apache.commons.dbcp.BasicDataSource类的基本连接池定义的。

org.springframework.orm.hibernate4.LocalSessionFactoryBeanbean用于Hibernate 4 SessionFactory。对于Hibernate 3,你会发现类似的org.springframework.orm.hibernate3.LocalSessionFactoryBeanorg.springframework.orm.hibernate3.AnnotationSessionFactoryBean

重要的一点是,当我们依赖Spring框架进行Hibernate会话管理时,我们不应该定义hibernate.current_session_context_class,否则,您将获得大量与会话事务相关的问题。

personDAOpersonService bean是自我理解的。

org.springframework.orm.hibernate4.HibernateTransactionManagerSpring ORM需要transactionManager bean定义来支持hibernate会话事务管理。对于Hibernate 3,你会发现类似的类org.springframework.orm.hibernate3.HibernateTransactionManager。Spring使用AOP进行事务管理,现在可以将其与@Transactional注释相关联。

推荐阅读:Spring AOP和Spring Transaction Management

 

查看页面

我们应用程序的最后一部分是视图页面,注意在Controller处理程序方法中添加到Model的属性,我们将使用它们来创建我们的视图页面。我们还将使用JSTL标签,弹簧芯和弹簧形式标签。


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
<%@ page session="false" %>
<html>
<head><title>Person Page</title><style type="text/css">.tg  {border-collapse:collapse;border-spacing:0;border-color:#ccc;}.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#fff;}.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;border-color:#ccc;color:#333;background-color:#f0f0f0;}.tg .tg-4eph{background-color:#f9f9f9}</style>
</head>
<body>
<h1>Add a Person
</h1><c:url var="addAction" value="/person/add" ></c:url><form:form action="${addAction}" commandName="person">
<table><c:if test="${!empty person.name}"><tr><td><form:label path="id"><spring:message text="ID"/></form:label></td><td><form:input path="id" readonly="true" size="8"  disabled="true" /><form:hidden path="id" /></td> </tr></c:if><tr><td><form:label path="name"><spring:message text="Name"/></form:label></td><td><form:input path="name" /></td> </tr><tr><td><form:label path="country"><spring:message text="Country"/></form:label></td><td><form:input path="country" /></td></tr><tr><td colspan="2"><c:if test="${!empty person.name}"><input type="submit"value="<spring:message text="Edit Person"/>" /></c:if><c:if test="${empty person.name}"><input type="submit"value="<spring:message text="Add Person"/>" /></c:if></td></tr>
</table>	
</form:form>
<br>
<h3>Persons List</h3>
<c:if test="${!empty listPersons}"><table class="tg"><tr><th width="80">Person ID</th><th width="120">Person Name</th><th width="120">Person Country</th><th width="60">Edit</th><th width="60">Delete</th></tr><c:forEach items="${listPersons}" var="person"><tr><td>${person.id}</td><td>${person.name}</td><td>${person.country}</td><td><a href="<c:url value='/edit/${person.id}' />" >Edit</a></td><td><a href="<c:url value='/remove/${person.id}' />" >Delete</a></td></tr></c:forEach></table>
</c:if>
</body>
</html>

Spring MVC Hibernate应用程序测试

只需构建项目并将其部署到您选择的任何servlet容器中,例如Tomcat。下面的屏幕截图显示了我们应用程序的视图页面。

Spring MVC Hibernate

Java Spring MVC Hibernate MySQL

您还可以在服务器日志文件中找到类似的日志。


Hibernate: insert into PERSON (country, name) values (?, ?)
INFO : com.journaldev.spring.dao.PersonDAOImpl - Person saved successfully, Person Details=id=15, name=Pankaj, country=USA
Hibernate: select person0_.id as id1_0_, person0_.country as country2_0_, person0_.name as name3_0_ from PERSON person0_
INFO : com.journaldev.spring.dao.PersonDAOImpl - Person List::id=10, name=Raman, country=UK2
INFO : com.journaldev.spring.dao.PersonDAOImpl - Person List::id=11, name=Lisa, country=France
INFO : com.journaldev.spring.dao.PersonDAOImpl - Person List::id=15, name=Pankaj, country=USA

 

摘要

本教程旨在为您提供有关Spring MVC和Hibernate集成入门的足够详细信息,我希望您会发现它很有用。您可以从下面的链接下载最终项目并使用它。

下载Spring MVC Hibernate集成项目

 

转载来源:https://www.journaldev.com/3531/spring-mvc-hibernate-mysql-integration-crud-example-tutorial

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/1/4022.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息