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)锁:悲观锁、乐观锁