在企业Java应用程序开发中,也许Spring和Hibernate集成是大多数程序员正在寻找和面对的最需要的主题之一。 Spring是领先的企业应用程序框架,Hibernate是领先的ORM框架,所以这两者的组合将是开发强大的企业应用程序的首选。
这是一个分步教程,可以帮助您以清晰简洁的方式轻松构建Spring-Hibernate应用程序。在第一部分中,我们演示如何编写一个简单的Spring MVC应用程序,该应用程序显示MySQL数据库中的用户列表。 DAO实现使用Hibernate的SessionFactory来查询数据库,而不是使用JdbcTemplate。
在演示应用中使用以下配置方法:
- Spring MVC:controller注释和XML定义bean。
- Hibernate:模型类的XML映射。
- Web Application:使用
web.xml
部署描述符文件。
在本教程中使用以下技术和软件:
- Java 7
- Spring framework 4.0.3.RELEASED
- Hibernate ORM 4.3.5.Final
- Spring Tool Suite IDE 3.5.1
- Maven 3
- Tomcat 7
1.Spring如何集成Hibernate
基本上,为了支持Hibernate集成,在org.springframework.orm.hibernate4
包中,Spring提供了两个关键bean:
- LocalSessionFactoryBean:创建一个Hibernate的SessionFactory,它被注入到基于Hibernate的DAO类中。
- HibernateTransactionManager:为SessionFactory提供事务支持代码。 程序员可以在DAO方法中使用@Transactional注释,来避免编写明确的事务模版代码。
2.建立项目
让我们使用Spring Tool Suite IDE创建一个Spring MVC项目(参见例子:Spring MVC beginner tutorial with Spring Tool Suite IDE),将其命名为SpringMvcHibernateXML。
创建数据库
执行以下MySQL脚本以创建含表名为users的数据库usersdb:
create database usersdb;
CREATE TABLE `users` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) NOT NULL,
`password` varchar(45) NOT NULL,
`email` varchar(45) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1
记住要插入一些虚拟数据来进行测试。
项目结构
以下屏幕截图显示了项目的最终结构:
注意:完成本教程后,您将创建一个如上所述的项目结构。
Maven依赖关系
声明Java和Spring框架的版本:
<properties>
<java-version>1.7</java-version>
<org.springframework-version>4.0.3.RELEASE</org.springframework-version>
</properties>
更新pom.xml文件以获得以下依赖关系:
- Spring框架依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
- Hibernate ORM框架依赖:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.5.Final</version>
</dependency>
- Java Servlet和JSP依赖关系(仅用于编译):
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
- JSTL依赖:
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
- Apache Commons DBCP依赖(用于数据库连接池):
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.0</version>
</dependency>
- MySQL Connector Java依赖(MySQL的JDBC驱动程序):
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
注意:您可以在附件项目中查看pom.xml
文件的全部内容。
本书: Getting started with Spring Framework帮助您掌握所有主要概念,如Spring核心模块,依赖注入,Spring AOP,注释驱动开发等。
3.编写模型类并配置Hibernate映射
编写模型类
在包net.codejava.spring.model
中创建一个名为User.java
的新类,其中包含以下源代码:
package net.codejava.spring.model;
public class User {
private int id;
private String username;
private String password;
private String email;
// getters and setters are removed for brevity
}
该模型类用于将表用户和数据库映射到普通的Java对象(POJO)。
为模型类创建Hibernate XML映射
我们需要创建一个Hibernate XML映射文件,将User
类映射到数据库中的users
表。 使用以下XML代码创建与User
类相同的包下的User.hbm.xml
文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="net.codejava.spring.model">
<class name="User" table="USERS">
<id name="id" column="USER_ID">
<generator class="native"/>
</id>
<property name="username" column="USERNAME" />
<property name="password" column="PASSWORD" />
<property name="email" column="EMAIL" />
</class>
</hibernate-mapping>
注意:有关Hibernate XML映射的更多信息,请参阅:Hibernate One-to-Many XML Mapping Example。
创建Hibernate XML配置文件
在classpath的根目录(在项目的src目录下)中创建hibernate.cfg.xml
文件,并使用以下XML代码:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<mapping resource="net/codejava/spring/model/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
此Hibernate配置文件声明需要映射哪些资源(在本例中为User.hbm.xml
文件)。
4.编写DAO类
编写UserDAO界面
为User
类创建一个非常简单的DAO接口,如下面的UserDAO.java
类:
package net.codejava.spring.dao;
import java.util.List;
import net.codejava.spring.model.User;
public interface UserDAO {
public List<User> list();
}
该接口只声明一个从数据库中检索所有用户的list()
方法。
编写UserDAO实现
下面是我们对UserDAO
接口的一个实现代码,UserDAOImpl
类如下:
package net.codejava.spring.dao;
import java.util.List;
import net.codejava.spring.model.User;
import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;
public class UserDAOImpl implements UserDAO {
private SessionFactory sessionFactory;
public UserDAOImpl(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
@Transactional
public List<User> list() {
@SuppressWarnings("unchecked")
List<User> listUser = (List<User>) sessionFactory.getCurrentSession().createCriteria(User.class).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
return listUser;
}
}
注意在这个类中,Hibernate的SessionFactory
对象是通过Spring的构造函数来注入的。 list()
方法只是从SessionFactory
获取当前会话,并查询数据库中所有用户的列表。
注意Spring提供的@Transactional
注释 - 当一个方法被这个注释注释时,Spring会将事务支持代码注入到方法中 - 因此我们无需两次编写任何代码来明确处理事务。
本书:Spring in Action可帮助您了解Spring MVC,REST,Security,Web Flow等最新功能,工具和实践。
5.配置Spring应用程序上下文
现在,我们来到最重要的部分,通过一些XML配置连接Spring和Hibernate。 打开src/main/webapp/WEB-INF/spring/appServlet
下的servlet-context.xml
文件,并按如下所示更新其内容。
配置Spring MVC视图解析器
像往常一样,为Spring MVC注释添加以下声明驱动方法:
<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />
<context:component-scan base-package="net.codejava.spring" />
用于将逻辑视图名称转换为实际JSP页面的公共视图解析器的以下声明:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>
配置DataSource Bean
我们使用Apache Commons DBCP作为具有连接池功能的数据源:
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/usersdb"/>
<property name="username" value="root"/>
<property name="password" value="secret"/>
</bean>
注意:根据您的环境中的值更改数据库URL,用户名和密码。 该数据源将被注入到下面的SessionFactory
bean中。
配置SessionFactory Bean
Spring 4通过LocalSessionFactoryBean
提供对Hibernate 4的SessionFactory
的支持,该实例是一个FactoryBean
,它创建一个Hibernate的SessionFactory
,然后将其注入到基于Hibernate的DAO bean中。 这是bean声明:
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
请注意,此LocalSessionFactoryBean
需要先前声明的DataSource
bean。 configLocation
属性指定将搜索Hibernate配置文件的位置。 在这种情况下,它是类路径中的hibernate.cfg.xml
文件。
配置TransactionManager Bean
以下声明用于SessionFactory
的自动事务支持:
<tx:annotation-driven />
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
如UserDAOImpl
类中所述,我们可以通过使用@Transactional
注释来指定事务支持,用于事务感知方法。
配置DAO Bean
最后,我们的UserDAOImpl
bean的配置很简单:
<bean id="userDao" class="net.codejava.spring.dao.UserDAOImpl">
<constructor-arg>
<ref bean="sessionFactory" />
</constructor-arg>
</bean>
然后将该bean注入到下面描述的Spring MVC控制器类中。
注意:有关Spring应用程序上下文配置文件的全部内容,请参阅附件项目中的相应文件。
6.编码控制器类
在我们的Spring MVC控制器类(HomeController.java
)的net.codejava.spring
包下编写以下代码:
package net.codejava.spring;
import java.util.List;
import net.codejava.spring.dao.UserDAO;
import net.codejava.spring.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* Handles requests for the application home page.
*/
@Controller
public class HomeController {
@Autowired
private UserDAO userDao;
@RequestMapping(value="/")
public ModelAndView home() {
List<User> listUsers = userDao.list();
ModelAndView model = new ModelAndView("home");
model.addObject("userList", listUsers);
return model;
}
}
在这里,由Spring自动注入UserDAO
的实现(因为使用了@Autowired
注释)。 记住我们之前在Spring应用程序上下文配置文件中声明的UserDAOImpl
bean吗? 它自动注入该控制器,以便处理方法home()
可以使用它来列出数据库中的所有用户。 最后,home()
方法返回一个名为home的视图,该视图解析了下面描述的一个实际的JSP页面。
7.编写查看页面
在src/main/webapp/WEB-INF/views
目录下创建一个home.jsp
,具有以下内容:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Home</title>
</head>
<body>
<div align="center">
<h1>Contact List</h1>
<table border="1">
<th>No</th>
<th>Username</th>
<th>Email</th>
<c:forEach var="user" items="${userList}" varStatus="status">
<tr>
<td>${status.index + 1}</td>
<td>${user.username}</td>
<td>${user.email}</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
该JSP页面仅显示控制器传递的用户列表,使用JSTL标记。
本书:Spring in Practice涵盖了66种Spring开发技术,可帮助您解决使用Spring框架时遇到的实际问题。
8.测试应用程序
在Tomcat服务器上部署SpringMvcHibernateXML应用程序并通过以下URL访问其默认页面:
http://localhost:8080/SpringMvcHibernateXML
如果一切正常,您会看到以下结果:
恭喜! 您已经完成了Spring-Hibernate Integration系列的第一部分。 您可以下载本项目的源代码并进行实践。 还提供了可部署的WAR包,方便您使用。
参见第2部分:Spring 4 and Hibernate 4 Integration Tutorial Part 2: Java-based Configuration
相关教程:
- Spring 4 and Struts 2 Integration Tutorial Part 1: XML Configuration
- Spring 4 and Struts 2 Integration Tutorial Part 2: Java-Based and Annotations
- Struts 2 - Spring 4 - Hibernate 4 Integration Tutorial Part 1 - XML Configuration
- Struts 2 - Spring 4 - Hibernate 4 Integration Tutorial Part 2 - Java-Based and Annotations
您可能也有兴趣:
- Understanding the core of Spring framework
- Spring MVC beginner tutorial with Spring Tool Suite IDE
- Getting Started With Hibernate Annotations
参考文献:
源代码
- SpringMvcHibernateXML.war [Deploy-read WAR]
- SpringMvcHibernateXML.zip [Eclipse-Maven Project]
- SpringMvcHibernateXML [GitHub IDEA-Maven Project]
原文传送门
Spring 4 and Hibernate 4 Integration Tutorial Part 1: XML Configuration