什么是Hibernate?
- Hibernate是我们JavaEE开发中的DAO层框架
- DAO【Data Access Object】 数据访问对象层
- 在DAO层,访问数据库,进行CRUD操作
- Hibernate是对JDBC的封装,最大的好处就是不用手写SQL
ORM思想?
即:Object Relation Mapping 对象关系映射
- 数据库结构和Java语言结构形成关系映射
- 一张数据表对应了一个JavaBean【实体类Entity or Pojo】
- 一张表的一个字段【列】对应了JavaBean的一个属性
- 一张表的一个记录对应了JavaBean的一个实例
什么是POJO、Entity、JavaBean?
- POJO(Plain Ordinary Java Object) 普通Java对象
- Entity 实体的,即实体类
- JavaBean
用于在Java中构建映射数据库的对应结构,
数据库的操作可以被Java程序控制
回顾原生JDBC的操作
import org.junit.Test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; /** * @author ArkD42 * @file Hibernate * @create 2020 - 05 - 10 - 8:50 */ public class OriginalJdbc { @Test public void jdbc() throws Exception { // 注册驱动 MySQL5.0+ 可以不注册了 // Class.forName("com.mysql.cj.jdbc.Driver"); // 创建连接 Connection connection = DriverManager.getConnection( "jdbc:mysql:///ssm?serverTimezone=Asia/Shanghai", "root", "123456" ); // 编写SQL 创建预编译SQL对象并注入 String sql = "SELECT * FROM user;"; PreparedStatement preparedStatement = connection.prepareStatement(sql); // 查询返回结果集,增删改返回结果记录数 ResultSet resultSet = preparedStatement.executeQuery(); // 对查询的结果集进行处理 // 释放资源 preparedStatement.close(); connection.close(); } }
对结果集的处理最好的办法就是使用ORM对数据表映射出一个Java实体类
我们使用这个类来对应结果集接收数据,以便我们方便的操作和处理
再没有ORM思想的情况下,我们能想到的就是以容器来处理
例如个单个记录的多个字段与值,因为字段是唯一的,值可能重复
那这个特性我们可以是用Map容器来存储一个记录,
如果有若干个结果集记录,我们就对Map再进行一个组合,封装进List容器处理
改正初学时的JDBC工具类:
当时写的是在静态代码块里面,如果连接对象资源释放了,静态连接对象的引用会空指针
所以不能写一个静态连接对象的引用
而是直接写进封装的方法里面获取
package cn.dai.util; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; /** * @author ArkD42 * @file Hibernate * @create 2020 - 05 - 10 - 9:04 */ public class JdbcUtil { static String url ; static String username; static String password; static { try { // Class.forName("com.mysql.cj.jdbc.Driver"); InputStream inputStream = JdbcUtil.class.getClassLoader().getResourceAsStream("jdbc.properties"); Properties properties = new Properties(); properties.load(inputStream); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); } catch (Exception exception) { exception.printStackTrace(); } } public static Connection getConnection(){ try { return DriverManager.getConnection(url, username, password); } catch (SQLException sqlException) { sqlException.printStackTrace(); } return null; } }
持久化
狭义的理解,“持久化”仅仅指把对象永久保存到数据库中
广义的理解,“持久化”包括和数据库相关的各种操作:
保存:把对象永久保存到数据库中。
更新:更新数据库中对象(记录)的状态。
删除:从数据库中删除一个对象。
查询:根据特定的查询条件,把符合查询条件的一个或多个对象从数据库加载到内存中。
加载:根据特定的OID,把一个对象从数据库加载到内存中。
为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。
在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID).
主流持久化框架:
Hibernate
myBatis
TopLink
OJB
Hibernate 完成对象的持久化操作,允许开发者采用面向对象的方式来操作关系数据库。 消除那些针对特定数据库厂商的 SQL 代码
MyBatis 相比 Hibernate 灵活高,运行速度快 开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语 句,并且熟练使用sql语句优化功能