我对hibernate的理解

1.hibernate简介:
hibernate是一个ORM(对象关系映射)开源轻量级框架,它对JDBC做了封装,我们使用面向对象的思想来操作数据库:
hibernate的核心接口:
(1)Session:负责被持久化对象的CRUD操作;
(2)SessionFactory:负责初始化hibernate,创建Session
(3)Configuration:负责配置和启动hibernate,创建SessionFactory
(4)Transition:负责事务相关操作
(5)Query和Criteria:负责执行各种数据库查询

2.hibernate的工作原理
(1)Configuration config=new Configuration().configure();//读取并解析hibernate.cfg.xml配置文件
(2)由hibernate.cfg.xml中的<mapping resoure=“xxx.xxx.Student.hbm.xml” - >读取并解析映射信息
(3)通过SessionFactory sessionFactory=config.buildSessionFactory();//创建SessionFactory
(4)Session session=sessionFactory.openSession();//打开session
(5)Transition tx=session.beginTransition();//创建并打开事务
(6)操作数据、持久化操作
(7)tx.commit()提交事务
(8)关闭session
(9)关闭SessionFactory

3.hibernate优点
(1)封装JDBC,简化了数据访问层繁琐的重复性代码
(2)是优秀的ORM实现;简化了DAO层的编码工作
(3)hibernate使用java反射机制,而不是字节码增强程序来实现透明性;
(4)性能好、映射灵活、支持各种关系数据库、从一对一到多对多的各种复杂关系;

4.Session对象操作持久化对象,常用方法有:save()、get()、load()、update()、
delete()、saveOrUpdate()
(1)save()方法

Transition t=session.beginTransition();
Student  stu=new Student();
stu.setUsername("wanlong");
session.save(stu);   //save()方法保存持久化对象
t.commit();

注意:save()方法只是将临时对象加入Session缓存中,只有调用了事务commit方法才将对象插入到数据库

(2)get()和load()
Session的get()和load()是用来加载持久化类的对象

获取id为1的Student对象
Student  stu=(Student) session.get(Student.Class,1)
//Student  stu=(Student)Session.load(Student.Class,1)

区别:

  • 数据表中不存在时,get()返回null;load()抛异常
  • load()会先到缓存中查询,如果没有则返回一个代理对象(不马上去数据库查询),等到后面使用到这个代理对象的时候,才到数据库查询,若没有找到,抛异常;get()会先到缓存查询,如果没有就直接查询数据库,还没有就返回null
  • load()支持延迟加载,get不支持 (class标签的lazy=默认true 延迟加载;false:立即加载)

延迟加载:用到后才到数据库中查询

(3)update():需先查询到这个对象、才能对它进行修改(先查后改)

Transition t=session.beginTransition();
Student stu=(Student) session.get(Student.Class,"1");  //立即加载
stu.setName("wanlong");
session.update(stu);
t.commit();

(4)delete():先得到对象,再进行删除(同理)
(5)saveOrUpdate():如果数据库中没有,则执行的是save();反之,update()


5.HQL查询:Query接口
(1)基本查询:

Transition t=session.beginTransition();
String hql="";
Query  query=session.createQuery(hql);
List   list=query.list();
t.commit();

(2)条件查询

Transition t=session.beginTransition();
String hql="from  Student  where  name=?";
Query  query=session.createQuery(hql);
query.setParameter(0,"wanlong")   //设置参数    注意从0开始
List   list=query.list();
t.commit();

(3)分页查询

query.setFirstResult((page-1)*size);   //从第几条开始
query.setMaxResult(size);  //查几条
或者直接使用mysql  的   limit    

6.hibernate的批处理
(1)通过hibernate批处理
(2)绕过hibernate调用JDBC进行批处理
7.持久对象的生命周期
(1)瞬时态
Student stu=new Student()
stu.setName(“wanlong”);
只是将对象创建出来,与数据库没有任何关联
(2)持久态:对象有hibernate框架所管理的状态
session.save(stu); //save()将对象转化持久态
Student stu1=session.load(Student.Class,“1”);//load()将托管状态转为持久态
(3)托管状态
对应的Session实例关闭后,此对象处于托管状态
session.close(); //此时stu处于托管状态

8.Hibernate并发处理:
出现问题:更新丢失、脏读、虚读、不可重复读
解决办法:
1)事务隔离级别:串行化、可重复读取、读已提交数据、读未提交数据
2)锁:悲观锁、乐观锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值