Hibernate框架基础

Hibernate框架

ORM概念

  • O, Object 对象
  • R, Realtion 关系 (关系型数据库: MySQL, Oracle…)
  • M,Mapping 映射

ORM, 对象关系映射!

ORM, 解决什么问题?

存储: 能否把对象的数据直接保存到数据库

获取: 能否直接从数据库拿到一个对象?

想做到上面2点,必须要有映射!

  • 总结:

hibernate与ORM的关系?

Hibernate是ORM的实现!

Hibernate HelloWorld案例

  • 搭建一个Hibernate环境,开发步骤:
  1. 下载源码 版本:hibernate-distribution-3.6.0.Final
  2. 引入jar文件 hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库驱动包
  3. 写对象以及对象的映射 Employee.java 对象 Employee.hbm.xml 对象的映射 (映射文件)
  4. src/hibernate.cfg.xml 主配置文件 - 数据库连接配置 - 加载所用的映射(*.hbm.xml)
  5. App.java 测试
  1. Employee.java 对象
  2. //一、 对象
  3. public class Employee {
  4. private int empId;
  5. private String empName;
  6. private Date workDate;
  7. }
  8. Employee.hbm.xml 对象的映射
  9. <?xml version="1.0"?>
  10. <!DOCTYPE hibernate-mapping PUBLIC
  11. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  12. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  13. <hibernate-mapping package="cn.itcast.a_hello">
  14. <class name="Employee" table="employee">
  15. <!-- 主键 ,映射-->
  16. <id name="empId" column="id">
  17. <generator class="native"/>
  18. </id>
  19. <!-- 非主键,映射 -->
  20. <property name="empName" column="empName"></property>
  21. <property name="workDate" column="workDate"></property>
  22. </class>
  23. </hibernate-mapping>
  24. hibernate.cfg.xml 主配置文件
  25. <!DOCTYPE hibernate-configuration PUBLIC
  26. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  27. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  28. <hibernate-configuration>
  29. <session-factory>
  30. <!-- 数据库连接配置 -->
  31. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  32. <property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
  33. <property name="hibernate.connection.username">root</property>
  34. <property name="hibernate.connection.password">root</property>
  35. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  36. <property name="hibernate.show_sql">true</property>
  37. <!-- 加载所有映射 -->
  38. <mapping resource="cn/itcast/a_hello/Employee.hbm.xml"/>
  39. </session-factory>
  40. </hibernate-configuration>
  41. App.java 测试类
  42. public class App {
  43. @Test
  44. public void testHello() throws Exception {
  45. // 对象
  46. Employee emp = new Employee();
  47. emp.setEmpName("班长");
  48. emp.setWorkDate(new Date());
  49. // 获取加载配置文件的管理类对象
  50. Configuration config = new Configuration();
  51. config.configure(); // 默认加载src/hibenrate.cfg.xml文件
  52. // 创建session的工厂对象
  53. SessionFactory sf = config.buildSessionFactory();
  54. // 创建session (代表一个会话,与数据库连接的会话)
  55. Session session = sf.openSession();
  56. // 开启事务
  57. Transaction tx = session.beginTransaction();
  58. //保存-数据库
  59. session.save(emp);
  60. // 提交事务
  61. tx.commit();
  62. // 关闭
  63. session.close();
  64. sf.close();
  65. }
  66. }

Hibernate Api

  • Configuration 配置管理类对象

    • config.configure(); 加载主配置文件的方法(hibernate.cfg.xml) 默认加载src/hibernate.cfg.xml
    • config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件
    • config.buildSessionFactory(); 创建session的工厂对象
  • SessionFactory

    • session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)
    • sf.openSession(); 创建一个sesison对象
    • sf.getCurrentSession(); 创建session或取出session对象
  • Session session对象维护了一个连接(Connection),代表了与数据库连接的会话。

    • Hibernate最重要的对象: 只用使用hibernate与数据库操作,都用到这个对象
    • session.beginTransaction(); 开启一个事务;
    • hibernate要求所有的与数据库的操作必须有事务的环境,否则报错!
  • 更新:

    • session.save(obj); 保存一个对象
    • session.update(emp); 更新一个对象
    • session.saveOrUpdate(emp); 保存或者更新的方法:
      • 没有设置主键,执行保存;
      • 有设置主键,执行更新操作;
      • 如果设置主键不存在报错!
  • 主键查询:

    • session.get(Employee.class, 1); 主键查询
    • session.load(Employee.class, 1); 主键查询 (支持懒加载)
  • HQL查询:

    • HQL查询与SQL查询区别:

      • SQL: (结构化查询语句)查询的是表以及字段; 不区分大小写。
      • HQL: hibernate query language 即hibernate提供的面向对象的查询语言
        • 查询的是对象以及对象的属性。
        • 区分大小写。
  • Criteria查询:

    • 完全面向对象的查询。
  • 本地SQL查询:

    • 复杂的查询,就要使用原生态的sql查询,也可以,就是本地sql查询的支持! (缺点: 不能跨数据库平台!)
  • Transaction hibernate事务对象

Hibernate crud

  1. public class EmployeeDaoImpl implements IEmployeeDao{
  2. @Override
  3. public Employee findById(Serializable id) {
  4. Session session = null;
  5. Transaction tx = null;
  6. try {
  7. // 获取Session
  8. session = HibernateUtils.getSession();
  9. // 开启事务
  10. tx = session.beginTransaction();
  11. // 主键查询
  12. return (Employee) session.get(Employee.class, id);
  13. } catch (Exception e) {
  14. throw new RuntimeException(e);
  15. } finally {
  16. tx.commit();
  17. session.close();
  18. }
  19. }
  20. @Override
  21. public List<Employee> getAll() {
  22. Session session = null;
  23. Transaction tx = null;
  24. try {
  25. session = HibernateUtils.getSession();
  26. tx = session.beginTransaction();
  27. // HQL查询
  28. Query q = session.createQuery("from Employee");
  29. return q.list();
  30. } catch (Exception e) {
  31. throw new RuntimeException(e);
  32. } finally {
  33. tx.commit();
  34. session.close();
  35. }
  36. }
  37. @Override
  38. public List<Employee> getAll(String employeeName) {
  39. Session session = null;
  40. Transaction tx = null;
  41. try {
  42. session = HibernateUtils.getSession();
  43. tx = session.beginTransaction();
  44. Query q =session.createQuery("from Employee where empName=?");
  45. // 注意:参数索引从0开始
  46. q.setParameter(0, employeeName);
  47. // 执行查询
  48. return q.list();
  49. } catch (Exception e) {
  50. throw new RuntimeException(e);
  51. } finally {
  52. tx.commit();
  53. session.close();
  54. }
  55. }
  56. @Override
  57. public List<Employee> getAll(int index, int count) {
  58. Session session = null;
  59. Transaction tx = null;
  60. try {
  61. session = HibernateUtils.getSession();
  62. tx = session.beginTransaction();
  63. Query q = session.createQuery("from Employee");
  64. // 设置分页参数
  65. q.setFirstResult(index); // 查询的其实行
  66. q.setMaxResults(count); // 查询返回的行数
  67. List<Employee> list = q.list();
  68. return list;
  69. } catch (Exception e) {
  70. throw new RuntimeException(e);
  71. } finally {
  72. tx.commit();
  73. session.close();
  74. }
  75. }
  76. @Override
  77. public void save(Employee emp) {
  78. Session session = null;
  79. Transaction tx = null;
  80. try {
  81. session = HibernateUtils.getSession();
  82. tx = session.beginTransaction();
  83. // 执行保存操作
  84. session.save(emp);
  85. } catch (Exception e) {
  86. throw new RuntimeException(e);
  87. } finally {
  88. tx.commit();
  89. session.close();
  90. }
  91. }
  92. @Override
  93. public void update(Employee emp) {
  94. Session session = null;
  95. Transaction tx = null;
  96. try {
  97. session = HibernateUtils.getSession();
  98. tx = session.beginTransaction();
  99. session.update(emp);
  100. } catch (Exception e) {
  101. throw new RuntimeException(e);
  102. } finally {
  103. tx.commit();
  104. session.close();
  105. }
  106. }
  107. @Override
  108. public void delete(Serializable id) {
  109. Session session = null;
  110. Transaction tx = null;
  111. try {
  112. session = HibernateUtils.getSession();
  113. tx = session.beginTransaction();
  114. // 先根据id查询对象,再判断删除
  115. Object obj = session.get(Employee.class, id);
  116. if (obj != null) {
  117. session.delete(obj);
  118. }
  119. } catch (Exception e) {
  120. throw new RuntimeException(e);
  121. } finally {
  122. tx.commit();
  123. session.close();
  124. }
  125. }
  126. }

Hibernate.cfg.xml 主配置

  • Hibernate.cfg.xml

    • 主配置文件中主要配置:数据库连接信息、其他参数、映射信息!
  • 常用配置查看源码:

    • hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties
  • 配置示例

  1. <?xml version='1.0' encoding='utf-8'?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!--数据库连接信息-->
  8. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
  9. <property name="connection.url">jdbc:mysql://localhost:3306/day14?useUnicode=true&amp;characterEncoding=UTF-8</property>
  10. <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
  11. <property name="connection.username">root</property>
  12. <property name="connection.password">1234</property>
  13. <!--其他配置信息-->
  14. <property name="show_sql">true</property>
  15. <property name="hbm2ddl.auto">update</property>
  16. <!--导入映射文件-->
  17. <mapping resource="cn/csx/domain/User.hbm.xml"/>
  18. </session-factory>
  19. </hibernate-configuration>

数据库连接参数配置

  • 数据库连接参数配置

例如:

  1. ## MySQL
  2. #hibernate.dialect org.hibernate.dialect.MySQLDialect
  3. #hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
  4. #hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
  5. #hibernate.connection.driver_class com.mysql.jdbc.Driver
  6. #hibernate.connection.url jdbc:mysql:///test
  7. #hibernate.connection.username gavin
  8. #hibernate.connection.password
  • 自动建表

Hibernate.properties

  1. #hibernate.hbm2ddl.auto create-drop 每次在创建sessionFactory时候执行创建表;
  2. 当调用sesisonFactoryclose方法的时候,删除表!
  3. #hibernate.hbm2ddl.auto create 每次都重新建表; 如果表已经存在就先删除再创建
  4. #hibernate.hbm2ddl.auto update 如果表不存在就创建; 表存在就不创建;
  5. #hibernate.hbm2ddl.auto validate (生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

映射配置

映射配置

  1. <?xml version="1.0"?>
  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. <!-- 映射文件: 映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中。 -->
  6. <!--
  7. package: 要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)
  8. auto-import 默认为true, 在写hql的时候自动导入包名
  9. 如果指定为false, 再写hql的时候必须要写上类的全名;
  10. 如:session.createQuery("from cn.itcast.c_hbm_config.Employee").list();
  11. -->
  12. <hibernate-mapping package="cn.csx.c_hbm_config" auto-import="true">
  13. <!--
  14. class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)
  15. name 指定要映射的对象的类型
  16. table 指定对象对应的表;
  17. 如果没有指定表名,默认与对象名称一样
  18. -->
  19. <class name="Employee" table="employee">
  20. <!-- 主键 ,映射-->
  21. <id name="empId" column="id">
  22. <!--
  23. 主键的生成策略
  24. identity 自增长(mysql,db2)
  25. sequence 自增长(序列), oracle中自增长是以序列方法实现
  26. native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
  27. 如果是mysql数据库, 采用的自增长方式是identity
  28. 如果是oracle数据库, 使用sequence序列的方式实现自增长
  29. increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
  30. assigned 指定主键生成策略为手动指定主键的值
  31. uuid 指定uuid随机生成的唯一的值
  32. foreign (外键的方式, one-to-one讲)
  33. -->
  34. <generator class="uuid"/>
  35. </id>
  36. <!--
  37. 普通字段映射
  38. property
  39. name 指定对象的属性名称
  40. column 指定对象属性对应的表的字段名称,如果不写默认与对象属性一致。
  41. length 指定字符的长度, 默认为255
  42. type 指定映射表的字段的类型,如果不指定会匹配属性的类型
  43. java类型: 必须写全名
  44. hibernate类型: 直接写类型,都是小写
  45. -->
  46. <property name="empName" column="empName" type="java.lang.String" length="20"></property>
  47. <property name="workDate" type="java.util.Date"></property>
  48. <!-- 如果列名称为数据库关键字,需要用反引号或改列名。 -->
  49. <property name="desc" column="`desc`" type="java.lang.String"></property>
  50. </class>
  51. </hibernate-mapping>

复合主键映射

  1. // 复合主键类
  2. public class CompositeKeys implements Serializable{
  3. private String userName;
  4. private String address;
  5. // .. get/set
  6. }
  7. public class User {
  8. // 名字跟地址,不会重复
  9. private CompositeKeys keys;
  10. private int age;
  11. }
  12. User.hbm.xml
  13. <?xml version="1.0"?>
  14. <!DOCTYPE hibernate-mapping PUBLIC
  15. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  16. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  17. <hibernate-mapping package="cn.itcast.d_compositeKey" auto-import="true">
  18. <class name="User">
  19. <!-- 复合主键映射 -->
  20. <composite-id name="keys">
  21. <key-property name="userName" type="string"></key-property>
  22. <key-property name="address" type="string"></key-property>
  23. </composite-id>
  24. <property name="age" type="int"></property>
  25. </class>
  26. </hibernate-mapping>
  27. App.java
  28. public class App2 {
  29. private static SessionFactory sf;
  30. static {
  31. // 创建sf对象
  32. sf = new Configuration()
  33. .configure()
  34. .addClass(User.class) //(测试) 会自动加载映射文件:Employee.hbm.xml
  35. .buildSessionFactory();
  36. }
  37. //1. 保存对象
  38. @Test
  39. public void testSave() throws Exception {
  40. Session session = sf.openSession();
  41. Transaction tx = session.beginTransaction();
  42. // 对象
  43. CompositeKeys keys = new CompositeKeys();
  44. keys.setAddress("广州棠东");
  45. keys.setUserName("Jack");
  46. User user = new User();
  47. user.setAge(20);
  48. user.setKeys(keys);
  49. // 保存
  50. session.save(user);
  51. tx.commit();
  52. session.close();
  53. }
  54. @Test
  55. public void testGet() throws Exception {
  56. Session session = sf.openSession();
  57. Transaction tx = session.beginTransaction();
  58. //构建主键再查询
  59. CompositeKeys keys = new CompositeKeys();
  60. keys.setAddress("广州棠东");
  61. keys.setUserName("Jack");
  62. // 主键查询
  63. User user = (User) session.get(User.class, keys);
  64. // 测试输出
  65. if (user != null){
  66. System.out.println(user.getKeys().getUserName());
  67. System.out.println(user.getKeys().getAddress());
  68. System.out.println(user.getAge());
  69. }
  70. tx.commit();
  71. session.close();
  72. }
  73. }

Hibernate框架基础的更多相关文章

  1. (转)Hibernate框架基础——一对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...

  2. (转)Hibernate框架基础——Java对象持久化概述

    http://blog.csdn.net/yerenyuan_pku/article/details/52732990 Java对象持久化概述 应用程序的分层体系结构 基于B/S的典型三层架构  说明 ...

  3. Hibernate相关的查询 --Hibernate框架基础

    接着上一篇博文:Hibernate第一个程序(最基础的增删改查) --Hibernate本例是对Hibernate查询的扩展,使用HQL语句查询 /** * HQL添加预先需要保存的测试数据 */ @ ...

  4. (转)Hibernate框架基础——映射主键属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52740744 本文我们学习映射文件中的主键属性,废话不多说,直接开干. 我们首先在cn.itc ...

  5. hibernate框架基础描述

    在hibernate中,他通过配置文件(hibernate,cfg.xml)和映射文件(...hbm.xml)把对象或PO(持久化对象)映射到数据库中表,然后通过操作持久化对象,对数据库进行CRUD. ...

  6. (转)Hibernate框架基础——多对多关联关系映射

    http://blog.csdn.net/yerenyuan_pku/article/details/52756536 多对多关联关系映射 多对多的实体关系模型也是很常见的,比如学生和课程的关系.一个 ...

  7. (转)Hibernate框架基础——映射集合属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52745486 集合映射 集合属性大致有两种: 单纯的集合属性,如像List.Set或数组等集合 ...

  8. (转)Hibernate框架基础——映射普通属性

    http://blog.csdn.net/yerenyuan_pku/article/details/52739871 持久化对象与OID 对持久化对象的要求 提供一个无参的构造器.使Hibernat ...

  9. (转) Hibernate框架基础——操纵持久化对象的方法(Session中)

    http://blog.csdn.net/yerenyuan_pku/article/details/52761021 上一篇文章中我们学习了Hibernate中java对象的状态以及对象的状态之间如 ...

随机推荐

  1. linux系统中的进程

    一.fork 在类unix系统中,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去.此一现象被称 ...

  2. (转)Docker镜像中的base镜像理解

    base 镜像有两层含义: 不依赖其他镜像,从 scratch 构建. 其他镜像可以之为基础进行扩展. 所以,能称作 base 镜像的通常都是各种 Linux 发行版的 Docker 镜像,比如 Ub ...

  3. Selenium运用-漫画批量下载

    今天我们要爬去的网站是http://comic.sfacg.com/.漫画网站一般都是通过JavaScript和AJAX来动态加载漫画的,这也就意味着想通过原来爬取静态网站的方式去下载漫画是不可能的, ...

  4. java之常用的依赖文件pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  5. select右三角消除(转)

    代码如下: select { /*Chrome和Firefox里面的边框是不一样的,所以复写了一下*/ border: solid 1px #; /*很关键:将默认的select选择框样式清除*/ a ...

  6. HDU 2084 数塔 (水DP)

    题意:.... 析:从下往上算即可,水DP. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #incl ...

  7. 【图解HTTP】第一章 了解web及网络基础

    [图解HTTP]了解Web及网络基础 Web页面是如何呈现的?根据Web浏览器地址栏中指定的URL,Web浏览器从Web服务器端获取文件资源(resource)等信息,从而显示出Web页面. 这种通过 ...

  8. WSAGetOverlappedResult函数

    WSAGetOverlappedResult函数 通过WSAWaitForMultipleEvents函数来得到重叠操作完成的通知,那么自然也需要一个函数来查询一下重叠操作的结果,定义如下 BOOL ...

  9. ARM启动代码中_main 与用户主程序main()的区别

    1.1  问题描述     __main函数的作用是什么呀?1.2  问题剖析     __main函数是C/C++运行时库的一个函数,嵌入式系统在进入应用主程序之前必须有一个初始化的过程,使用__m ...

  10. VC中CRect类的简单介绍

    CRect CRect类与Windows RECT结构相似,并且还包括操作CRect对象和Windows RECT结构的成员函数.在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方,都 ...