您的位置:首页 > 编程语言 > Java开发

springMVC系列之(四) spring+springMVC+hibernate 三大框架整合

2015-05-11 16:18 176 查看
首先我们要知道Hibernate五大对象:,本实例通过深入的使用这五大对象和spring+springMVC相互结合,体会到框架的好处,提高我们的开发效率

Hibernate有五大核心接口,分别是:Session
Transaction Query SessionFactoryConfiguration 。这五个接口构成了Hibernate运行的基本要素,可以执行存取,持久化,事务管理等操作。这五个接口可以位于系统的业务逻辑层和持久化层。下面是一张Hibernate的关系图:




Session接口:

Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session 的开销太大,会给系统带来不良影响。但是Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。
session可以看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相关的操作, 诸如存储持久对象至数据库,以及从数据库从获得它们。需要注意的是,Hibernate的session不同于JSP
应用中的HttpSession。当我们使用session这个术语时,我们指的Hibernate 中的session,而我们以后会将HttpSesion 对象称为用户session。


SessionFactory接口:

SessionFactroy接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。


Transaction接口

Transaction接口负责事务相关的操作,一般在Hibernate的增删改中出现,但是使用Hibernate的人一般使用Spring去管理事务。


Query接口

Query负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。它的返回值一般是List。需要自己转换。


Configuration接口:

Configuration对象用于配置并根启动Hibernate。Hibernate应用通过Configuration实例来指定对象—关系映射文件的位置或者动态配置Hibernate的属性,然后创建SessionFactory实例。我们可以查看Configuration的源代码,它的configure()方法是这样实现的:

了解了这五大对象之后,,以上博客我们配置好了spring+springMVC的环境,现在我们继续集成hibernate的相关配置,框架图如下:



第一步:引入相关的包

(对于每个包,我们要有意识的去了解其功能,这样今后的时候项目中报错之后我们也可以及时知道错误出在哪里?)



第二: 继续配置hibernatexml文件( springAnnotation-hibernate.xml)

[html] view
plaincopy

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [

<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">

]>

<beans>

<!-- 配置hibernate相关数据库的操作 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<!-- 数据库的驱动 -->

<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

<!-- 数据库的Id,用户名与密码 -->

<property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>

<property name="username" value="lishehe"/>

<property name="password" value="lishehe"/>

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="hibernateProperties">

<props>

<!-- 配置不同数据库的方言 -->

<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>

<!-- 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".

其它几个参数的意思,我解释一下:

validate 加载hibernate时,验证创建数据库表结构

create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。

create-drop 加载hibernate时创建,退出是删除表结构

update 加载hibernate自动更新数据库结构 -->

<prop key="hibernate.hbm2ddl.auto">update</prop>

<!-- 是否显示sql语句 -->

<prop key="hibernate.show_sql">true</prop>

<prop key="hiberante.format_sql">true</prop>

</props>

</property>

<property name="configLocations">

<list>

<value>

<!-- 读取和实体相关的xml -->

classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml

</value>

</list>

</property>

</bean>

<!-- 定义事务管理器(声明式的事务) -->

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">

<!-- 配置事务管理器 -->

<property name="transactionManager" ref="transactionManager"></property>

<!-- 配置事务管理器 -->

<property name="transactionAttributes">

<props>

<!-- 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。

首先就是配置事务的传播特性,如下: -->

<!-- 配置事务传播特性 -->

<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="get*">PROPAGATION_NEVER</prop>

</props>

</property>

</bean>

</beans>

[html] view
plaincopy





<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [

<!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">

]>

<beans>

<!-- 配置hibernate相关数据库的操作 -->

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<!-- 数据库的驱动 -->

<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>

<!-- 数据库的Id,用户名与密码 -->

<property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>

<property name="username" value="lishehe"/>

<property name="password" value="lishehe"/>

</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource"/>

<property name="hibernateProperties">

<props>

<!-- 配置不同数据库的方言 -->

<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>

<!-- 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".

其它几个参数的意思,我解释一下:

validate 加载hibernate时,验证创建数据库表结构

create 每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。

create-drop 加载hibernate时创建,退出是删除表结构

update 加载hibernate自动更新数据库结构 -->

<prop key="hibernate.hbm2ddl.auto">update</prop>

<!-- 是否显示sql语句 -->

<prop key="hibernate.show_sql">true</prop>

<prop key="hiberante.format_sql">true</prop>

</props>

</property>

<property name="configLocations">

<list>

<value>

<!-- 读取和实体相关的xml -->

classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml

</value>

</list>

</property>

</bean>

<!-- 定义事务管理器(声明式的事务) -->

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

<bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">

<!-- 配置事务管理器 -->

<property name="transactionManager" ref="transactionManager"></property>

<!-- 配置事务管理器 -->

<property name="transactionAttributes">

<props>

<!-- 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。

首先就是配置事务的传播特性,如下: -->

<!-- 配置事务传播特性 -->

<prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>

<prop key="get*">PROPAGATION_NEVER</prop>

</props>

</property>

</bean>

</beans>

第三: 新建IUserDAO

[java] view
plaincopy

package com.tgb.web.controller.dao;

import java.util.List;

import com.tgb.web.controller.entity.User;

public interface IUserDAO {

public void addUser(User user);

public List<User> getAllUser();

public boolean delUser(String id);

public User getUser(String id);

public boolean updateUser(User user);

}

[java] view
plaincopy





package com.tgb.web.controller.dao;

import java.util.List;

import com.tgb.web.controller.entity.User;

public interface IUserDAO {

public void addUser(User user);

public List<User> getAllUser();

public boolean delUser(String id);

public User getUser(String id);

public boolean updateUser(User user);

}

实现类UserDAo

[java] view
plaincopy

package com.tgb.web.controller.dao;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.SessionFactory;

import com.tgb.web.controller.entity.User;

public class UserDAO implements IUserDAO {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;

}

@Override

public void addUser(User user) {//添加用户

sessionFactory.getCurrentSession().save(user);

}

@Override

public List<User> getAllUser() {//查找所有用户信息

String hql = "from User";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

return query.list();

}

@Override

public boolean delUser(String id) {//删除用户

String hql = "delete User u where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

query.setString(0, id);

return (query.executeUpdate() > 0);

}

@Override

public User getUser(String id) {//根据id得到单个用户

String hql = "from User u where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);//此时使用的是hql语句

query.setString(0, id);

return (User) query.uniqueResult();

}

@Override

public boolean updateUser(User user) {//修改用户信息,hql语句

String hql = "update User u set u.userName=?,u.age=? where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

query.setString(0, user.getUserName());

query.setString(1, user.getAge());

query.setString(2, user.getId());

return (query.executeUpdate() > 0);

}

}

[java] view
plaincopy





package com.tgb.web.controller.dao;

import java.util.List;

import org.hibernate.Query;

import org.hibernate.SessionFactory;

import com.tgb.web.controller.entity.User;

public class UserDAO implements IUserDAO {

private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {

this.sessionFactory = sessionFactory;

}

@Override

public void addUser(User user) {//添加用户

sessionFactory.getCurrentSession().save(user);

}

@Override

public List<User> getAllUser() {//查找所有用户信息

String hql = "from User";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

return query.list();

}

@Override

public boolean delUser(String id) {//删除用户

String hql = "delete User u where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

query.setString(0, id);

return (query.executeUpdate() > 0);

}

@Override

public User getUser(String id) {//根据id得到单个用户

String hql = "from User u where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);//此时使用的是hql语句

query.setString(0, id);

return (User) query.uniqueResult();

}

@Override

public boolean updateUser(User user) {//修改用户信息,hql语句

String hql = "update User u set u.userName=?,u.age=? where u.id=?";

Query query = sessionFactory.getCurrentSession().createQuery(hql);

query.setString(0, user.getUserName());

query.setString(1, user.getAge());

query.setString(2, user.getId());

return (query.executeUpdate() > 0);

}

}

第四: 新建实体User

[java] view
plaincopy

package com.tgb.web.controller.entity;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity

@Table(name="T_USER")

public class User {

@Id

@GeneratedValue(generator = "system-uuid") //使用uuid生成主键的方式

@GenericGenerator(name = "system-uuid", strategy = "uuid")

@Column(length=32)

private String id;

@Column(length=32)

private String userName;

@Column(length=32)

private String age;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

}

[java] view
plaincopy





package com.tgb.web.controller.entity;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

import javax.persistence.Table;

import org.hibernate.annotations.GenericGenerator;

@Entity

@Table(name="T_USER")

public class User {

@Id

@GeneratedValue(generator = "system-uuid") //使用uuid生成主键的方式

@GenericGenerator(name = "system-uuid", strategy = "uuid")

@Column(length=32)

private String id;

@Column(length=32)

private String userName;

@Column(length=32)

private String age;

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getAge() {

return age;

}

public void setAge(String age) {

this.age = age;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

}

通常是 hibernate.cfg.xml)中声明持久性类 hibernate.cfg.test.xml

[html] view
plaincopy

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<!-- (通常是 hibernate.cfg.xml)中声明持久性类: -->

<hibernate-configuration>

<session-factory>

<mapping class="com.tgb.web.controller.entity.User"/>

</session-factory>

</hibernate-configuration>

[html] view
plaincopy





<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<!-- (通常是 hibernate.cfg.xml)中声明持久性类: -->

<hibernate-configuration>

<session-factory>

<mapping class="com.tgb.web.controller.entity.User"/>

</session-factory>

</hibernate-configuration>

第五 : IUserManager

[java] view
plaincopy

package com.tgb.web.controller.service;

import java.util.List;

import com.tgb.web.controller.entity.User;

public interface IUserManager {

public void addUser(User user);

public List<User> getAllUser();

public boolean delUser(String id);

public User getUser(String id);

public boolean updateUser(User user);

}

[java] view
plaincopy





package com.tgb.web.controller.service;

import java.util.List;

import com.tgb.web.controller.entity.User;

public interface IUserManager {

public void addUser(User user);

public List<User> getAllUser();

public boolean delUser(String id);

public User getUser(String id);

public boolean updateUser(User user);

}

UserManager实现类

[java] view
plaincopy

package com.tgb.web.controller.service;

import java.util.List;

import com.tgb.web.controller.dao.IUserDAO;

import com.tgb.web.controller.entity.User;

public class UserManager implements IUserManager {

private IUserDAO userDao;

public void setUserDao(IUserDAO userDao) {

this.userDao = userDao;

}

@Override

public void addUser(User user) {

userDao.addUser(user);

}

@Override

public List<User> getAllUser() {

return userDao.getAllUser();

}

@Override

public boolean delUser(String id) {

return userDao.delUser(id);

}

@Override

public User getUser(String id) {

return userDao.getUser(id);

}

@Override

public boolean updateUser(User user) {

return userDao.updateUser(user);

}

}

[java] view
plaincopy





package com.tgb.web.controller.service;

import java.util.List;

import com.tgb.web.controller.dao.IUserDAO;

import com.tgb.web.controller.entity.User;

public class UserManager implements IUserManager {

private IUserDAO userDao;

public void setUserDao(IUserDAO userDao) {

this.userDao = userDao;

}

@Override

public void addUser(User user) {

userDao.addUser(user);

}

@Override

public List<User> getAllUser() {

return userDao.getAllUser();

}

@Override

public boolean delUser(String id) {

return userDao.delUser(id);

}

@Override

public User getUser(String id) {

return userDao.getUser(id);

}

@Override

public boolean updateUser(User user) {

return userDao.updateUser(user);

}

}

第六 UserController,控制类

[java] view
plaincopy

package com.tgb.web.controller;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.tgb.web.controller.entity.User;

import com.tgb.web.controller.service.IUserManager;

@Controller

@RequestMapping("/user")

public class UserController {

@Resource(name="userManager")// 获取spring配置文件中bean的id为userManager的,并注入

private IUserManager userManager;

@RequestMapping("/toAddUser")

public String toAddUser(){

return "/addUser";

}

@RequestMapping("/addUser")// 请求url地址映射,类似Struts的action-mapping

public String addUser(User user){

userManager.addUser(user);

return "redirect:/user/getAllUser";

}

@RequestMapping("/getAllUser")

public String getAllUser(HttpServletRequest request){

List<User> user = userManager.getAllUser();

request.setAttribute("user", user);

return "/userManager";

}

@RequestMapping("/delUser")

public void delUser(String id,HttpServletResponse response){

String result = "{\"result\":\"error\"}";

if(userManager.delUser(id)){

result = "{\"result\":\"success\"}";

}

PrintWriter out = null;

response.setContentType("application/json");

try {

out = response.getWriter();

out.write(result);

} catch (IOException e) {

e.printStackTrace();

}

}

@RequestMapping("/getUser")

public String getUser(String id,HttpServletRequest request){

User user = userManager.getUser(id);

request.setAttribute("user", user);

return "/editUser";

}

@RequestMapping("/updateUser")

public String updateUser(User user,HttpServletRequest request){

if(userManager.updateUser(user)){

user = userManager.getUser(user.getId());

request.setAttribute("user", user);

return "/editUser";

}else{

return "/error";

}

}

}

[java] view
plaincopy





package com.tgb.web.controller;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.List;

import javax.annotation.Resource;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import com.tgb.web.controller.entity.User;

import com.tgb.web.controller.service.IUserManager;

@Controller

@RequestMapping("/user")

public class UserController {

@Resource(name="userManager")// 获取spring配置文件中bean的id为userManager的,并注入

private IUserManager userManager;

@RequestMapping("/toAddUser")

public String toAddUser(){

return "/addUser";

}

@RequestMapping("/addUser")// 请求url地址映射,类似Struts的action-mapping

public String addUser(User user){

userManager.addUser(user);

return "redirect:/user/getAllUser";

}

@RequestMapping("/getAllUser")

public String getAllUser(HttpServletRequest request){

List<User> user = userManager.getAllUser();

request.setAttribute("user", user);

return "/userManager";

}

@RequestMapping("/delUser")

public void delUser(String id,HttpServletResponse response){

String result = "{\"result\":\"error\"}";

if(userManager.delUser(id)){

result = "{\"result\":\"success\"}";

}

PrintWriter out = null;

response.setContentType("application/json");

try {

out = response.getWriter();

out.write(result);

} catch (IOException e) {

e.printStackTrace();

}

}

@RequestMapping("/getUser")

public String getUser(String id,HttpServletRequest request){

User user = userManager.getUser(id);

request.setAttribute("user", user);

return "/editUser";

}

@RequestMapping("/updateUser")

public String updateUser(User user,HttpServletRequest request){

if(userManager.updateUser(user)){

user = userManager.getUser(user.getId());

request.setAttribute("user", user);

return "/editUser";

}else{

return "/error";

}

}

}

第七:前台页面(详细内容不再详列出,源码分享给大家)



运行效果

:




总结

这个过程虽然简单,但是自己操作的过程中还是出现了很多的问题,解决问题,快速成长,进一步验证了一句话:实践是检验真理的唯一标准!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: