Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx

上传人:b****4 文档编号:3850305 上传时间:2023-05-06 格式:DOCX 页数:72 大小:673.78KB
下载 相关 举报
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第1页
第1页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第2页
第2页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第3页
第3页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第4页
第4页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第5页
第5页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第6页
第6页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第7页
第7页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第8页
第8页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第9页
第9页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第10页
第10页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第11页
第11页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第12页
第12页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第13页
第13页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第14页
第14页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第15页
第15页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第16页
第16页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第17页
第17页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第18页
第18页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第19页
第19页 / 共72页
Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx_第20页
第20页 / 共72页
亲,该文档总共72页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx

《Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx》由会员分享,可在线阅读,更多相关《Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx(72页珍藏版)》请在冰点文库上搜索。

Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开.docx

Java相关课程系列笔记之十四Hibernate学习笔记建议用WPS打开

Hibernate学习笔记

Java相关课程系列笔记之十四

 

笔记内容说明

Hibernate(梁建全老师主讲,占笔记内容100%);

目录

一、Hibernate的概述1

1.1Hibernate框架的作用1

1.2Hibernate访问数据库的优点1

1.3JDBC访问数据库的缺点1

1.4Hibernate的设计思想1

二、Hibernate的基本使用2

2.1Hibernate的主要结构2

2.2Hibernate主要的API2

2.3Hibernate使用步骤2

2.4HQL语句(简要介绍)6

三、数据映射类型7

3.1映射类型的作用7

3.2type映射类型的两种写法7

四、Hibernate主键生成方式8

4.1五种生成方式8

五、Hibernate基本特性9

5.1对象持久性9

5.2处于持久状态的对象具有的特点9

5.3三种状态下的对象的转换9

5.4批量操作:

注意及时清除缓存9

5.5案例:

三种状态下的对象使用10

5.6一级缓存机制(默认开启)10

5.7一级缓存的好处10

5.8管理一级缓存的方法10

5.9延迟加载机制11

5.10具有延迟加载机制的操作11

5.11常犯的错误12

5.12延迟加载的原理12

5.13Session的get和load方法的区别12

5.14延迟加载的好处12

5.15案例:

测试延迟加载12

5.16案例:

重构NetCTOSS资费管理模块13

5.17JavaWeb程序中如何用延迟加载操作(OpenSessionInView)15

六、关联映射18

6.1一对多关系one-to-many18

6.2多对一关系many-to-one19

6.3多对多关联映射many-to-many19

6.4关联操作(查询joinfetch/级联cascade)21

6.5继承关系映射24

七、Hibernate查询方法27

7.1HQL查询27

7.2HQL和SQL的相同点27

7.3HQL和SQL的不同点27

7.4HQL典型案例27

7.5Criteria查询30

7.6NativeSQL原生SQL查询31

八、Hibernate高级特性32

8.1二级缓存32

8.2二级缓存开启方法及测试32

8.3二级缓存管理方法33

8.4二级缓存的使用环境33

8.5查询缓存33

8.6查询缓存开启方法及测试33

8.7查询缓存的使用环境33

九、Hibernate锁机制34

9.1悲观锁34

9.2悲观锁的实现原理34

9.3悲观锁使用步骤及测试34

9.4乐观锁35

9.5乐观锁的实现原理35

9.6乐观锁使用步骤及测试35

十、其他注意事项36

10.1源码服务器管理工具36

10.2利用MyEclipse根据数据表自动生成实体类、hbm.xml36

10.3根据实体类和hbm.xml生成数据表37

10.4Hibernate中分页查询使用joinfatch的缺点37

10.5Hibernate的子查询映射38

1、Hibernate的概述

1.1Hibernate框架的作用

Hibernate框架是一个数据访问框架(也叫持久层框架,可将实体对象变成持久对象,详见第5章)。

通过Hibernate框架可以对数据库进行增删改查操作,为业务层构建一个持久层。

可以使用它替代以前的JDBC访问数据。

1.2Hibernate访问数据库的优点

1)简单,可以简化数据库操作代码。

2)Hibernate可以自动生成SQL,可以将ResultSet中的记录和实体类自动的映射(转化)。

3)Hibernate不和数据库关联,是一种通用的数据库框架(支持30多种数据库),可以方便数据库移植。

任何数据库都可以执行它的API。

因为Hibernate的API中是不涉及SQL语句的,它会根据Hibernate的配置文件,自动生成相应数据库的SQL语句。

1.3JDBC访问数据库的缺点

1)需要编写大量的复杂的SQL语句、表字段多时SQL也繁琐、设置各个问号值。

2)需要编写实体对象和记录之间的代码,较为繁琐。

3)数据库移植时需要修改大量的SQL语句。

1.4Hibernate的设计思想

Hibernate是基于ORM(ObjectRelationMapping)思想设计的,称为对象关系映射。

负责Java对象和数据库表数据之间的映射。

Hibernate是一款主流的ORM工具,还有其他很多ORM工具,如:

MyBatis(以前叫iBatis)、JPA。

Hibernate功能比MyBatis强大些,属于全自动类型,MyBatis属于半自动。

但全自动会有些不可控因素,因此有些公司会用MyBatis。

ORM工具在完成Java对象和数据库之间的映射后:

1)在查询时,直接利用工具取出“对象”(不论是查询一条记录还是多条记录,取出的都是一个个对象,我们不用再去转化实体了)。

2)在增删改操作时,直接利用工具将“对象”更新到数据库表中(我们不用再去把对象转成数据了)。

3)中间的SQL+JDBC细节,都被封装在了工具底层,不需要程序员参与。

◆注意事项:

vJava程序想访问数据库,只能通过JDBC的方式,而Hibernate框架也就是基于ORM思想对JDBC的封装。

vHibernate是以“对象”为单位进行数据库的操作。

2、

Hibernate的基本使用

2.1Hibernate的主要结构

1)hibernate.cfg.xml(仅1个):

Hibernate的主配置文件,主要定义数据连接参数和框架设置参数。

◆注意事项:

就是个xml文件,只是名字比较奇葩!

2)Entity实体类(n个,一个表一个):

主要用于封装数据库数据。

3)hbm.xml映射文件(n个):

主要描述实体类和数据表之间的映射信息。

描述表与类,字段与属性的对应关系。

◆注意事项:

hbm.xml是个后缀,如:

命名可写Cost.hbm.xml。

2.2Hibernate主要的API

1)Configuration:

用于加载hibernate.cfg.xml配置信息。

用于创建SessionFactory。

2)SessionFactory:

存储了hbm.xml中描述的信息,内置了一些预编译的SQL,可以创建Session对象。

3)Session:

负责对数据表执行增删改查操作。

表示Java程序与数据库的一次连接会话,是对以前的Connection对象的封装。

和JSP中的session不是一回事,就是名字一样而已。

4)Query:

负责对数据表执行特殊查询操作。

5)Transaction:

负责Hibernate操作的事务管理。

默认情况下Hibernate事务关闭了自动提交功能,需要显式的追加事务管理(如调用Transaction对象中的commit();提交事务)!

◆注意事项:

v这些API都是在Hibernate包下的,导包别导错!

v第一次访问数据库比较慢,比较耗资源,因为加载的信息多。

2.3Hibernate使用步骤

step1:

建立数据库表。

step2:

建立Java工程(Web工程也可),引入Hibernate开发包和数据库驱动包。

必须引入的包:

hibernate3.jar、cglib.jar、dom4j.jar、commons-collections.jar、commons-logging.jar…等

step3:

添加hibernate.cfg.xml配置文件,文件内容如下:

xmlversion='1.0'encoding='UTF-8'?

>

DOCTYPEhibernate-configurationPUBLIC

"-//Hibernate/HibernateConfigurationDTD3.0//EN"

"

--指定方言,决定Hibernate生成哪种SQL-->

org.hibernate.dialect.OracleDialect

--不知道数据库版本就写OracleDialect-->

--可在hibernate3.jar中org.hibernate.dialect包下查看名字-->

jdbc:

oracle:

thin:

@localhost:

1521:

dbchang

system

chang

oracle.jdbc.driver.OracleDriver

--框架参数,将hibernate底层执行的SQL语句从控制台显示-->

true

--格式化显示的SQL-->

true

--指定映射描述文件-->

◆注意事项:

应该放在源文件的src目录下,默认为hibernate.cfg.xml。

文件内容是Hibernate工作时必须用到的基础信息。

step4:

编写Entity实体类(也叫POJO类),例如:

资费实体类Cost

privateIntegerid;//资费IDprivateStringfeeName;//资费名称

privateIntegerbaseDuration;//基本时长privateFloatbaseCost;//基本定费

privateFloatunitCost;//单位费用privateStringstatus;//0:

开通;1:

暂停;

privateStringdescr;//资费信息说明privateDatecreateTime;//创建日期

privateDatestartTime;//启用日期privateStringcostType;//资费类型

……getter/setter方法

◆注意事项:

POJO类表示普通类(PlainOrdinaryOldObject),没有格式的类,只有属性和对应的getter/setter方法,而没有任何业务逻辑方法的类。

这种类最多再加入equals()、hashCode()、toString()等重写父类Object的方法。

不承担任何实现业务逻辑的责任。

step5:

编写hbm.xml映射(文件)描述信息:

映射文件用于指明POJO类和表之间的映射关系(xx属性对应xx字段),一个类对应一个映射文件。

例如:

Cost.hbm.xml内容如下:

xmlversion="1.0"encoding="utf-8"?

>

DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD3.0//EN"

"

--定义COST_CHANG表和Cost类型之间的映射信息-->

---->

--name:

包名.类名,指定是哪个类;table:

数据库中哪个表;catalog:

对Oracle而言为哪个数据库,对MySQl而言为某个用户(MySQl是在用户下建表,Oracle是在库中建表),

不写也行(若用工具则会自动生成)。

例如,select*fromcost_chang则会在hibernate.cfg配置文件中定义的库(或用户)下去找表。

若写了则为select*fromsystem.cost_chang-->

--表明此为主键列,且必须写否则xml报错,主键映射-->

--或双标签-->

--指定主键值生成方式,采用序列方式生成主键,仅对添加操作有效-->

COST_SEQ_CHANG

--指定序列名-->

--以下为非主键映射-->

--可有length、not-null属性,如:

length="20"-->

--映射顺序没关系-->

--类型要和实体定义的相同-->

--列名写错则报错读不到实体-->

--junit测试右键点CopyTrace查看错误列-->

--也可写成,主键列同理!

-->

…………其他省略…………

◆注意事项:

v映射文件默认与POJO类放在一起;命名规则为:

类名.hbm.xml。

vhbm.xml中已写出的属性与字段的映射要一一对应,若表中没有某个字段,却写了映射关系,则报错:

找不到实体类。

step6:

利用HibernateAPI实现DAO

1)新建HibernateUtil类,用于封装创建Session的方法。

如下:

每个用户会对应一个Session,但是SessionFactory是共享的。

publicclassHibernateUtil{

privatestaticSessionFactorysf;

static{//不用每次都加载配置信息,所以放static块中,否则每次都加载会耗费资源

Configurationconf=newConfiguration();//加载主配置hibernate.cfg.xml

conf.configure("/hibernate.cfg.xml");

sf=conf.buildSessionFactory();//获取SessionFactory}

publicstaticSessiongetSession(){//获取Session

Sessionsession=sf.openSession();returnsession;}}

2)新建CostDAO接口

publicCostfindById(intid);publicvoidsave(Costcost);

publicvoiddelete(intid);publicvoidupdate(Costcost);

publicListfindAll();

3)新建CostDAOImpl类,用于实现CostDAO接口

publicclassCostDAOImplimplementsCostDAO{

privateSessionsession;

publicCostDAOImpl(){//不想老写获得session的方法,就写在构造器中

session=HibernateUtil.getSession();}

/**get方法执行查询,按主键当条件查询,如何判断是主键,是根据写的描述文件来定,get方法就是findById,就是按主键去查,需指定:

操作哪个类和id(主键)条件值即可,其他条件查询做不了*/

publicCostfindById(intid){

//Sessionsession=HibernateUtil.getSession();

Costcost=(Cost)session.get(Cost.class,id);session.close();returncost;}

/**save方法执行增加操作,注意1:

获取事务并开启,增删改要注意,查询可以不管事务,因为没对数据库进行修改;注意2:

主键值根据hbm.xml中的定义生成,执行后,会先获取序列值,再去做insert操作。

即先:

selectCOST_SEQ_CHANG.nextvalfromdual;然后:

insertinto……*/

publicvoidsave(Costcost){

//Sessionsession=HibernateUtil.getSession();

Transactiontx=session.beginTransaction();//打开事务session.save(cost);

mit();//提交事务session.close();//释放}

/**delete方法执行删除操作,由于Hibernate以“对象”为单位进行数据库操作,所以这里要传进去一个对象,虽然是个对象,但还是按主键做条件删除,只要把主键值设置上就行,其他非主键值不用管。

也可先通过id查再删*/

publicvoiddelete(intid){

//Sessionsession=HibernateUtil.getSession();

Transactiontx=session.beginTransaction();Costcost=newCost();

cost.setId(id);session.delete(cost);mit();session.close();}

/**update方法执行修改操作,*/

publicvoidupdate(Costcost){

//Sessionsession=HibernateUtil.getSession();

Transactiontx=session.beginTransaction();

session.update(cost);//将cost对象更新到数据库mit();

session.close();}

/**特殊查询,SQL语句:

Stringsql="select*fromCOST_CHANG";

HQL语句:

Stringhql="fromCost";(HibernateQueryLanguage)是面向对象的查询语句。

from后写映射的类名,它是Hibernate中特有的查询语句,根据映射的类去查询。

*/

publicListfindAll(){

//Sessionsession=HibernateUtil.getSession();

Stringhql="fromCost";//HQL语句

Queryquery=session.createQuery(hql);

Listlist=query.list();//执行查询,返回List集合

session.close();returnlist;}}

4)新建TestCostDAO类,使用junit测试

@Test

publicvoidtestFindById(){//当get方法没有记录时,返回null

CostDAOcostDao=newCostDAOImpl();Costcost=costDao.findById

(1);

System.out.println(cost.getName());System.out.println(cost.getBaseDuration());

System.out.println(cost.getBaseCost());System.out.println(cost.getUnitCost());

System.out.println(cost.getDescr());}

@Test

publicvoidtestSave(){//id主键列由Hibernate管理,这里不用设置

Costcost=newCost();cost.setName("2013计时");

cost.setUnitCost(0.8f);cost.setDescr("2013-08-09计时,0.8元/小时。

");

cost.setStatus("0");cost.setCreaTime(newDate(System.currentTimeMillis()));

CostDAOcostDao=newCostDAOImpl();costDao

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

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2