[关闭]
@Beeder 2017-12-22T10:41:04.000000Z 字数 11935 阅读 559

Hibernate框架操作

javaWeb

Hibernate介绍

Hibernate核心内容是ORM(关系对象模型)。可以将对象自动的生成数据库中的信息,使得开发更加的面向对象。这样作为程序员就可以使用面向对象的思想来操作数据库,而不用关心繁琐的JDBC。所以,Hibernate处于三层架构中的D层(持久层)

Hibernate核心技术

Hibernate核心技术

Configuration

Configuration接口:负责配置并启动Hibernate

Configuration作用:
1. 读取 hibernate.cfg.xml
2. 管理对象关系映射文件
3. 加载 hibernate 驱动 url 以及用户名,密码....
4. 管理 hibernate 配置信息(mapping resource)

SessionFactory

SessionFactory作用:
1. 可以缓存sql语句和数据,称为sessionFactory级的缓存(二级缓存)
2. 它是一个重量级的类,因此我们需要保证一个数据库只有一个sessionfactory

sessionfactory获取session的方法

    SessionFactory接口:负责初始化Hibernate
  1. SessionFactory factory = new Configuration().configure().buildSessionFactory();
  2. //openSession();
  3. //---是获取一个新的 Session
  4. Session session = factory.openSession();
  5. //getCurrentSession();
  6. //---获取和当前线程绑定的session,就是在同一个线程中,获取的session是同一个session,这样可以利于事务的控制
  7. Session session = factory.getCurrentSession();
  8. /*
  9. getCurrentSession须先配置才能用:
  10. 需要在hibernate.cfg.xml的配置文件中提供配置
  11. <property name="hibernate.current_session_context_class">thread</property>
  12. */
方法 使用方式 关闭方式 线程安全
openSession() 同一个线程中,每次都使用不同session 手动关闭 不安全
getCurrentSession() 同一个线程中,保证使用同一个session 自动关闭 安全

Session

    Session接口:负责持久化对象的CRUD操作

Session之快照机制

    在创建session这个一级缓存对象的时候,session分为2块区域,一个是缓存区域。一个是快照区域
    当到了查询语句, 所获得的数据,缓存区域保存一份,快照区域也保存一份。
    到后面的set的时候,会修改缓存区域的参数。
    当提交事务的时候,会对比2块区域的内容,一致就没问题。不一致就修改数据库。

与一级缓存相关的方法

  1. session.close() //一级缓存消失
  2. Session.clear(); //清空缓存
  3. Session.evict(Object entity); //清除指定的对象在一级缓存中的引用
  4. Session.flisb(); //使用数据库中的数据覆盖缓存中的数据

Query查询接口

  1. // 1.查询所有记录
  2. Query query = session.createQuery("from Customer");
  3. List<Customer> list = query.list();
  4. System.out.println(list);
条件查询
  1. // 1.条件查询:
  2. Query query = session.createQuery("from Customer where name = ?");
  3. query.setString(0, "李健");
  4. List<Customer> list = query.list();
  5. System.out.println(list);
  6. // 2.条件查询:
  7. Query query = session.createQuery("from Customer where name = :aaa and age = :bbb");
  8. query.setString("aaa", "李健");
  9. query.setInteger("bbb", 38);
  10. List<Customer> list = query.list();
  11. System.out.println(list);
排序查询
  1. //排序查询和SQL语句中的排序的语法是一样的
  2. 升序
  3. session.createQuery("from Customer order by cust_id").list();
  4. //降序
  5. session.createQuery("from Customer order by cust_id desc").list();
分页查询

Hibernate框架提供了分页的方法,咱们可以调用方法来完成分页

  1. //两个方法如下:
  2. setFirstResult(a) //-- 从哪条记录开始,如果查询是从第一条开启,值是0
  3. setMaxResults(b) //-- 每页查询的记录条数
  4. //演示代码如下
  5. List<LinkMan> list = session.createQuery("from LinkMan").setFirstResult(0).setMaxResults().list();

Criteria查询接口

  1. // 1.查询所有记录
  2. Criteria criteria = session.createCriteria(Customer.class);
  3. List<Customer> list = criteria.list();
  4. System.out.println(list);
  5. // 2.条件查询
  6. Criteria criteria = session.createCriteria(Customer.class);
  7. criteria.add(Restrictions.eq("name", "李健"));
  8. List<Customer> list = criteria.list();
  9. System.out.println(list);
  10. // 3.条件查询
  11. Criteria criteria = session.createCriteria(Customer.class);
  12. criteria.add(Restrictions.eq("name", "李健"));
  13. criteria.add(Restrictions.eq("age", 38));
  14. List<Customer> list = criteria.list();
  15. System.out.println(list);

Transtraction

Transaction接口:负责事务

Hibernate的使用

下载jar包:

http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download

导入jar

  1. /*Hibernate-required start */
  2. hibernate-core-5.0.7.Final.jar //核心
  3. hibernate-commons-annotations-5.0.1.Final.jar //注解
  4. javassist-3.18.1-GA.jar //动态代理
  5. dom4j-1.6.1.jar //XML解析
  6. antlr-2.7.7.jar
  7. geronimo-jta_1.1_spec-1.1.1.jar
  8. hibernate-jpa-2.1-api-1.0.0.Final.jar
  9. jandex-2.0.0.Final.jar
  10. jboss-logging-3.3.0.Final.jar
  11. standard.jar
  12. /*Hibernate-required end */
  13. /*---------------------------------*/
  14. //BeanUtils包
  15. commons-beanutils-1.8.3.jar
  16. commons-logging-1.1.1.jar
  17. /*---------------------------------*/
  18. //jstl包
  19. jstl.jar
  20. standard.jar
  21. /*---------------------------------*/
  22. //mysql驱动包
  23. mysql-connector-java-5.1.7-bin.jar
  24. /*---------------------------------*/
  25. /*日志 log4j*/
  26. slf4j-api-1.6.1.jar //Hibernate推荐使用的日志接口(未实现)
  27. slf4j-log4j12-1.7.2.jar //log4j接口与实现间的链接
  28. log4j-1.2.16.jar //log4j具体实现
  29. /*---------------------------------*/

持久化类

    持久化类 = JavaBean(Java类) + xxx.hbm.xml(hbm的配置文件)

持久化类的编写规则
1. 提供一个无参数 public访问控制符的构造器 -- 底层需要进行反射.
2. 提供一个标识属性,映射数据表主键字段 -- 唯一标识OID.数据库中通过主键.Java对象通过地址确定对象.持久化类通过唯一标识OID确定记录
3. 所有属性提供public访问控制符的 set或者get 方法
4. 标识属性应尽量使用基本数据类型的包装类型

新建JavaBean类Customer.java

  1. package com.itheima.domain;
  2. /**
  3. * 客户的JavaBean
  4. * @author Administrator
  5. */
  6. public class Customer {
  7. /**
  8. * `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
  9. `cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
  10. `cust_user_id` bigint(32) DEFAULT NULL COMMENT '负责人id',
  11. `cust_create_id` bigint(32) DEFAULT NULL COMMENT '创建人id',
  12. `cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
  13. `cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
  14. `cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
  15. `cust_linkman` varchar(64) DEFAULT NULL COMMENT '联系人',
  16. `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
  17. `cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
  18. */
  19. // 以后使用包装类,默认值是null
  20. private Long cust_id;
  21. private String cust_name;
  22. private Long cust_user_id;
  23. private Long cust_create_id;
  24. private String cust_source;
  25. private String cust_industry;
  26. private String cust_level;
  27. private String cust_linkman;
  28. private String cust_phone;
  29. private String cust_mobile;
  30. public Long getCust_id() {
  31. return cust_id;
  32. }
  33. public void setCust_id(Long cust_id) {
  34. this.cust_id = cust_id;
  35. }
  36. public String getCust_name() {
  37. return cust_name;
  38. }
  39. public void setCust_name(String cust_name) {
  40. this.cust_name = cust_name;
  41. }
  42. public Long getCust_user_id() {
  43. return cust_user_id;
  44. }
  45. public void setCust_user_id(Long cust_user_id) {
  46. this.cust_user_id = cust_user_id;
  47. }
  48. public Long getCust_create_id() {
  49. return cust_create_id;
  50. }
  51. public void setCust_create_id(Long cust_create_id) {
  52. this.cust_create_id = cust_create_id;
  53. }
  54. public String getCust_source() {
  55. return cust_source;
  56. }
  57. public void setCust_source(String cust_source) {
  58. this.cust_source = cust_source;
  59. }
  60. public String getCust_industry() {
  61. return cust_industry;
  62. }
  63. public void setCust_industry(String cust_industry) {
  64. this.cust_industry = cust_industry;
  65. }
  66. public String getCust_level() {
  67. return cust_level;
  68. }
  69. public void setCust_level(String cust_level) {
  70. this.cust_level = cust_level;
  71. }
  72. public String getCust_linkman() {
  73. return cust_linkman;
  74. }
  75. public void setCust_linkman(String cust_linkman) {
  76. this.cust_linkman = cust_linkman;
  77. }
  78. public String getCust_phone() {
  79. return cust_phone;
  80. }
  81. public void setCust_phone(String cust_phone) {
  82. this.cust_phone = cust_phone;
  83. }
  84. public String getCust_mobile() {
  85. return cust_mobile;
  86. }
  87. public void setCust_mobile(String cust_mobile) {
  88. this.cust_mobile = cust_mobile;
  89. }
  90. @Override
  91. public String toString() {
  92. return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + ", cust_user_id=" + cust_user_id
  93. + ", cust_create_id=" + cust_create_id + ", cust_source=" + cust_source + ", cust_industry="
  94. + cust_industry + ", cust_level=" + cust_level + ", cust_linkman=" + cust_linkman + ", cust_phone="
  95. + cust_phone + ", cust_mobile=" + cust_mobile + "]";
  96. }
  97. }

java同目录配置映射文件Customer.hbm.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <!-- 配置类和表结构的映射 -->
  7. <class name="com.itheima.domain.Customer" table="cst_customer">
  8. <!-- 配置id
  9. 见到name属性,JavaBean的属性
  10. 见到column属性,是表结构的字段
  11. -->
  12. <id name="cust_id" column="cust_id">
  13. <!-- 主键的生成策略
  14. increment:Hibernate中提供的一种增长机制(并发访问会出错)
  15. identity:数据库的自动增长(auto_increment)(Oracle数据库没有自动增长)
  16. sequence:底层使用的是序列的增长方式(Oracle自动增长需要使用)
  17. uuid:使用随机的字符串作为主键
  18. native:本地策略(MySQL-使用identity,Oracle-使用sequence)
  19. -->
  20. <generator class="native"/>
  21. </id>
  22. <!-- 配置其他的属性 -->
  23. <property name="cust_name" column="cust_name"/>
  24. <property name="cust_user_id" column="cust_user_id"/>
  25. <property name="cust_create_id" column="cust_create_id"/>
  26. <property name="cust_source" column="cust_source"/>
  27. <property name="cust_industry" column="cust_industry"/>
  28. <property name="cust_level" column="cust_level"/>
  29. <property name="cust_linkman" column="cust_linkman"/>
  30. <property name="cust_phone" column="cust_phone"/>
  31. <property name="cust_mobile" column="cust_mobile"/>
  32. </class>
  33. </hibernate-mapping>

核心配置文件hibernate.cfg.xml

可以参考hibernate包hibernate-release-5.0.7.Final\project\etc\hibernate.properties

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <!-- 先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 -->
  7. <session-factory>
  8. <!-- 必须要配置的参数有5个,4大参数,数据库的方言 -->
  9. <!-- mysql数据库驱动 -->
  10. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  11. <!-- mysql数据库名称 -->
  12. <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
  13. <property name="hibernate.connection.username">root</property>
  14. <property name="hibernate.connection.password">root</property>
  15. <!-- 数据库的方言:为每一种数据库提供适配器,方便转换-->
  16. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  17. <!-- 可选配置 -->
  18. <!-- 显示SQL语句,在控制台显示 -->
  19. <property name="hibernate.show_sql">true</property>
  20. <!-- 格式化SQL语句 -->
  21. <property name="hibernate.format_sql">true</property>
  22. <!-- 生成数据库的表结构
  23. update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据
  24. -->
  25. <property name="hibernate.hbm2ddl.auto">update</property>
  26. <!-- 映射配置文件,需要引入映射的配置文件 -->
  27. <mapping resource="com/itheima/domain/Customer.hbm.xml"/>
  28. </session-factory>
  29. </hibernate-configuration>

测试环境

  1. /**
  2. * 测试保存
  3. */
  4. // 获取session
  5. Session session = HibernateUtils.getSession();
  6. // 开启事务
  7. Transaction tr = session.beginTransaction();
  8. // 执行代码
  9. Customer c = new Customer();
  10. c.setCust_name("哈哈");
  11. // 保存
  12. session.save(c);
  13. // 提交事务事务
  14. tr.commit();
  15. // 释放资源
  16. session.close();
  1. /**
  2. * 测试查询的方法
  3. */
  4. // 原来:加载配置文件,获取Factory对象,获取session
  5. Session session = HibernateUtils.getSession();
  6. Transaction tr = session.beginTransaction();
  7. // 创建查询的接口
  8. Query query = session.createQuery("from Customer");
  9. // 查询所有的数据 select * from 表
  10. List<Customer> list = query.list();
  11. for (Customer customer : list) {
  12. System.out.println(customer);
  13. }
  14. // 提交事务
  15. tr.commit();
  16. // 释放资源
  17. session.close();
  18. }
  1. /**
  2. * 测试添加或者修改
  3. */
  4. @Test
  5. public void testSaveOrUpdate(){
  6. // 原来:加载配置文件,获取Factory对象,获取session
  7. Session session = HibernateUtils.getSession();
  8. Transaction tr = session.beginTransaction();
  9. /*// 演示错误
  10. Customer c = new Customer();
  11. // c.setCust_id(10L); 千万不能自己设置
  12. c.setCust_name("测试");
  13. // 保存或者修改
  14. session.saveOrUpdate(c);*/
  15. // 先查询再改
  16. Customer c = session.get(Customer.class, 6L);
  17. c.setCust_name("小泽");
  18. session.saveOrUpdate(c);
  19. // 提交事务
  20. tr.commit();
  21. // 释放资源
  22. session.close();
  23. }
  1. /**
  2. * 测试修改
  3. */
  4. @Test
  5. public void testUpdate(){
  6. // 原来:加载配置文件,获取Factory对象,获取session
  7. Session session = HibernateUtils.getSession();
  8. Transaction tr = session.beginTransaction();
  9. // 测试查询的方法 2个参数:arg0查询JavaBean的class对象 arg1主键的值
  10. Customer c = session.get(Customer.class, 6L);
  11. // 设置客户的信息
  12. c.setCust_name("小苍");
  13. c.setCust_level("3");
  14. // 修改
  15. session.update(c);
  16. // 提交事务
  17. tr.commit();
  18. // 释放资源
  19. session.close();
  20. }
  1. /**
  2. * 测试删除的方法
  3. * 注意:删除或者修改,先查询再删除或者修改
  4. */
  5. @Test
  6. public void testDel(){
  7. // 原来:加载配置文件,获取Factory对象,获取session
  8. Session session = HibernateUtils.getSession();
  9. Transaction tr = session.beginTransaction();
  10. // 测试查询的方法 2个参数:arg0查询JavaBean的class对象 arg1主键的值
  11. Customer c = session.get(Customer.class, 7L);
  12. // 删除客户
  13. session.delete(c);
  14. // 提交事务
  15. tr.commit();
  16. // 释放资源
  17. session.close();
  18. }
  1. /**
  2. * 测试get()方法,获取查询,通过主键来查询一条记录
  3. */
  4. @Test
  5. public void testGet(){
  6. // 原来:加载配置文件,获取Factory对象,获取session
  7. Session session = HibernateUtils.getSession();
  8. Transaction tr = session.beginTransaction();
  9. // 测试查询的方法 2个参数:arg0查询JavaBean的class对象 arg1主键的值
  10. Customer c = session.get(Customer.class, 7L);
  11. System.out.println(c);
  12. // 提交事务
  13. tr.commit();
  14. // 释放资源
  15. session.close();
  16. }
  1. /**
  2. * 测试工具类
  3. */
  4. @Test
  5. public void testSave2(){
  6. // 原来:加载配置文件,获取Factory对象,获取session
  7. Session session = HibernateUtils.getSession();
  8. Transaction tr = session.beginTransaction();
  9. Customer c = new Customer();
  10. c.setCust_name("小风");
  11. session.save(c);
  12. // 提交事务
  13. tr.commit();
  14. // 释放资源
  15. session.close();
  16. }
  1. /**
  2. * 测试保存客户
  3. */
  4. @Test
  5. public void testSave(){
  6. /**
  7. * 1. 先加载配置文件
  8. * 2. 创建SessionFactory对象,生成Session对象
  9. * 3. 创建session对象
  10. * 4. 开启事务
  11. * 5. 编写保存的代码
  12. * 6. 提交事务
  13. * 7. 释放资源
  14. */
  15. /*// 1. 先加载配置文件
  16. Configuration config = new Configuration();
  17. // 默认加载src目录下hibernate.cfg.xml的配置文件
  18. config.configure();
  19. // 了解,手动加载
  20. // config.addResource("com/itheima/domain/Customer.hbm.xml");
  21. */
  22. // 简写的方法
  23. Configuration config = new Configuration().configure();
  24. // 2. 创建SessionFactory对象
  25. SessionFactory factory = config.buildSessionFactory();
  26. // 3. 创建session对象
  27. Session session = factory.openSession();
  28. // 4. 开启事务
  29. Transaction tr = session.beginTransaction();
  30. // 5. 编写保存的代码
  31. Customer c = new Customer();
  32. // c.setCust_id(cust_id); 主键是自动递增了
  33. c.setCust_name("测试3");
  34. c.setCust_level("2");
  35. c.setCust_phone("110");
  36. // 保存数据,操作对象就相当于操作数据库的表结构
  37. session.save(c);
  38. // 6. 提交事务
  39. tr.commit();
  40. // 7. 释放资源
  41. session.close();
  42. factory.close();
  43. }

常用方法

  1. save(obj);
  2. delete(obj);
  3. get(obj);
  4. update(obj);
  5. saveorupdate(obj);
  6. creatrQuery(obj);
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注