Hibernate介绍与简单使用示例代码
1 技术介绍
1.1、Hibernate
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架。hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。
什么是ORM?
所谓的ORM,对象关系映射(Object Relation Mapping),指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。可以把ORM理解为关系型数据和对象的一个纽带,开发人员只需要关注纽带一端映射的对象即可。
1.2、作用
- 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
- Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作
- hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
- hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
1.3.1、优势
- 对象化。
- 更好的移植性。
- 开发效率高。
- 缓存机制的使用。
1.3.2、不足
- 灵活性和效率不如原生JDBC程序。
- 配置文件复杂。
- 不适于复杂关系的数据表维护。
- 批量操作上的弱势。
1.4、与MyBatis的对比
相同点
- Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。
- Hibernate和MyBatis都支持JDBC和JTA事务处理。
不同点
- hibernate是全自动,mybatis是半自动
- hibernate数据库移植性远大于mybatis
- hibernate拥有完整的日志系统4、mybatis相比hibernate要关心很多细节
- sql直接优化上,mybatis要方便很多
- 缓存机制上,hibernate要更好一些
2 使用示例
2.1、基本配置
这里讲的是XML配置,包括:
(1)核心配置文件:hibernate.cfg.xml (放到src目录下)
(2)映射配置文件:***.hbm.xml(与实体类放同一目录),主要是用于描述类与数据库中的表的映射关系
核心配置文件:hibernate.cfg.xml
-
数据库连接配置
-
方言配置
-
映射文件配置
映射配置文件:***.hbm.xml
-
建立类与表的映射
-
建立属性与主键的映射
-
建立普通属性和表中的字段相对应
2.2、工作原理
- Configuration().configure()读取并解析hibernate.cfg.xml配置文件
- 由hibernate.cfg.xml中的<mapping resource=“**.hbm.xml”/>读取并解析映射信息
- config.buildSessionFactory();创建SessionFactory
- sessionFactory.openSession();打开Sesssion
- session.beginTransaction();创建事务Transation
- persistent operate持久化操作//一般指Save方法
- session.getTransaction().commit();提交事务
- 关闭Session
- 关闭SesstionFactory
2.3、常用API
org.hibernate.cfg.Configuration
加载主配置文件以及映射文件,启动 hibernate。
主配置文件中主要有:数据库连接四要素,方言,数据源…
默认获取 hibernate.cfg.xml 配置文件
SessionFactory接口
用来获取和管理我们的seesion,它在hibernate中其实是相当于一个缓冲区的作用
这个接口是hibernate的一个重量级对象,系统开销大(重要)。
它是单例的,但是它是线程安全的
Session接口
应用程序和数据库的一次交互(会话),每次执行一个数据库的事务,都要创建新的session实例,用完以后需要关闭,不关闭,session 会不够用,内存会崩溃。
一个轻量级的接口,它是多例的,但是它是线程不安全的。
如果要保证一个线程一个session,所以需要在hibernate.cfg.xml里面配置
2.4、例子一:Java中使用Hibernate(结尾附代码)
-
环境:Windows 10 + Eclipse Java 2019-09 + Mysql 8
-
创建数据库和表,这里使用的数据库是Mysql,可视化工具是Navicat
-
创建项目
-
导入jar包
-
创建实体类 Student.java
-
编写Hibernate的配置文件 Student.hbm.xml,在实体类同一个包下创建
其中,主键字段必须加上
否则会报错
Repeated column in mapping for Student:(should be mapped with insert="false" update="false")
-
编写Hibernate的配置文件 hibernate.cfg.xml,在src下创建
-
创建单元测试类 StudentTest1.java
-
启动测试类
- 查看数据库,成功添加记录
- 整个工程的结构
2.5、例子二:在Spring中整合Hibernate(结尾附代码)
-
环境:Windows 10 + Eclipse Java 2019-09 + Mysql 8
-
创建maven项目,添加依赖
-
添加配置文件applicationContext.xml文件,配置数据库的驱动连接和sessionFactory的初始化对象
-
工程代码目录结构
-
使用注解方式,实现实体类对应的数据库表
-
实体类 Student.java 主键属性需要加上@Id,否则会报错
-
StudentDao.java 实现一个创建记录的方法
-
StudentService.java
-
测试类 App.java
-
启动测试类
-
数据库实现记录创建
代码链接
链接
提取码:qjqn