Hibernate框架
-
持久化类的编写规范
持久化类:与配置文件做映射的实体类,包括javaBean、配置文件。
编写规范:
-
提供无参的构造方法(hibernate通过无参构造实例化对象)
-
所有属性私有化
-
提供get、set方法
-
基本类型与包装类型,建议全部用包装类型(防止有歧义)
-
持久化类不能被final修饰,hibernate的优化手段会失效
如:延迟加载会变成立即加载,因为load查询返回的是代理对象,而此代理对象是由实体类的子类生成的。
-
持久化类必须由标识属性(OID属性)
表示属性(OID属性)就是与表主键建立映射关系的属性
Ps:标识属性的作用
OID(Object Identifie的简称),hibernate用它来区分多个对象是否为同一个。
Jvm中用内存中的地址区分对象,
数据库中用主键区分对象,
Hibernate中用OID区分对象
使用Hibernate中提供的“主键生成策略”来保证OID的唯一性。
-
主键生成策略
针对数值类型:native
针对字符创类型:uuid
Ps主键也可以不用hibernate维护,自己动手在程序中设定唯一非空(assigned)uuid。
-
持久化类的三种状态,及互相装换
瞬时态:当前持久化类 没有oid属性 没被session操作管理
持久态:当前持久化类 有oid属性 有被session操作管理
托管态(离线态):当前持久化类 有oid属性 没被session操作管理
Ps:持久态特点
只要涉及到查询返回的就都是持久化类的持久态对象
只要持久态对象修改完属性,不需执行更新操作,会自动更新数据库
(因为有一级缓存的存在)
-
一级缓存的原理
session.get(Customer.class,"abcdefg"); // 去数据库查询,查完了之后放在一级缓存中
一级缓存
存储区
放一份
快照区
备份一份
ct.setCust_name("rose1234"); // 去一级缓存中的存储区修改了内容,但是快照区不修改
一级缓存
存储区
修改了
快照区
以前的
tx.commit(); // 去一级缓存中,将存储区和快照区的数据都拿出来对比
一致: 什么都不做
不一致: 自动发送update语句做数据的数据更新
关闭缓存的办法:session.close(); //session关闭,缓存也销毁
session.clear(); //clear可以清空一级缓存的所有数据
session.evict(); //可清空一级缓存某一个对象的数据
-
针对单表批量查询的方式:Query的HQL查询
Configuration configuration = new Configuration();
//自动去src下加载名字叫hibernate.cfg.xml的配置文件
configuration.configure();
SessionFactory sessionFactory =configuration.buildSessionFactory();
Session session =sessionFactory.openSession();
Transaction tx = session.beginTransaction();
// Query方式的HQL查询
Queryqr = session.createQuery("from Customer");
List<Customer> list =qr.list();
for (Customer customer : list) {
System.out.println(customer);
}
//提交事务,关闭连接
tx.commit();
session.close();
}
-
针对单表批量查询的方式:Criteria的QBC查询(完全面向对象)
Configuration configuration = new Configuration();
//自动去src下加载名字叫hibernate.cfg.xml的配置文件
configuration.configure();
SessionFactorysessionFactory = configuration.buildSessionFactory();
Sessionsession = sessionFactory.openSession();
Transactiontx = session.beginTransaction();
// Criteria方式的QBC查询
Criteria iter =session.createCriteria(Customer.class);
//条件查
Iter.add(Restrictions.like(“cust_name”, “b%”));
//分页查
Iter.setFirstResult(1);
Iter.setMaxResult(3);
//排序查
Iter.addOrder(Order.desc(“cust_id”));
//聚合查
Iter.setProjection(Projection.rowCount());
Object obj = iter.uniqueResult();