目录

1. ORM和Hibernare

  • O:object ; R: realtion; M:Mapping。Hibernate是其中一种实现。
  • 解决问题:对象直接保存到数据库<——>直接从数据库拿到一个对象

2. 基本开发

2.1 lib

对于版本hibernate-distribution-3.6.0.Final而言,需要jar包

  • 核心包:hibernate3.jar

  • lib\required下

  • lib\jpa下hibernate-jpa-2.0-api-1.0.0.Final.jar

  • 数据库驱动包:


2.2 写对象和引入对象映射

2.2.1 写对象类文件

  • 和表对应的类
  1. package per.liyue.code.hibernatehello;
  2. /*
  3. * 数据库表映射类
  4. * 类的名称和成员变量的名称属性必须和数据库一致
  5. */
  6. import java.util.Date;
  7. public class Employee {
  8. private int empId;
  9. private String empName;
  10. private Date workDate;
  11. public int getEmpId() {
  12. return empId;
  13. }
  14. public void setEmpId(int empId) {
  15. this.empId = empId;
  16. }
  17. public String getEmpName() {
  18. return empName;
  19. }
  20. public void setEmpName(String empName) {
  21. this.empName = empName;
  22. }
  23. public Date getWorkDate() {
  24. return workDate;
  25. }
  26. public void setWorkDate(Date workDate) {
  27. this.workDate = workDate;
  28. }
  29. }

2.3 配置文件

2.3.1 配置加载映射文件

按照格式类名称.hbm.xml格式来创建,源文件可以从库文件中拷贝

配置时候注意对应关系:

  • 类与表对应
  • 类名和表名对已
  • 属性对应
  1. <?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  4. <!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
  5. <!-- package:类对象所在的包
  6. auto-import:表面是自动导入包,如果设定为false,则需要在执行hql语句时候将包名写清楚:
  7. Demo:在true时候可以写为session.createQuery("from Employee").list();
  8. 在false时候必须写为session.createQuery("from per.liyue.code.hibernatehello.Employee").list();
  9. -->
  10. <hibernate-mapping package="per.liyue.code.hibernatehello" auto-import="true">
  11. <!-- 类与表的对应
  12. name:类名称
  13. table:表名称
  14. -->
  15. <class name="Employee" table="employee">
  16. <!-- 主键 注意和类成员和表列名称的一致对应 -->
  17. <id name="empId" column="EmpId" >
  18. <!-- 主键的生成策略:
  19. 1.identity 自增长(mysql,db2)
  20. 2.sequence 自增长(序列), oracle中自增长是以序列方法实现
  21. 3.native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
  22. 如果是mysql数据库, 采用的自增长方式是identity
  23. 如果是oracle数据库, 使用sequence序列的方式实现自增长
  24. 4.increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)
  25. 5.assigned 指定主键生成策略为手动指定主键的值
  26. 6.uuid 指定uuid随机生成的唯一的值
  27. 7.foreign (外键的方式, one-to-one讲)
  28. -->
  29. <generator class="native" />
  30. </id>
  31. <!-- 非主键,同样一一映射
  32. name:类的属性名称
  33. column:表的字段名称
  34. length:设定字段的长度,默认为255
  35. type:设定映射表的类型,如果不写匹配类对应属性的类型
  36. java类型:必须带完整包名:java.lang.String
  37. hibernate类型:全部都是小写
  38. -->
  39. <property name="empName" column="EmpName"></property>
  40. <property name="workDate" column="WorkDate"></property>
  41. </class>
  42. </hibernate-mapping>

2.3.2 配置数据库连接文件

配置文件hibernate.cfg.xml

  1. <!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-configuration>
  5. <session-factory name="foo">
  6. <!-- 数据库连接配置 -->
  7. <!-- 连接类 -->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <!-- 连接数据库 -->
  10. <property name="hibernate.connection.url">jdbc:mysql:///hi</property>
  11. <!-- 连接用户名 -->
  12. <property name="hibernate.connection.username">root</property>
  13. <!-- 连接密码 -->
  14. <property name="hibernate.connection.password">root</property>
  15. <!-- 数据库方言 -->
  16. <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  17. <!-- 加载所有的映射 -->
  18. <mapping resource="per/liyue/code/hibernatehello/Employee.hbm.xml"/>
  19. </session-factory>
  20. </hibernate-configuration>

2.4 实现保存对象插入数据

  1. package per.liyue.code.hibernatehello;
  2. import java.util.Date;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.Transaction;
  6. import org.hibernate.cfg.Configuration;
  7. import org.junit.Test;
  8. public class App {
  9. @Test
  10. public void Fun(){
  11. /*
  12. * 创建一个对象,以便验证提交数据库
  13. */
  14. Employee em = new Employee();
  15. em.setEmpId(1);
  16. em.setEmpName("张神马");
  17. em.setWorkDate(new Date());
  18. /*
  19. * 通过Hibernate操作提交数据
  20. */
  21. //获取加载配置文件
  22. Configuration config = new Configuration();
  23. config.configure();//默认加载src下的hibernate.cfg.xml文件
  24. //创建session工程
  25. SessionFactory sf = config.buildSessionFactory();
  26. //创建一个会话,表示和数据库的一个连接
  27. Session session = sf.openSession();
  28. //开启事务
  29. Transaction tx = session.beginTransaction();
  30. //保存数据库
  31. session.save(em);
  32. //提交事务
  33. tx.commit();
  34. //关闭资源
  35. session.close();
  36. sf.close();
  37. }
  38. }

3. 常见错误

3.1 重复匹配

Exception : org.hibernate.MappingException: Repeated column in mapping for entity

检查配置文件.hbm.xml中的属性标签是否多个标签匹配了同一个数据库列

3.2表属性设置

org.hibernate.exception.GenericJDBCException: could not insert: [per.liyue.code.hibernatehello.Employee] at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140) at org.hibernate.exception.SQLStateConverter.co

对应的表主键是自增长才能匹配配置文件中的

3.3程序执行成功且hibernate生成sql语句,但是数据库中没有数据

没有开启或者提交事务!

4. API详解

4.1 Configuration 配置管理类对象

  • config.configure(); 加载主配置文件的方法(hibernate.cfg.xml); 默认加载src/hibernate.cfg.xml

  • config.configure(“cn/config/hibernate.cfg.xml”); 加载指定路径下指定名称的主配置文件

  • config.buildSessionFactory(); 创建session的工厂对象

4.2 SessionFactory session的工厂(或者说代表了这个hibernate.cfg.xml配置文件)

  • sf.openSession(); 创建一个sesison对象
  • sf.getCurrentSession(); 创建session或取出session对象

4.3 Sessionsession对象维护了一个连接(Connection), 代表了与数据库连接的会话。

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

4.4 Session是hibernate最重要的对象, 所有hibernate与数据库操作都需要!维护了一个与数据库的会话

4.4.1 插入记录

save()方法

4.4.2 更新记录

update()方法

saveOrUpdate()方法

4.4.3 查询记录

get()方法

load()方法

4.4.4 Demo:

将上述例子中的APP类代码修改为:

  1. package per.liyue.code.hibernatehello;
  2. import java.util.Date;
  3. import org.hibernate.SessionFactory;
  4. import org.hibernate.Transaction;
  5. import org.hibernate.cfg.Configuration;
  6. import org.hibernate.classic.Session;
  7. import org.junit.Test;
  8. /*
  9. * hibernate测试类
  10. */
  11. public class App {
  12. //使用全局静态对象避免重复创建
  13. private static SessionFactory sessionFactory;
  14. static{
  15. //这里记得一定要加载cuonfigure函数!!!
  16. sessionFactory = new Configuration().configure().buildSessionFactory();
  17. }
  18. /*
  19. * 实例:插入
  20. */
  21. @Test
  22. public void insertDemo(){
  23. Employee e = new Employee();
  24. //这里对应的表主键,非空,自增长。才可以插入
  25. //e.setEmpId(1);
  26. e.setEmpName("李四");
  27. e.setWorkDate(new Date());
  28. //获取Session对象
  29. Session s = sessionFactory.openSession();
  30. //下面函数同样可以获取Session对象
  31. //Session s = sessionFactory.getCurrentSession();
  32. //打开事务!hibernate所有业务都需要打开事务!!!
  33. Transaction t = s.beginTransaction();
  34. //执行业务
  35. s.save(e);
  36. //提交
  37. t.commit();
  38. //关闭
  39. s.close();
  40. sessionFactory.close();
  41. }
  42. /*
  43. * 实例:更新
  44. */
  45. @Test
  46. public void updateDemo(){
  47. Employee e = new Employee();
  48. //这里对应的表主键,非空,自增长。才可以插入
  49. e.setEmpId(1);
  50. e.setEmpName("王五");
  51. e.setWorkDate(new Date());
  52. //获取Session对象
  53. Session session = sessionFactory.openSession();
  54. //打开事务
  55. Transaction transaction = session.beginTransaction();
  56. //执行业务
  57. /*
  58. * 更新的时候必须有主键!!!
  59. */
  60. session.update(e);
  61. //提交
  62. transaction.commit();
  63. //关闭
  64. session.close();
  65. sessionFactory.close();
  66. }
  67. /*
  68. * 实例:更新或保存
  69. */
  70. @Test
  71. public void updateOrSaveDemo(){
  72. Employee e = new Employee();
  73. //这里对应的表主键,非空,自增长。才可以插入
  74. e.setEmpId(1);
  75. e.setEmpName("赵二");
  76. e.setWorkDate(new Date());
  77. //获取Session对象
  78. Session session = sessionFactory.openSession();
  79. //打开事务
  80. Transaction transaction = session.beginTransaction();
  81. //执行业务
  82. /*
  83. * 1.如果没有主键则执行保存
  84. * 2.如果有主键则执行更新
  85. * 3.如果主键有错误则报错
  86. */
  87. session.saveOrUpdate(e);
  88. //提交
  89. transaction.commit();
  90. //关闭
  91. session.close();
  92. sessionFactory.close();
  93. }
  94. /*
  95. * 查询
  96. */
  97. @Test
  98. public void SelectDemo(){
  99. //获取Session
  100. Session session = sessionFactory.openSession();//.getCurrentSession();
  101. //打开事务
  102. Transaction t = session.beginTransaction();
  103. //执行 业务
  104. Employee employee = (Employee) session.get(Employee.class, 1);
  105. /*
  106. * load支持懒加载
  107. */
  108. //Employee employee = (Employee) session.load(Employee.class, 1);
  109. System.out.println(employee);
  110. //提交
  111. t.commit();
  112. //关闭
  113. session.close();
  114. sessionFactory.close();
  115. }
  116. /*
  117. * 删除
  118. */
  119. @Test
  120. public void DeleteOneData(){
  121. Session s = sessionFactory.openSession();
  122. Transaction t = session.beginTransaction();
  123. //删除需要先查找到后再删除
  124. Object obj = session.get(Employee.class, 2);
  125. if(null != obj){
  126. s.delete(obj);
  127. }
  128. t.commit();
  129. session.close();
  130. sessionFactory.close();
  131. }
  132. }

23.Hibernate-基础.md的更多相关文章

  1. hibernate基础dao类

    此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...

  2. hibernate基础(1)

    hibernate基础1.hibernate介绍与动手入门体验  问题:模型不匹配(java对象模型与数据库关系模型不匹配)  解决: 1.使用JDBC手工转换        2.使用ORM(Obje ...

  3. Hibernate.基础篇《二》. getOpenSession() 和 getCurrentSession() - 1

    Hibernate.基础篇<二>. getOpenSession() 和 getCurrentSession() - 1 说明: 在Hibernate应用中,Session接口的使用最为广 ...

  4. Hibernate.基础篇《一》.Hibernate工具类.

    Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...

  5. Hibernate学习笔记2.1(Hibernate基础配置)

    Hibernate基础配置 1.<property name="hbm2ddl.auto">update</property> 在SessionFactor ...

  6. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  7. Hibernate基础学习2

    Hibernate基础学习2 测试hibernate的一级缓存,事务以及查询语句 1)Hibernate的一些相关概念 hibernate的一级缓存 1)缓存是为了提高该框架对数据库的查询速度 2)一 ...

  8. Hibernate 基础配置及常用功能(三)

    本章重点讲述Hibernate对象的三种状态以及如何配置二级缓存 有关Hibernate的三种状态如何相互转换网上都能查到,官方文档描述的也比较详细.这里主要是针对几个重点方法做代码演示. 一.状态转 ...

  9. Hibernate基础学习(五)—对象-关系映射(下)

    一.单向n-1 单向n-1关联只需从n的一端可以访问1的一端. 域模型: 从Order到Customer的多对一单向关联.Order类中定义一个Customer属性,而在Customer类不用存放Or ...

  10. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

随机推荐

  1. sqlserver2008数据库自动备份的sql脚本及使用bat命令执行脚本

    -----sql脚本 declare @fileName varchar(255) ,--定义备份文件名变量         @dbname varchar(255)--定义备份数据库名变量decla ...

  2. hdu 6241 Color a Tree 2017 CCPC 哈理工站 L

    Bob intends to color the nodes of a tree with a pen. The tree consists of NN nodes. These nodes are ...

  3. [LeetCode&Python] Problem 458. Poor Pigs

    There are 1000 buckets, one and only one of them contains poison, the rest are filled with water. Th ...

  4. 面试题 -AR VR MR以及CR的简单介绍

    AR 增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像.视频.3D模型的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互 ...

  5. Restful levels &HATEOAS基本介绍~

    本文所涉及的内容摘自:http://www.manongjc.com/article/93934.html 什么是RESTful REST这个词,是Roy Thomas Fielding在他2000年 ...

  6. 使用maven-tomcat7-plugins时调试出现source not found解决

    直接看下面的步骤: 步骤1: 步骤2: 步骤3: 步骤4:

  7. Javascript var 和 let 的区别

    Javascript var 和 let 的区别 var 是函数块的全局变量. let 是代码块的局部变量. let 变量不会提升,如果先使用后定义会 undefind. 参考: https://de ...

  8. 浅谈JS的数组遍历方法

    用过Underscore的朋友都知道,它对数组(集合)的遍历有着非常完善的API可以调用的,_.each()就是其中一个.下面就是一个简单的例子: var arr = [1, 2, 3, 4, 5]; ...

  9. 修改postgres密码

    转载自:https://www.cnblogs.com/kaituorensheng/p/4735191.html   1. 修改PostgreSQL数据库默认用户postgres的密码 Postgr ...

  10. Mycat 镜像-创建 Docker 镜像

    将 Mycat-server 创建到镜像,使其能够进行容器化部署,我们需要创建 Dockerfile 并在文件中安装其依赖项,使用 centos 做为 base 镜像,并安装 jdk 依赖即可,因此创 ...