Hibernate学习笔记(二)
Hibernate概述:
什么是Hibernate:是一个持久层的ORM的框架
什么是ORM:
ORM:对象关系映射,指的是将一个java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以完成数据库的相关操作
为什么学习Hibernate
简化JDBC的开发
性能很好
Hibernate的API
Configuration:加载配置文件
SessionFactory:内部维护连接池。配置C3p0连接池,自定义工具类。
Session:
维护一级缓存,与数据库交互桥梁。
常用的方法:
save(Object obj)
get()/load()
update()
delete()
saveOrUpdate()
Transaction:
commit();
rollback();
#####持久化类编写的规则
持久化类的概述
【】什么是持久化?将内存中的一个对象持久化到数据库中过程。Hibernate框架就是用来进行持久化的框架
【】什么是持久化类?一个java对象与数据库的表建立了映射关系,那么这个类在Hibernate中称为是持久化类
【】持久化类=java类+映射文件
持久化类编写的规则
【】对持久化类提供一个无参数的构造函数 Hibernate底层需要使用反射生成实例
【】属性需要私有,对私有属性提供public的get和set函数的方法 Hibernate中获取,设置对象的值
【】对持久化类提供一个唯一标识OID与数据库主键对应 java中通过对象的地址区分是否是同一个对象,数据库中通过主键确定是否是同一记录,
在Hiberbate中通过持久化类的OID的属性区分是否是同一对象
【】持久化类中属性尽量使用包装类类型 因为基本数据类型默认是0,那么0就会有很多的歧义。包装类类型默认值就是null
【】持久化类不要使用final进行修饰
#####主键生成策略
######持久化类的三种状态
######Hibernate的一级缓存
//区分三种状态 public void demo1(){ Session session=HibernateUtils.GetSession(); //手动开启事务 Transaction transaction=session.beginTransaction(); HibernateDemo1 hibernateDemo1=new HibernateDemo1();//瞬时态对象:没有唯一标识OID,没有被Session管理 hibernateDemo1.setCust_name("XXXX"); session.save(hibernateDemo1);//持久态对象:有唯一标识OID,被Session管理 transaction.commit();//事件的提交 session.close();//会话关闭 //session.clear();//清空所有 //session.evict(hibernateDemo1);//清空一个对象。这是一级缓存的管理处理 //脱管态对象:有唯一标识对象OID,没有被Session管理 System.out.println("客户名称:"+hibernateDemo1.getCust_name()); }
#####事务的回首
【】事务:事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么全部成功,要么全部都失败
【】事务:事务指的是逻辑上的一组操作,组成这组操作的各个逻辑单元要么全部成功,要么全部都失败
####事务的特性:
【】原子性:代表事务不可分割
【】一致性:代表事务执行前后,数据的完整性保持一致
【】隔离性:代表一个事务执行的过程中,不应该受到其他事务的干扰
【】持久性:代表事务执行完成后,数据就持久到数据库中
####如果不考虑隔离的问题,会引发如下的安全问题:
【】读问题
#脏读:一个事务读到另一个事务未提交的数据
#不可重复读:一个事务读到另一个事务已经提交的update数据,导致在前一个事务多次查询的结果不一致
#虚读:一个事务读到另一个事务已经提交的insert数据,导致在前一个事务多次查询的结果不一致
【】写问题(了解)
#引发两类丢失更新
【】读问题的解决
#设置事务隔离级别
#Read uncommitted 以上都问题都会发生
#Read committed 解决脏读,但是不可重复读和虚读有可能发生
#Repeatable read 解决脏读和不可重复读,但是虚读有可能发生
#Serializable 解决所有读问题
一般的情况下,数据库通常会使用第二或者第三种方式隔离,默认的oracle是使用第二种,而mysql是使用第三种
关于在Hibernate中配置隔离的相关的问题--照片
设置隔离级别 <property name="hibernate.connection.isolation">4</property>
####sevice事务:
#####Hibernate的其他API
【】Query
public void queryTest(){ Session session=HibernateUtils.GetSession(); //手动开启事务 Transaction transaction=session.beginTransaction(); //通过Session获得Query接口 String hql="from HibernateDemo1";//查询HIbernateDemo1中的对应表的数据,可以设置where org.hibernate.Query query=session.createQuery(hql); //设置条件 //query.setParameter(0, "1"); //设置分页 query.setFirstResult(0);//起始数据 query.setMaxResults(2);//每页的显示数 List<HibernateDemo1> list=query.list(); transaction.commit();//事件的提交 session.close();//会话关闭 }
【】Criteria
public void CriteriaTest(){ Session session=HibernateUtils.GetSession(); //手动开启事务 Transaction transaction=session.beginTransaction(); //通过session获得Criteria的对象 /* Criteria criteria=session.createCriteria(HibernateDemo1.class); List<HibernateDemo1>list=criteria.list();//获取数据表的全部信息*/ //条件查询 Criteria criteria=session.createCriteria(HibernateDemo1.class); criteria.add(Restrictions.like("cust_name","宋%")); List<HibernateDemo1>list=criteria.list();//获取到查询的信息 //设置分页 criteria.setFirstResult(0); criteria.setMaxResults(3); transaction.commit();//事件的提交 session.close();//会话关闭 }
【】SQLQuery
信息类:
public class HibernateDemo1 { private long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_phone; private String cust_mobile; public long getCust_id() { return cust_id; } public void setCust_id(long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; } public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) { this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "HibernateDemo1 [cust_id=" + cust_id + ", cust_industry=" + cust_industry + ", cust_level=" + cust_level + ", cust_mobile=" + cust_mobile + ", cust_name=" + cust_name + ", cust_phone=" + cust_phone + ", cust_source=" + cust_source + "]"; } }
工具类:
public class HibernateUtils { //这个包的主要重用是为了放置工具类 //这个工具类是Hibernate的工具类 public static final Configuration cfg; public static final SessionFactory sf;//创建一个SessionFactory对象:类似于JDBC中连接池 static{ //加载Hibernate核心配置文件 cfg=new Configuration().configure(); sf=cfg.buildSessionFactory();//此处相当于创建工厂 } //对外设置一个接口 public static Session GetSession(){ //通过SessionFactory获取到Session对象,类似于JDBC中的Connection return sf.openSession(); } }