hibernate笔记.docx

上传人:b****4 文档编号:12030768 上传时间:2023-04-16 格式:DOCX 页数:61 大小:40KB
下载 相关 举报
hibernate笔记.docx_第1页
第1页 / 共61页
hibernate笔记.docx_第2页
第2页 / 共61页
hibernate笔记.docx_第3页
第3页 / 共61页
hibernate笔记.docx_第4页
第4页 / 共61页
hibernate笔记.docx_第5页
第5页 / 共61页
点击查看更多>>
下载资源
资源描述

hibernate笔记.docx

《hibernate笔记.docx》由会员分享,可在线阅读,更多相关《hibernate笔记.docx(61页珍藏版)》请在冰豆网上搜索。

hibernate笔记.docx

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第二天

一:

映射一对

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 初中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1