Spring 4和Hibernate 4集成教程第1部分:XML配置

在企业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 Hibernate 4 Integration Tutorial Part 1: XML Configuration

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值