Hibernate个人学习笔记.docx

上传人:b****5 文档编号:8203295 上传时间:2023-01-29 格式:DOCX 页数:51 大小:272.45KB
下载 相关 举报
Hibernate个人学习笔记.docx_第1页
第1页 / 共51页
Hibernate个人学习笔记.docx_第2页
第2页 / 共51页
Hibernate个人学习笔记.docx_第3页
第3页 / 共51页
Hibernate个人学习笔记.docx_第4页
第4页 / 共51页
Hibernate个人学习笔记.docx_第5页
第5页 / 共51页
点击查看更多>>
下载资源
资源描述

Hibernate个人学习笔记.docx

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

Hibernate个人学习笔记.docx

Hibernate个人学习笔记

Hibernate

使用之后JDBC大部分不用再编写了

轻量级框架没有侵入性

适合对象关系清晰、

不适合聚集性批量操作

不适合需要使用数据库特定性功能的情况

❑课程目标:

❑理解O/RMapping原理

❑掌握Hibernate开发的相关知识

❑能使用Hibernate进行实际项目开发

❑Hibernate高手进级:

性能优化策略

目录

³什么是Hibernate

³快速体验Hibernate的开发步骤

³认识Hibernate基本核心接口

³Hibernate的对象关系映射

³Hibernate查询语句(HQL)

³直接使用JDBC操作数据库的步骤很繁琐

³JDBC操作的是关系型数据库

³我们用JAVA开发程序,则使用面向对象的思想

³Hibernate正是在这两种不同的模型之间建立关联,Hibernate给我们提供了利用面向对象的思想来操作关系型数据的接口

Hibernate能做什么?

-理解O/R映射

³Hibernate能帮助我们利用面向对象的思想,开发基于关系型数据库的应用程序

²第一:

将对象数据保存到数据库

²第二:

将数据库数据读入对象中

1、第一个hibernate项目,入门

1.1、Hibernate_first创建步骤

1、新建java项目

2、创建UserLibrary,加入如下jar

*HIBERNATE_HOME/hibernate3.jar

*HIBERNATE_HOME/lib/*.jar

*MySqljdbc驱动

3、创建hibernate配置文件hibernate.cfg.xml,为了便于调试最好加入log4j配置文件

位于:

hibernate-3.2\etc目录下

4、定义实体类User.java

5、定义User类的映射文件User.hbm.xml

6、将User.hbml.xml文件加入到hibernate.cfg.xml文件中

7、编写hbm2ddl工具类:

ExportDB.java将实体类→生成数据库表

publicstaticvoidmain(String[]args){

//读取hibernate.cfg.xml文件

Configurationcfg=newConfiguration().configure();

SchemaExportexport=newSchemaExport(cfg);

export.create(true,true);

}

8、开发客户端Client.java

为了方便跟踪sql执行,在hibernate.cfg.xml文件中加入

true

publicstaticvoidmain(String[]args){

//读取hibernate.cfg.xml文件

Configurationcfg=newConfiguration().configure();

//创建SessionFactory

SessionFactorysf=cfg.buildSessionFactory();

Sessionsession=null;

try{

session=sf.openSession();

//开启事务

session.beginTransaction();

Useruser=newUser();

user.setPassword("jbjb");

user.setName("不得了");

user.setCreateDate(newDate());

user.setExpireDate(newDate());

//保存数据

session.save(user);

//提交事务

session.getTransaction().commit();

}catch(Exceptione){

e.printStackTrace();

//回滚事务

session.getTransaction().rollback();

}finally{

if(session!

=null){

if(session.isOpen()){

//closesession

session.close();

}

}

}

}

}

1.2、步骤总结

²实体类(持久化类)的设计

²实体类与关系数据库的映射

²应用的开发

1.3、Hibernate核心接口

1.3.1Configuration

Ø概述:

Configuration类负责管理Hibernate的配置信息。

它包括如下内容:

❑Hibernate运行的底层信息:

数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。

❑Hibernate映射文件(*.hbm.xml)。

ØHibernate配置的两种方法:

❑属性文件(hibernate.properties)。

①调用代码:

Configurationcfg=newConfiguration();

❑xml文件(hibernate.cfg.xml)。

②调用代码:

Configurationcfg=newConfiguration().configure();

com.mysql.jdbc.Driver

jdbc:

mysql:

//localhost/hibernate_first

Root

Root

Org.hibernate.dialect.MySQLDialect

true

1.3.2SessionFactory

Ø概述:

应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。

它在多个应用线程间进行共享。

通常情况下,是线程安全的,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。

然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。

他的创建很耗时的,通常放在一个静态方法里面只创建一次

static{

try{

Configurationcfg=newConfiguration().configure();

factory=cfg.buildSessionFactory();

}catch(Exceptione){

e.printStackTrace();

}

}

Ø调用代码:

SessionFactorysessionFactory=cfg.buildSessionFactory();

Ø说明:

SessionFactory由Configuration对象创建,所以每个Hibernate配置文件,实际上是对SessionFactory的配置

1.3.3Session(会话)

Ø概述:

❑Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。

❑Session也称为持久化管理器,因为它是与持久化有关的操作接口。

❑Session通过SessionFactory打开,在所有的工作完成后,需要关闭。

❑它与Web层的HttpSession没有任何关系。

Ø调用代码

Sessionsession=sessionFactory.openSession();

2.测试实体对象的生命周期

2.1junit简介:

*编写测试类xxxTest,需要继承TestCase

*编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:

publicvoidtestHello1(){}

*最好单元测试的代码单独建立一个目录

2.2了解Hibernate中CRUD操作

publicclassSessionTestextendsTestCase{

publicvoidtestSave1(){

Sessionsession=null;

Transactiontx=null;

Useruser=null;

try{

session=HibernateUtils.getSession();

tx=session.beginTransaction();

//Transient状态

user=newUser();

user.setName("李四");

user.setPassword("123");

user.setCreateTime(newDate());

user.setExpireTime(newDate());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步

session.save(user);

user.setName("王五");

//session.update(user);

mit();

}catch(Exceptione){

e.printStackTrace();

tx.rollback();

}finally{

HibernateUtils.closeSession(session);

}

//detached状态

user.setName("张三");

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//persistent状态

session.update(user);

session.getTransaction().commit();

}

publicvoidtestReadByGetMethod1(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//马上发出查询sql,加载User对象

Useruser=(User)session.get(User.class,"402880d01b9bf210011b9bf2a2ff0001");

System.out.println("user.name="+user.getName());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步

user.setName("龙哥");

session.getTransaction().commit();

}

publicvoidtestReadByGetMethod2(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//采用get加载数据,如果数据库中不存在相应的数据,返回null

Useruser=(User)session.get(User.class,"asdfsafsdfdsf");

session.getTransaction().commit();

}

publicvoidtestReadByLoadMethod1(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)

//延迟加载:

只有真正使用这个对象的时候,才加载(发出sql语句)

//hibernate延迟加载实现原理是代理方式

Useruser=(User)session.load(User.class,"402880d01b9bf210011b9bf2a2ff0001");

System.out.println("user.name="+user.getName());

//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步

user.setName("发哥");

session.getTransaction().commit();

}

publicvoidtestReadByLoadMethod2(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//采用load加载数据,如果数据库中没有相应的数据

//那么抛出ObjectNotFoundException

Useruser=(User)session.load(User.class,"55555555");

System.out.println(user.getName());

session.getTransaction().commit();

}

publicvoidtestUpdate1(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

//手动构造的detached状态的对象

Useruser=newUser();

user.setId("402880d01b9be8dc011b9be9b23d0001");

user.setName("德华");

session.update(user);

session.getTransaction().commit();

}

publicvoidtestDelete1(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

session.beginTransaction();

////手动构造的detached状态的对象

//Useruser=newUser();

//user.setId("402880d01b9be8dc011b9be9b23d0001");

//user.setName("德华");

//session.delete(user);

Useruser=(User)session.load(User.class,"402880d01b9be8dc011b9be9b23d0001");

session.delete(user);

session.getTransaction().commit();

2.3了解get和load的区别?

*get不支持lazy,load支持lazy

*采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常

2.4Transient、persisten、detached的状态特征

transient状态的特征?

*在数据库中没有与之匹配的数据

*没有纳入session的管理

persistent状态的特征?

*persistent状态,当属性发生改变的时候,Hibernate会自动和数据库同步库

数据库中有与之匹配的数据

*纳入了session的管理

*在清理缓存(脏数据检查)的时候,会和数据库同步

detached状态的特征?

*在数据库中有与之匹配的数据

*没有纳入session的管理

2.5QueryTest

publicvoidtestQuery(){

Sessionsession=null;

try{

session=HibernateUtils.getSession();

Transactiontx=session.beginTransaction();

Queryquery=session.createQuery("fromUser");

query.setFirstResult(0);

query.setMaxResults

(2);

ListuserList=query.list();

for(Iteratoriterator=userList.iterator();iterator.hasNext();){

Useruser=(User)iterator.next();

System.out.println(user.getId());

System.out.println(user.getName());

}

mit();

3、Hibernate基本映射

3.1映射关系

实体类---表

实体类中的普通属性---表字段

采用标签映射成数据库表,通过标签将普通属性映射成表字段

所谓普通属性指不包括自定义类、集合和数组等

注意:

如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名

3.2实体类的设计原则

*实现一个默认的(即无参数的)构造方法(constructor)

*提供一个标识属性(identifierproperty)(可选)

*使用非final的类(可选),final之后就不能继承了

*为持久化字段声明访问器(accessors)get、set方法

3.3主键生成策略:

uuid、native和assigned

uuid

用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。

UUID被编码为一个32位16进制数字的字符串。

native

根据底层数据库的能力选择identity,sequence或者hilo中的一个。

assigned

让应用程序在save()之前为对象分配一个标示符。

这是元素没有指定时的默认生成策略。

主键这个时候必须手动分配

4.hibernate多对一关联映射

4.1多对一关联映射的本质:

*将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用,多个用户(user)属于一个组(group)

会在多的一端加入一个外键,指向一的一端,这个外键是由中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致

publicclassUser{

privateintid;

privateStringname;

privateGroupgroup;

标签的定义示例:

*

³many-to-one的映射最常用,也是最容易理解和编写的

³生成的DDL语句如下

createtableT_Group(idvarchar(255)notnull,namevarchar(255),primarykey(id))

createtableUser(idvarchar(255)notnull,namevarchar(255),passwordvarchar(255),createTimedatetime,expireTimedatetime,groupidvarchar(255

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

当前位置:首页 > 表格模板 > 合同协议

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

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