hibernate从入门到精通案例详细讲解.docx
《hibernate从入门到精通案例详细讲解.docx》由会员分享,可在线阅读,更多相关《hibernate从入门到精通案例详细讲解.docx(53页珍藏版)》请在冰豆网上搜索。
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采用字符串唯一值