首先我们要知道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)

  1. <span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd" [
  3. <!ENTITY contextInclude SYSTEM "org/springframework/web/context/WEB-INF/contextInclude.xml">
  4. ]>
  5. <beans>
  6. <!-- 配置hibernate相关数据库的操作 -->
  7. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  8. <!-- 数据库的驱动 -->
  9. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
  10. <!-- 数据库的Id,用户名与密码 -->
  11. <property name="url" value="jdbc:oracle:thin:@192.168.24.248:1521:ORCL"/>
  12. <property name="username" value="lishehe"/>
  13. <property name="password" value="lishehe"/>
  14. </bean>
  15. <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  16. <property name="dataSource" ref="dataSource"/>
  17. <property name="hibernateProperties">
  18. <props>
  19. <!-- 配置不同数据库的方言 -->
  20. <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
  21. <!-- 其实这个参数的作用主要用于:自动创建|更新|验证数据库表结构。如果不是此方面的需求建议set value="none".
  22. 其它几个参数的意思,我解释一下:
  23. validate               加载hibernate时,验证创建数据库表结构
  24. create                  每次加载hibernate,重新创建数据库表结构,这就是导致数据库表数据丢失的原因。
  25. create-drop        加载hibernate时创建,退出是删除表结构
  26. update                 加载hibernate自动更新数据库结构 -->
  27. <prop key="hibernate.hbm2ddl.auto">update</prop>
  28. <!-- 是否显示sql语句 -->
  29. <prop key="hibernate.show_sql">true</prop>
  30. <prop key="hiberante.format_sql">true</prop>
  31. </props>
  32. </property>
  33. <property name="configLocations">
  34. <list>
  35. <value>
  36. <!-- 读取和实体相关的xml -->
  37. classpath*:com/tgb/web/controller/hibernate/hibernate.cfg.test.xml
  38. </value>
  39. </list>
  40. </property>
  41. </bean>
  42. <!-- 定义事务管理器(声明式的事务) -->
  43. <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  44. <property name="sessionFactory" ref="sessionFactory"></property>
  45. </bean>
  46. <bean id="transactionBese" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" lazy-init="true" abstract="true">
  47. <!-- 配置事务管理器 -->
  48. <property name="transactionManager" ref="transactionManager"></property>
  49. <!-- 配置事务管理器 -->
  50. <property name="transactionAttributes">
  51. <props>
  52. <!-- 下面就开始配置各个模块所必须的部分,在各自的applicationContext-XXX-beans.xml配置的对于事务管理的详细信息。
  53. 首先就是配置事务的传播特性,如下: -->
  54. <!--  配置事务传播特性 -->
  55. <prop key="add*">PROPAGATION_REQUIRED,-Exception</prop>
  56. <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>
  57. <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
  58. <prop key="modify*">PROPAGATION_REQUIRED,-Exception</prop>
  59. <prop key="delete*">PROPAGATION_REQUIRED,-Exception</prop>
  60. <prop key="get*">PROPAGATION_NEVER</prop>
  61. </props>
  62. </property>
  63. </bean>
  64. </beans>
  65. </span></span></span>

第三:   新建IUserDAO

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
  2. import java.util.List;
  3. import com.tgb.web.controller.entity.User;
  4. public interface IUserDAO {
  5. public void addUser(User user);
  6. public List<User> getAllUser();
  7. public boolean delUser(String id);
  8. public User getUser(String id);
  9. public boolean updateUser(User user);
  10. }
  11. </span></span>

实现类UserDAo

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.dao;
  2. import java.util.List;
  3. import org.hibernate.Query;
  4. import org.hibernate.SessionFactory;
  5. import com.tgb.web.controller.entity.User;
  6. public class UserDAO implements IUserDAO  {
  7. private SessionFactory sessionFactory;
  8. public void setSessionFactory(SessionFactory sessionFactory) {
  9. this.sessionFactory = sessionFactory;
  10. }
  11. @Override
  12. public void addUser(User user) {//添加用户
  13. sessionFactory.getCurrentSession().save(user);
  14. }
  15. @Override
  16. public List<User> getAllUser() {//查找所有用户信息
  17. String hql = "from User";
  18. Query query = sessionFactory.getCurrentSession().createQuery(hql);
  19. return query.list();
  20. }
  21. @Override
  22. public boolean delUser(String id) {//删除用户
  23. String hql = "delete User u where u.id=?";
  24. Query query = sessionFactory.getCurrentSession().createQuery(hql);
  25. query.setString(0, id);
  26. return (query.executeUpdate() > 0);
  27. }
  28. @Override
  29. public User getUser(String id) {//根据id得到单个用户
  30. String hql = "from User u where u.id=?";
  31. Query query = sessionFactory.getCurrentSession().createQuery(hql);//此时使用的是hql语句
  32. query.setString(0, id);
  33. return (User) query.uniqueResult();
  34. }
  35. @Override
  36. public boolean updateUser(User user) {//修改用户信息,hql语句
  37. String hql = "update User u set u.userName=?,u.age=? where u.id=?";
  38. Query query = sessionFactory.getCurrentSession().createQuery(hql);
  39. query.setString(0, user.getUserName());
  40. query.setString(1, user.getAge());
  41. query.setString(2, user.getId());
  42. return (query.executeUpdate() > 0);
  43. }
  44. }
  45. </span></span>

第四:  新建实体User

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.entity;
  2. import javax.persistence.Column;
  3. import javax.persistence.Entity;
  4. import javax.persistence.GeneratedValue;
  5. import javax.persistence.Id;
  6. import javax.persistence.Table;
  7. import org.hibernate.annotations.GenericGenerator;
  8. @Entity
  9. @Table(name="T_USER")
  10. public class User {
  11. @Id
  12. @GeneratedValue(generator = "system-uuid")  //使用uuid生成主键的方式
  13. @GenericGenerator(name = "system-uuid", strategy = "uuid")
  14. @Column(length=32)
  15. private String id;
  16. @Column(length=32)
  17. private String userName;
  18. @Column(length=32)
  19. private String age;
  20. public String getUserName() {
  21. return userName;
  22. }
  23. public void setUserName(String userName) {
  24. this.userName = userName;
  25. }
  26. public String getAge() {
  27. return age;
  28. }
  29. public void setAge(String age) {
  30. this.age = age;
  31. }
  32. public String getId() {
  33. return id;
  34. }
  35. public void setId(String id) {
  36. this.id = id;
  37. }
  38. }
  39. </span></span>

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

  1. <span style="font-size:18px;"><span style="font-size:18px;"><!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  4. <!-- (通常是 hibernate.cfg.xml)中声明持久性类: -->
  5. <hibernate-configuration>
  6. <session-factory>
  7. <mapping class="com.tgb.web.controller.entity.User"/>
  8. </session-factory>
  9. </hibernate-configuration></span></span>

第五 : IUserManager

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
  2. import java.util.List;
  3. import com.tgb.web.controller.entity.User;
  4. public interface IUserManager {
  5. public void addUser(User user);
  6. public List<User> getAllUser();
  7. public boolean delUser(String id);
  8. public User getUser(String id);
  9. public boolean updateUser(User user);
  10. }
  11. </span></span>

UserManager实现类

  1. <span style="font-size:18px;"><span style="font-size:18px;">package com.tgb.web.controller.service;
  2. import java.util.List;
  3. import com.tgb.web.controller.dao.IUserDAO;
  4. import com.tgb.web.controller.entity.User;
  5. public class UserManager implements IUserManager {
  6. private IUserDAO userDao;
  7. public void setUserDao(IUserDAO userDao) {
  8. this.userDao = userDao;
  9. }
  10. @Override
  11. public void addUser(User user) {
  12. userDao.addUser(user);
  13. }
  14. @Override
  15. public List<User> getAllUser() {
  16. return userDao.getAllUser();
  17. }
  18. @Override
  19. public boolean delUser(String id) {
  20. return userDao.delUser(id);
  21. }
  22. @Override
  23. public User getUser(String id) {
  24. return userDao.getUser(id);
  25. }
  26. @Override
  27. public boolean updateUser(User user) {
  28. return userDao.updateUser(user);
  29. }
  30. }
  31. </span></span>

第六   UserController,控制类

  1. <span style="font-size:18px;">package com.tgb.web.controller;
  2. import java.io.IOException;
  3. import java.io.PrintWriter;
  4. import java.util.List;
  5. import javax.annotation.Resource;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import org.springframework.stereotype.Controller;
  9. import org.springframework.web.bind.annotation.RequestMapping;
  10. import com.tgb.web.controller.entity.User;
  11. import com.tgb.web.controller.service.IUserManager;
  12. @Controller
  13. @RequestMapping("/user")
  14. public class UserController {
  15. @Resource(name="userManager")// 获取spring配置文件中bean的id为userManager的,并注入
  16. private IUserManager userManager;
  17. @RequestMapping("/toAddUser")
  18. public String toAddUser(){
  19. return "/addUser";
  20. }
  21. @RequestMapping("/addUser")// 请求url地址映射,类似Struts的action-mapping
  22. public String addUser(User user){
  23. userManager.addUser(user);
  24. return "redirect:/user/getAllUser";
  25. }
  26. @RequestMapping("/getAllUser")
  27. public String getAllUser(HttpServletRequest request){
  28. List<User> user = userManager.getAllUser();
  29. request.setAttribute("user", user);
  30. return "/userManager";
  31. }
  32. @RequestMapping("/delUser")
  33. public void delUser(String id,HttpServletResponse response){
  34. String result = "{\"result\":\"error\"}";
  35. if(userManager.delUser(id)){
  36. result = "{\"result\":\"success\"}";
  37. }
  38. PrintWriter out = null;
  39. response.setContentType("application/json");
  40. try {
  41. out = response.getWriter();
  42. out.write(result);
  43. } catch (IOException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. @RequestMapping("/getUser")
  48. public String getUser(String id,HttpServletRequest request){
  49. User user = userManager.getUser(id);
  50. request.setAttribute("user", user);
  51. return "/editUser";
  52. }
  53. @RequestMapping("/updateUser")
  54. public String updateUser(User user,HttpServletRequest request){
  55. if(userManager.updateUser(user)){
  56. user = userManager.getUser(user.getId());
  57. request.setAttribute("user", user);
  58. return "/editUser";
  59. }else{
  60. return "/error";
  61. }
  62. }
  63. }
  64. </span>

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

运行效果

:


总结


       这个过程虽然简单,但是自己操作的过程中还是出现了很多的问题,解决问题,快速成长,进一步验证了一句话:实践是检验真理的唯一标准!

转自 http://blog.csdn.net/lishehe/article/details/38356261

源码下载 http://download.csdn.net/detail/lishehe/7708997

源码下载 https://pan.baidu.com/s/1kVeDlcV

最新文章

  1. Python for Infomatics 第13章 网页服务二(译)
  2. sdcms标签
  3. Spring源码下载地址
  4. 实用的WPF Xml的简易读写类以及用法示例
  5. Android基本控件之listView(三)&lt;用ListView实现分页加载&gt;
  6. 关于css制作圆角
  7. 2018 ACM-ICPC World Finals B.Comma Sprinkler
  8. js操作ListBox列表(select)内移动
  9. L2-4 部落 (25 分)
  10. Gui图形化界面
  11. [JAVA]对象的别名问题
  12. VIM for C++ 一键安装配置
  13. (原)关于i++和++i的小程序测试
  14. global $GLOBALS 区别
  15. JS编程题练习
  16. C# 7中函数多值返回_转自InfoQ
  17. java Html 转 PDF
  18. grunt自动化
  19. lua垃圾回收机制
  20. 2.title

热门文章

  1. Codeforces Round #448 (Div. 2) B. XK Segments【二分搜索/排序/查找合法的数在哪些不同区间的区间数目】
  2. Python与数据库[1] -&gt; 数据库接口/DB-API[0] -&gt; 通用标准
  3. 对事务的特性ACID的理解
  4. 【bzoj1562】【[NOI2009]变换序列】匈牙利算法的性质利用
  5. BindDepthStencilState
  6. resin后台输出中文乱码的解决办法!
  7. 自己定义控件-LinearListView
  8. Haproxy 8种算法+Session共享
  9. 自己写的粗糙的Excel数据驱动Http接口测试框架(一)
  10. C#程序不包含适合于入口点的静态“Main”方法怎么办