Hibernate详解
项⽬⽂件jar包(Hibernate1.rar)
hibernate路线图
Hibernate 简介(优点和缺点)
Hibernate ⼊门案例(基于XML的操作⽅式)
Hibernate 配置⽂件详解(基于xml的⽅式)
Hibernate 常⽤api介绍 (事务,回顾脏读,不可重复读(⾏级,读更改),幻读(表级读新增)以及数据库隔离级别.并发事务的解决悲观锁和乐观锁机制)
使⽤Hibernate框架完成 CRUD 操作
Hibernate 的对应关系详解(使⽤注解的⽅式进⾏配置,摘取⼀对多进⾏代码数据⽰例操作)
1.Hibernate 简介
同样的hibernate框架是基于jdbc轻量级进⾏的封装在这⾥我们再次提到⼀下这个叫做ORM(⾯向对象进⾏数据结构的设计)
⾯向对象进⾏数据结构的设计和数据库表的设计有什么不同
hibernate讲究的是全⾃动对象映射,与mybatis不同,mybatis讲究的是半⾃动映射
最先本质是为了解决java程序员设计对象的问题,是java的开发⼈员不关⼼数据库设计和范式定律
随着业务场景的复杂以及追求可插拔的⾼度⾃由化,当然同时也是为了以后springBoot中使⽤JPA做铺垫,hibernate中我们除了在初次使⽤的时候使⽤XML配置后,hibernate的级联关系操作我们采取使⽤注解的⽅式进⾏操作
准确的来说hibernate有的东西,mybatis也有.
2.Hibernate ⼊门案例(基于XML的操作⽅式)
1.构建⼀个新的项⽬(引⼊的jar包)
2.分别编写实体和对应的映射⽂件person.clas 和 l
public class Person {
private int  pid;
private  String pname;
private  Date  bir;
}
/
/------------映射⽂件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"hibernate.sourceforge/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--映射哪⼀个实体类,以及表名-->
<class name="del.Person" table="person">
<!--主键的⽣成策略采⽤⾃增  name为对象的属性-->
<id name="pid" column="pid">
<generator class="increment"></generator>
</id>
<property name="pname" column="pname"></property>
<property name="bir" column="bir"></property>
</class>
</hibernate-mapping>
3.编写全局声明配置⽂件 src下 (log4j保持最先的⼀致)
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"hibernate.sourceforge/hibernate-configuration-
3.0.dtd">
<hibernate-configuration>
<session-factory>
<!--⽅⾔保证控制台输出效果⼀致-->
<property name="dialect">
org.hibernate.dialect.MySQLDialect</property>
<!--数据库驱动jar包-->
<property name="connection.driver_class">
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!--显⽰sql语句是否格式化sql语句-->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">true</property>
<!--执⾏DDL的⽅式,create:每⼀次运⾏都会覆盖原表中的内容 update:保留原表中的内容--> <property name="hibernate.hbm2ddl.auto">update</property>
<!--将我们的对象和表的映射⽂件加载到主配置⽂件中-->
<mapping resource="com/wwj/model/l"/>
</session-factory>
</hibernate-configuration>
4.构建操作,对⽐mybatis执⾏流程动作
/**
*
* @author wwj
* 1: 读取全局配置⽂件
* 2: 构建 sessionFactory
* 3: 创建 session(会话)
* 4: 开启transcation
* 5: 操作数据(CRUD)
* 6: 提交事务 transcation
* 7: 关闭 session
*
*/
public class TestHT {
public static void main(String[] args)throws ParseException {
/
/先处理下时间
SimpleDateFormat sf1 =new SimpleDateFormat("yyyy-MM-dd");
String format = sf1.format(new Date());
Date parse = sf1.parse(format);
// 读取配置⽂件,实例化默认的寻名字为 l
Configuration cfg =new Configuration().configure();
// 构建 session ⼯⼚
SessionFactory sf = cfg.buildSessionFactory();
// 创建 session
Session session = sf.openSession();
// 操作数据 (insert delete update) ⼿动开启事务
Transaction bt = session.beginTransaction();
// 操作数据  (注意这⾥的⾯向对象操作)
Person per =new Person();
per.setPname("张三");
per.setBir(parse);
// CRUD操作
session.save(per);
// 提交事务
btmit();
session.close();
}
}
观察控制台的输出结果以及数据库表的结构
4. Hibernate常⽤api介绍
基本上⼤部分的框架都有⼀个叫做config的接⼝(使⽤xml解析填写的配置⽂件)
xxxFactory,万物皆有⼯⼚造出来,不会平⽩⽆故的⽣成(⼯⼚模式)
⼯⼚虽然可以有很多,⼯⼚很庞⼤,庞⼤就耗资源,所以我们才考虑对象的⽣成(单例模式)
(1)事务的ACID
原⼦性(Atomicity) 要么买要么就不买
⼀致性(Consistency)有买有卖,不能空仓打粮仓
隔离性(Isolation) ⼤家交易同⼀个物品的时候(互相⼜看不到)但是⼜不应该出现价格的相互影响(信息的壁垒)持久性(Durability) 有迹可循,有记录
(2)事务并发
多个线程访问数据库同⼀条数据
脏读:⼀个事务读取到了另⼀个事务未提交的数据。
不可重复读(⾏级):⼀个事务范围内,两个相同的查询却得到了不同的结果。
幻读(表级):⼀个事务范围内,两个相同的查询却得到了不同的结果。
不可重复读发⽣点在⼀⾏上⾯,⽽幻读是发⽣在整张表上⾯
⾏级锁机制和表级锁都等同于操作上⾯仅且只有⼀个事务
补充说明:通过数据所提供的隔离级别(由低到⾼)
ISOLATION_READ_UNCOMMITTED:这是事务最低的隔离级别,它充许令外⼀个事务可以看到这个事务未提交的数据。这种隔离级别会产⽣脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED:保证⼀个事务修改的数据提交后才能被另外⼀个事务读取。另外⼀个事务不能读取该事务未提交的数据
ISOLATION_REPEATABLE_READ:这种事务隔离级别可以防⽌脏读,不可重复读。但是可能出现幻像读。它除了保证⼀个事务不能读取另⼀个事务未提交的数据外,还保证了避免下⾯的情况产⽣(不可重复读)。
ISOLATION_SERIALIZABLE:这是花费最⾼代价但是最可靠的事务隔离级别。事务被处理为顺序执⾏。除了防⽌脏读,不可重复读外,还避免了幻像读。
重点说明 (Hibernate操作数据都是先查在操作)
悲观锁机制:也就是同步执⾏,⼀个⼀个来 查询语句加上for update
乐观锁: 使⽤版本号的机制
⼤家先查,看到的版本默认为1
做增加删除修改的时候在版本号上⾯加1 帅选条件要根据当前版本号 最后提交总有先后
有⼀个操作⼀定会发⽣异常,通过捕获异常来进⾏下⼀步的处理
5.使⽤ Hibernate 框架完成 CRUD 操作
public class TestHT {
public static void main(String[] args)throws ParseException {
//先处理下时间
SimpleDateFormat sf1 =new SimpleDateFormat("yyyy-MM-dd");  String format = sf1.format(new Date());
Date parse = sf1.parse(format);
// 读取配置⽂件,实例化默认的寻名字为 l
Configuration cfg =new Configuration().configure();mysql下载后的初次使用
// 构建 session ⼯⼚
SessionFactory sf = cfg.buildSessionFactory();
// 创建 session
Session session = sf.openSession();
// 操作数据 (insert delete update) ⼿动开启事务
Transaction bt = session.beginTransaction();
// 操作数据
Person per =new Person();
per.setPname("张三");
per.setBir(parse);
// CRUD操作
// --1 .增加
session.save(per);
// --2 .查询(如果查询多个,需要⽤到hql语句)
Person p =(Person) (Person.class,1);
// --3. 修改需要先查
p.setPname("⼩李");
session.update(p);
// -- 删除
session.delete(p);
/
/ -- 查询所有
Query createQuery = ateQuery("from Person");
List<Person> list = createQuery.list();
for(Person pp:list){
System.out.Pname());
}
// 提交事务
btmit();
session.close();
}
6.Hibernate的对应关系详解 (采⽤注解的⽅式)
1.⼀对⼀双向注解
Dad类

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。