hibernate从入门到精通案例详细讲解.docx

上传人:b****6 文档编号:8669033 上传时间:2023-02-01 格式:DOCX 页数:53 大小:282.95KB
下载 相关 举报
hibernate从入门到精通案例详细讲解.docx_第1页
第1页 / 共53页
hibernate从入门到精通案例详细讲解.docx_第2页
第2页 / 共53页
hibernate从入门到精通案例详细讲解.docx_第3页
第3页 / 共53页
hibernate从入门到精通案例详细讲解.docx_第4页
第4页 / 共53页
hibernate从入门到精通案例详细讲解.docx_第5页
第5页 / 共53页
点击查看更多>>
下载资源
资源描述

hibernate从入门到精通案例详细讲解.docx

《hibernate从入门到精通案例详细讲解.docx》由会员分享,可在线阅读,更多相关《hibernate从入门到精通案例详细讲解.docx(53页珍藏版)》请在冰豆网上搜索。

hibernate从入门到精通案例详细讲解.docx

hibernate从入门到精通案例详细讲解

Hibernate从入门到精通

1.1ORM框架

Hibernate是一个数据持久化层的ORM框架.

Object:

对象,java对象,此处特指JavaBean

Relational:

关系,二维表,数据库中的表。

映射|映射元数据:

对象中属性,与表的字段,存在对应关系。

1.2什么是hibernate

Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架

•ORM就是通过将Java对象映射到数据库表,通过操作Java对象,就可以完成对数据表的操作

Hibernate提供了对关系型数据库增删改成操作。

Hibernate最流行ORM框架,通过对象-关系映射配置,可以完全脱离底层SQL

1.3优点

●Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码

●Hibernate是一个基于jdbc的主流持久化框架,是一个优秀的orm实现,它很大程度的简化了dao层编码工作session.save(User);

●Hibernate使用java的反射机制

●Hibernate的性能非常好,因为它是一个轻量级框架。

映射的灵活性很出色。

它支持很多关系型数据库,从一对一到多对多的各种复杂关系

1.4编写流程

●1.导入jar包

●2.创建数据库和表

●3.编写核心配置文件(hibernate.cfg.xml)-->配置获得链接等参数

●4.编写映射文件hibernatemapping(*.hbm.xml)

●5使用api测试

1.5数据库和表

createdatabasehibernate;

usehibernate;

createtablet_user(

idintauto_incrementprimarykey,

usernamevarchar(50),

passwordvarchar(30)

);

1.6导入jar包

1.7编写JavaBean+映射文件

●文件位置:

javabean同包

●文件名称:

javabean同名

●扩展名:

*.hbm.xml

●内容:

添加约束

publicclassUser{

privateIntegerid;

privateStringusername;

privateStringpassword;

DOCTYPEhibernate-mappingPUBLIC

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

"http:

//www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

--主键-->

--固定值:

主键生成策略7个-->

--普通属性-->

1.8编写核心配置文件

●位置:

类路径(classpath、src)-->WEB-INF/classes

●名称:

hibernate.cfg.xml

●内容:

添加约束

DOCTYPEhibernate-configurationPUBLIC

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

"http:

//www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

--SessionFactory,相当于之前学习连接池配置-->

--1基本4项-->

com.mysql.jdbc.Driver

jdbc:

mysql:

///hibernate

root

root

--添加映射文件-->

1.9测试

@Test

publicvoiddemo01(){

Useruser=newUser();

user.setUsername("成龙");

user.setPassword("1234");

//1加载配置文件获得核心配置对象

Configurationconfig=newConfiguration().configure();

//2获得工厂SessionFactory,相当于连接池

SessionFactoryfactory=config.buildSessionFactory();

//3获得会话session,相当于链接Connection

Sessionsession=factory.openSession();

//4开启事务

Transactiontransaction=session.beginTransaction();

//操作

session.save(user);

//5提交事务|回滚事务

mit();

//6释放资源--关闭session

session.close();

//7释放资源--关闭工厂factory

factory.close();

}

2api详解

2.1体系结构

PO:

persistentobject,用于与数据库交互数据。

--dao层(JavaBean+hbm)

BO:

Businessobject业务数据对象。

--service层

VO:

ValueObject值对象。

--web层

开发中:

直接使用JavaBean描述三个对象。

2.2Configuration配置对象

●hibernate核心配置文件种类

hibernate.cfg.xml通常使用xml配置文件,可以配置内容更丰富。

hibernate.properties用于配置key/value形式的内容,key不能重复的。

配置有很多的局限性。

一般不用。

1.提供构造newConfiguration()hibernate将自动加载hibernate.properties文件

hibernate.properties文件必须存放在类路径(src)下

2.提供方法configure()将加载src下的hibernate.cfg.xml

3.扩展api

configure(String)加载指定目录下的xml文件

4.手动加载配置文件

//手动加载指定的配置文件

config.addResource("com/yinggu/a_hello/User.hbm.xml");

//手动加载指定类,对应的映射文件User-->User.hbm.xml

config.addClass(User.class);

2.3SessionFactory工厂

●SessionFactory相当于javaweb连接池,用于管理所有session

●获得方式:

config.buildSessionFactory();

●sessionFactoryhibernate缓存配置信息(数据库配置信息、映射文件,预定义HQL语句等)

●SessionFactory线程安全,可以是成员变量,多个线程同时访问时,不会出现线程并发访问问题。

●提供api:

//打开一个新的会话session

factory.openSession();

//获得当前线程中绑定的会话session

factory.getCurrentSession();

hibernate支持,将创建的session绑定到本地线程中,底层使用ThreadLocal,在程序之间共享session。

1.必须在hibernate.cfg.xml配置

--2与本地线程绑定-->

thread

2.如果提交或回滚事务,底层将自动关闭session

2.4Session会话

●Session相当于JDBC的Connection--会话

●通过session操作PO对象--增删改查

●session单线程,线程不安全,不能编写成成员变量。

●sessionapi

save保存

update更新

delete删除

get通过id查询,如果没有null

load通过id查询,如果没有抛异常

createQuery("hql")获得Query对象

createCriteria(Class)获得Criteria对象

2.5Transaction事务

开启事务beginTransaction()

获得事务getTransaction()

提交事务:

commit()

回滚事务:

rollback()

2.6Query对象

●hibernate执行hql语句

●hql语句:

hibernate提供面向对象查询语句,使用对象(类)和属性进行查询。

区分大小写。

●获得session.createQuery("hql")

●方法:

list()查询所有

uniqueResult()获得一个结果。

如果没有查询到返回null,如果查询多条抛异常。

setFirstResult(int)分页,开始索引数startIndex

setMaxResults(int)分页,每页显示个数pageSize

2.7Criteria对象

●QBC(querybycriteria),hibernate提供纯面向对象查询语言,提供直接使用PO对象进行操作。

●获得方式:

Criteriacriteria=session.createCriteria(User.class);

●条件

criteria.add(Restrictions.eq("username","tom"));

Restrictions.gt(字段,value);大于

Restrictions.ge(字段,value);大于等于

Restrictions.lt(字段,value);小于

Restrictions.le(字段,value);小于等于

Restrictions.like(字段,value);模糊查询:

模糊查询值需要使用%_

2.8工具类

publicclassH3Utils{

//会话工厂,整个程序只有一份。

privatestaticSessionFactoryfactory;

static{

//1加载配置

Configurationconfig=newConfiguration().configure();

//2获得工厂

factory=config.buildSessionFactory();

//3关闭虚拟机时,释放SessionFactory

Runtime.getRuntime().addShutdownHook(newThread(newRunnable(){

@Override

publicvoidrun(){

System.out.println("虚拟机关闭!

释放资源");

sf.close();

}

}));

}

/**

*获得一个新的session

*@return

*/

publicstaticSessionopenSession(){

returnfactory.openSession();

}

/**

*获得当前线程中绑定session

**注意:

必须配置

*@return

*/

publicstaticSessiongetCurrentSession(){

returnfactory.getCurrentSession();

}

}

3核心配置文件详解

3.1详细配置

--SessionFactory,相当于之前学习连接池配置-->

--1基本4项-->

com.mysql.jdbc.Driver

jdbc:

mysql:

///hiberbate

root

root

--2与本地线程绑定-->

thread

--3方言:

为不同的数据库,不同的版本,生成sql语句(DQL查询语句)提供依据

*mysql字符串varchar

*orcale字符串varchar2

-->

org.hibernate.dialect.MySQL5Dialect

--4sql语句-->

--显示sql语句-->

true

true

--5自动创建表(了解),学习中使用,开发不使用的。

*开发中DBA先创建表,之后根据表生产PO类

*取值:

update:

如果表不存在,将创建表。

如果表已经存在,通过hbm映射文件更新表(添加)。

(映射文件必须是数据库对应)

表中的列可以多,不负责删除。

create:

如果表存在,先删除,再创建。

程序结束时,之前创建的表不删除。

create-drop:

与create几乎一样。

如果factory.close()执行,将在JVM关闭同时,将创建的表删除了。

(测试)

validate:

校验hbm映射文件和表的列是否对应,如果对应正常执行,如果不对应抛出异常。

(测试)

-->

create

none

--添加映射文件

添加映射文件

resource设置xml配置文件(addResource(xml))

class配置类(addClass(User.class))配置的是全限定类名

-->

4Hibernate中持久化类

4.1编写规则

•提供一个无参数public访问控制符的构造器

•提供一个标识属性,映射数据表主键字段

•所有属性提供public访问控制符的setget方法(javaBean)

•标识属性应尽量使用基本数据类型的包装类型

•不要用final修饰实体(将无法生成代理对象进行优化)

4.2持久化对象的唯一标识OID

●Java按地址区分同一个类的不同对象.

●关系数据库用主键区分同一条记录

●Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系

结论:

对象的OID和数据库的表的主键对应。

为保证OID的唯一性,应该让Hibernate来为OID付值

4.3区分自然主键和代理主键

●主键需要具备:

不为空/不能重复/不能改变

自然主键:

在业务中,某个属性符合主键的三个要求.那么该属性可以作为主键列.

代理主键:

在业务中,不存符合以上3个条件的属性,那么就增加一个没有意义的列.作为主键.

4.4基本数据与包装类型

●基本数据类型和包装类型对应hibernate的映射类型相同

●基本类型无法表达null、数字类型的默认值为0。

●包装类默认值是null。

当对于默认值有业务意义的时候需要使用包装类。

4.5类型对应

4.6普通属性

package用于配置PO类所在包

例如:

package="com.yinggu.d_hbm"

配置PO类和表之间对应关系

name:

PO类全限定类名

例如:

name="com.yinggu.d_hbm.Person"

如果配置package,name的取值可以是简单类名name="Person"

table:

数据库对应的表名

dynamic-insert="false"是否支持动态生成insert语句

dynamic-update="false"是否支持动态生成update语句

如果设置true,hibernate底层将判断提供数据是否为null,如果为null,insert或update语句将没有此项。

普通字段

name:

PO类的属性

column:

表中的列名,默认name的值相同

type:

表中列的类型。

默认hibernate自己通过getter获得类型,一般情况不用设置

取值1:

hibernate类型

string字符串

integer整形

取值2:

java类型(全限定类名)

java.lang.String字符串

取值3:

数据库类型

varchar(长度)字符串

int整形

javabean一般使用类型java.util.Date

jdbc规范提供3中

java类型mysql类型

java.sql.Datedate

java.sql.timetime

java.sql.timestamptimestamp

nulldatetime

以上三个类型都是java.util.Date子类

length:

列的长度。

默认值:

255

not-null:

是否为null

unique:

是否唯一

access:

设置映射使用PO类属性或字段

property:

使用PO类属性,必须提供setter、getter方法

field:

使用PO类字段,一般很少使用。

insert生成insert语句时,是否使用当前字段。

update生成update语句时,是否使用当前字段。

默认情况:

hibernate生成insert或update语句,使用配置文件所有项

注意:

配置文件如果使用关键字,列名必须使用重音符

4.7主键

主键

配置主键

name:

属性名称

access=""设置使用属性还是字段

column=""表的列名

length=""长度

type=""类型

class属性用于设置主键生成策略

1.increment由hibernate自己维护自动增长

底层通过先查询max值,再+1策略

不建议使用,存在线程并发问题

2.identityhibernate底层采用数据库本身自动增长列

例如:

mysqlauto_increment

3.sequencehibernate底层采用数据库序列

例如:

oracle提供序列

4.hilo

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

##以上策略使用整形,long,short或者int类型

6.uuid采用字符串唯一值

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

当前位置:首页 > 求职职场 > 面试

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

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