hibernate笔记.docx
《hibernate笔记.docx》由会员分享,可在线阅读,更多相关《hibernate笔记.docx(61页珍藏版)》请在冰豆网上搜索。
hibernate笔记
Hibernate课堂笔记
Hibernate第一天
一:
hibernate的基础知识
1:
Hibernate的入门配置:
1:
建立itcast1102Hibernate工程
2:
建立数据库itcast1102hibernate,可将编码格式设置成UTF-8
3:
引入hibernate相关的jar包
4:
在cn.itcast.a_primer中创建持久化对象的javabean,hibernate的实质就是操作对象的过程,就是操作数据库表。
publicclassCustomerimplementsSerializable{
privateIntegerid;
privateStringname;
privateIntegerage;
privateStringdes;
省略set和get方法
}
5:
在cn.itcast.a_primer中创建hibernate.cfg.xml,hibernate.cfg.xml是hibernate的核心配置文件,用来查询数据库,配置如何操作数据库,加载映射文件等。
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
--连接数据库-->
com.mysql.jdbc.Driver
jdbc:
mysql:
//localhost:
3306/itcast1102hibernate?
useUnicode=true&characterEncoding=utf8
root
root
--其他配置-->
--方言:
用来指定hibernate操作的数据库-->
org.hibernate.dialect.MySQL5Dialect
--hibernate操作对象用来执行操作数据库表,在控制台中显示sql语句-->
true
--
hibernate.hbm2ddl.auto:
用来建立对象和表的关联
*create:
每次都会先删除表,再创建表,问题不能保存数据
*none:
默认值:
有表的时候,可以直接操作,没有表就会报错,默认向表中追加数据
*update:
没有表就创建表,有表就直接操作数据
-->
update
--加载映射文件
1:
class="cn.itcast.a_primer.Customer"(要求类和映射文件放在同一个目录下,而且文件名要相同)
2:
resource=cn/itcast/a_primer/Customer.hbm.xml(第二种方式)
-->
6:
在同级目录下创建hibernate的映射文件(映射文件用来将持久化对象和属性关联数据库表和字段
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
--
建立持久化对象和数据库表的关联关系(映射文件)
*类映射表
*类中的属性映射表中的字段
-->
--
对象关联表
name:
对象的全路径(底层使用反射)
table:
映射表的名称
-->
--
对象的属性映射表的字段
type:
表示hibernate的映射类型,用来建立java类型和数据库类型的桥梁
*使用java类型,比如java.lang.Integer
*integer
name:
对象中的属性名称
column:
表中的字段名称
*generator:
hibernate的生成策略(重点)
sql-type="varchar(20)",指定数据库表中列的类型,默认是varchar(255)
-->
7:
使用测试代码进行测试,创建App的测试类,使用junit进行测试
(1)hibernate的SessionFactory在初始化阶段只初始化一次即可,所有使用静
态代码块进行封装,其中Configuration是用来加载hibernate的配置文件和映射文件的,加载后可以获取SessionFactory。
privatestaticSessionFactorysf=null;
static{
Configurationconfiguration=newConfiguration();
configuration.configure("cn/itcast/a_primer/hibernate.cfg.xml");
configuration.addClass(Customer.class);
sf=configuration.buildSessionFactory();
}
(2)新增保存:
save方法
/**保存*/
@Test
publicvoidsave(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=newCustomer();
c.setName("洪七公");
c.setAge(60);
c.setDes("帮助");
s.save(c);
mit();//实质上执行了2步操作,1:
s.flush();//清理缓存,让session缓存中的数据与数据库同步,2:
事务提交
s.close();//Session的缓存就没有了
}
(3)更新:
update方法
/**更新*/
@Test
publicvoidupdate(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=newCustomer();
c.setId(3);
c.setName("黄老邪");
c.setAge(59);
c.setDes("药师");
s.update(c);
mit();
s.close();
}
(4)删除:
delete方法
@Test
publicvoiddelete(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=newCustomer();
c.setId(3);
s.delete(c);
mit();
s.close();
}
(5)查询:
get和load方法
/**使用ID查询信息*/
@Test
publicvoidfindCustomerById(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=(Customer)s.get(Customer.class,2);
System.out.println(c.getId()+""+c.getName()+""+c.getAge()+""+c.getDes());
mit();
s.close();
}
(6)查询:
query查询(支持hql语句,sql语句,qbc语句)
/**查询所有信息*/
@Test
publicvoidfindAllCustomerList(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
/**使用Hql语句:
操作持久对象和属性
*复习sql语句:
操作数据库表和数据库表的列*/
Queryquery=s.createQuery("fromCustomero");
Listlist=query.list();
if(list!
=null&&list.size()>0){
for(Customerc:
list){
System.out.println(c.getId()+""+c.getName()+""+c.getAge()+""+c.getDes());
}
}
mit();
s.close();
}
2:
hibernate是一个ORM技术的实现
1:
ORM
ORM:
(Object/RelationMapping):
对象/关系映射
ORM中间件的使用方法
采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。
只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。
2:
hibernate之所以操作javabean的过程即操作数据库的表,这hibernate底层会调用javabean持久化对象的set和get方法,对数据进行赋值和取值,并获取字段名称,组织sql语句,并执行sql语句,达到效果
3:
hibernate要求javabean中要使用包装数据类型(Integer,Long,String等)
二:
映射对象标识符
1:
Hibernate的唯一性标识
(1)Java按地址区分同一个类的不同对象.
(2)关系数据库用主键区分同一条记录.
(3)Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。
对象的OID和数据库的表的主键对应。
为保证OID的唯一性,应该让Hibernate来为OID付值。
2:
hibernate支持自然主键和代理主键
(1)自然主键:
具有业务含义的字段,如name
(2)代理主键:
不具有业务含义的字段,如id
3:
hibernate生成OID的策略代码
掌握increment、identity、assigned(自然主键)、uuid、联合主键
在Customer.hbm.xml中:
联合主键
4:
理解hibernate的一级缓存和快照
(1)一级缓存:
●hibernate在内存地址中存在一个一级缓存,存在在一级缓存中的对象,就说明该对象具有了持久化的能力,如果对象具有持久化能力就能操作数据库。
测试代码:
/**
*知识点5:
Hibernate中用对象表示符(OID)来区分对象
*OID是关系数据库中的主键在java对象模型中的等价物。
*在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。
*
测试一级缓存
**/
@Test
publicvoidsave(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=newCustomer();
c.setName("小龙女");
c.setAge(10);
c.setDes("美女");
s.save(c);
mit();//实质上执行了2步操作,1:
s.flush();//清理缓存,让session缓存中的数据与数据库同步,2:
事务提交
s.close();//Session的缓存就没有了
}
●存放在一级缓存中的数据,如果在Session关闭之前,再次查找相同OID对象时,此时不会查询数据库,而是从缓存中获取,缓存中没有对应的OID对象,才会查询数据库,这样对数据库的查询性能做了优化。
测试代码:
/**
**测试一级缓存的作用
*当使用id查询数据库表的数据的时候,hibernate会先到session的一级缓存中查找,
**如果没有找到就会查询数据库
**如果找到了,就直接返回对象,返回的对象和Session一级缓存的对象是一样的
*
*当Session关闭的时候,一级缓存的数据就没有了
**/
@Test
publicvoidtestFirstCache(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc1=(Customer)s.get(Customer.class,2);//产生select语句
Customerc2=(Customer)s.get(Customer.class,2);//不产生select语句
Customerc3=(Customer)s.get(Customer.class,2);//不产生select语句
mit();
s.close();
////////////////////////////////////////////////////
s=sf.openSession();
tr=s.beginTransaction();
Customerc4=(Customer)s.get(Customer.class,2);//产生select语句
mit();
s.close();
}
(2)快照
●Hibernate除了在内存中定义一级缓存之外,还存在一个快照区域(即对数据库数据的一份复制),在提交事务(清理缓存)的时候,会用缓存的数据和快照的数据进行比对,如果没有发生变化不执行update语句,如果发生了变化,则执行update语句
测试代码:
/**
*测试快照
*hibernate将查询获取到结果,放置到Session的一级缓存中一份,同时也放置到快照中一份(相当于对数据库数据的一个份复制)
**当改变Session的一级缓存中的数据,然后提交事务,清理缓存的时候,hibernate会根据一级缓存中的数据和快照中的数据进行比对
**如果发生了变化,就会执行update语句
**如果没有发生编号,不会执行update语句,更新的方向是从缓存到数据库
**/
@Test
publicvoidtestPhoto(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
Customerc=(Customer)s.get(Customer.class,2);//产生select语句
c.setName("郭啸天");
//s.update(c);
mit();
s.close();
}
三:
操纵持久化对象
1:
理解Hibernate的Session对象
Session接口是Hibernate向应用程序提供的操纵对数据库的最主要的接口,它提供了基本的保存,更新,删除和加载Java对象的方法.
在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session缓存.只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期
当session的save()方法持久化一个对象时,该对象被载入缓存,以后即使程序中不再引用该对象,只要缓存不清空,该对象仍然处于生命周期中。
当试图get()、load()对象时,会判断缓存中是否存在该对象,有则返回,此时不查询数据库。
没有再查询数据库
Session中的方法总结:
flush:
进行清理缓存(此时缓存中的数据并不丢失)的操作,让缓存和数据库同步执行一系列sql语句,但不提交事务,;
commit:
先调用flush()方法,然后提交事务.则意味着提交事务意味着对数据库操作永久保存下来。
refresh:
刷新,让session和数据库同步,执行查询,把数据库的最新信息显示出来,更新本地缓存的对象状态.
clear:
清空缓存,等价于list.removeAll();
session.setFlushMode(FlushMode.NEVER);方法优化系统,保存时可解决内存溢出
测试代码:
/**
*使用s.setFlushMode(FlushMode.NEVER);//从不清理缓存
*完成优化
*/
@Test
publicvoidtestFlushMode_400000(){
Sessions=sf.openSession();
Transactiontr=s.beginTransaction();
s.setFlushMode(FlushMode.NEVER);//从不清理缓存
for(inti=1;i<=4000000;i++){
Customerc=newCustomer();
c.setName("老顽童");
c.setAge(60);
c.setDes("就是玩");
s.save(c);
/**解决添加大批量数据*/
if(i%1000==0){
s.flush();//清理缓存,让缓存中的数据与数据库同步,方向是缓存到数据库
s.clear();//清空缓存,缓存中数据就没有了,用来解决内存溢出
}
}
s.flush();//只有调用flush方法的时候,才会清理缓存
mit();//因为执行了s.setFlushMode(FlushMode.NEVER);此时事务提交的方法将无效
s.close();
}
2:
在hibernate中java对象的状态
Hibernate把对象分为4种状态:
持久化状态,
临时状态,
游离状态,
删除状态.
Session的特定方法能使对象从一个状态转换到另一个状态
临时状态
(google一下你就知道)
持久化状态
(google一下你就知道)
删除状态
(google一下你就知道)
游离状态
(google一下你就知道)
对象之间状态的转换图:
(google一下你就知道)
3:
Session操作数据库的方法
●save()方法:
将临时对象转换持久对象
●update()方法:
将游离对象转换持久对象
(1)注意:
当update()方法关联一个游离对象时,如果在Session的缓存中已经存在相同OID的持久化对象,会抛出异常
(2)当update()方法关联一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常.
●evict()方法:
将持久对象转换成游离对象
●saveOrUpdate()方法:
存在save方法和update方法的特征
hibernate第二天
一:
映射一对