hibernate教学学习文档.docx
《hibernate教学学习文档.docx》由会员分享,可在线阅读,更多相关《hibernate教学学习文档.docx(26页珍藏版)》请在冰豆网上搜索。
![hibernate教学学习文档.docx](https://file1.bdocx.com/fileroot1/2023-7/19/afbae189-c8af-4ba5-a6c0-e9ff909b8b0a/afbae189-c8af-4ba5-a6c0-e9ff909b8b0a1.gif)
hibernate教学学习文档
1hibernate入门
1.1框架介绍
1.2回顾
●传统使用JDBC开发
●使用工具包,DbUtils(commons-...)
1.3hibernate介绍
●轻量级:
依赖其他内容较少,消耗资源成本少。
●持久层:
与数据库进行数据交换。
●ORM,对象关系映射(objectrelationmapping)
对象:
java一切都是对象,一般情况使用JavaBean
关系:
数据库中的表(二维表)
映射:
配置文件
1.4流行框架
2第一个案例
2.1编写步骤
●创建java项目
●导入jar包
●核心配置文件hibernate.cfg.xml(configuration)
●JavaBean+映射文件(bean名称.hbm.xml)
注意:
必须将映射文件,添加核心配置文件中
●操作api
2.2导入jar包
●版本:
3.6.10
●导入jar(n个)
%h%/hibernate3.jar核心
%h%/lib\required必须目录下的所有
%h%/lib\jpajava规范(javapersistapi)java持久api,hibernate对其支持(一般注解开发)
注意:
数据驱动
2.3核心配置文件
●名称:
hibernate.cfg.xml
●位置:
src(classpath)
●内容:
(driver、url、username、password、方言)
●约束
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"http:
//www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
--sessionFactory相当于DataSource(连接池)-->
--1基本4项-->
com.mysql.jdbc.Driver
jdbc:
mysql:
//localhost:
3306/h_day01_db
root
1234
--2方言,注意后缀-->
org.hibernate.dialect.MySQL5Dialect
注意:
必须手动创建数据库
2.4javabean和映射文件
2.4.1javabean字段
publicclassUser{
privateIntegeruid;//注意:
必须是整形
privateStringusername;
privateStringpassword;
2.4.2映射文件
●名称:
User.hbm.xml
●位置:
javabean同包
●内容:
(配置javabean属性和表中字段对应关系)
●约束
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http:
//www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
--给表配置主键-->
--主键生成策略(下午讲,暂时为固定值)-->
--其他属性-->
注意:
映射文件必须添加到核心配置文件中
●解决方案:
hibernate.cfg.xml
表不存在
方案1:
数据库手动创建表(建议)
方案2:
hibernate自动创建(上课优先)
3CRUD操作
添加:
save
更新:
update
删除:
delete
通过id查询,get(Class,id)
查询所有:
newQuery("from...").list()
分页:
setFirstResult(int)
setMaxResults(int)
@Test
publicvoiddemo04(){
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
//分页查询,提供hibernate提供的api分页
//*回顾sqlselect*fromt_userlimitstartIndex,pageSize;
//**startIndex开始索引
//**pageSize每页显示个数
Queryquery=session.createQuery("fromUser");
//第一页
//query.setFirstResult(0);
//query.setMaxResults
(2);
//第二页
query.setFirstResult
(2);//回顾算法:
startIndex=(pageNum-1)*pageSize;
query.setMaxResults
(2);
ListallUser=query.list();
for(Useruser:
allUser){
System.out.println(user);
}
session.getTransaction().commit();//获得之前开启的事务
session.close();
sessionFactory.close();
}
@Test
publicvoiddemo03(){
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
//查询所有--使用hibernate查询query语句hql
//*hqlhibernate提供面向对象的查询语句,类似与sql
//**sql格式:
select表中字段from表名where...,例如:
select*fromt_user
//**hql格式:
[select对象属性]from对象[where...],例如:
fromUser
Queryquery=session.createQuery("fromUser");
ListallUser=query.list();
for(Useruser:
allUser){
System.out.println(user);
}
session.getTransaction().commit();//获得之前开启的事务
session.close();
sessionFactory.close();
}
@Test
publicvoiddemo02(){
Configurationconfig=newConfiguration().configure();
SessionFactorysessionFactory=config.buildSessionFactory();
Sessionsession=sessionFactory.openSession();
session.beginTransaction();
//通过id查询
Useruser=(User)session.get(User.class,1);
System.out.println(user);
session.getTransaction().commit();//获得之前开启的事务
session.close();
sessionFactory.close();
}
@Test
publicvoiddemo01(){
Useruser=newUser();
user.setUid
(1);
user.setUsername("杰克");
Configurationconfig=newConfiguration().configure();
SessionFactoryfactory=config.buildSessionFactory();
Sessionsession=factory.openSession();
Transactiontransaction=session.beginTransaction();
//更新--通过id更新所有内容,如果没有设置null
session.update(user);
mit();
session.close();
factory.close();
}
4api详解
4.1结构图
POpersistentobject持久对象
应用程序通过po类与hibernate进行交互。
4.2Configuration
●hibernate提供用于加载配置文件的。
●核心配置文件种类:
hibernate.properties和hibernate.cfg.xml
一般情况使用hibernate.cfg.xml,可以配置不同内容(基本信息,映射文件)
hibernate.properties只能配置基本信息(key=value)
参考:
%h%/project/etc/hibernate.properties
●构造方法,newConfiguration()hibernate将加载hibernate.properties配置文件
●提供方法:
configure()加载hibernate.cfg.xml配置文件
通过configure(String)指定自定义的cfg.xml文件。
●加载映射文件hbm.xml
addResource()加载自定义的映射文件。
例如:
config.addResource("cn/itcast/domain/User.hbm.xml");
addClass()加载自定义映射文件。
例如:
config.addClass(User.class);
建议:
映射文件与Java通同名同包,且扩展名为hbm.xml
注意:
如果重复添加JavaBean,提示错误
4.3SessionFactory
●hibernate提供工厂,用于生成session
●每一个应用程序只能有一个实例(单例),类似Jdbc时学习的连接池
●线程安全的,及不同的线程都可以获得不同session。
●获得实例configuration.buildSessionFactory()
●获得session
openSession()创建一个回话,每执行一次,session都是新的。
getCurrentSession()获得当前线程中绑定的session,暂时不能用。
●SessionFactory缓存配置信息(例如:
hibernate.cfg.xml/...hbm.xml配置内容)
4.4Session
●hibernate提供操作PO类
●线程不安全,及每一个用户必须独享自己的session。
●常用api
save/update/delete/createQuery(list/setFirstResult/setMaxResults)
●操作事务
session.beginTransaction()开启事务
session.getTransaction()获得当前事务
4.5事务操作
●开启事务:
beginTransaction()
●提交事务:
commit()
●回滚事务:
rollback()
5主配置文件详解
●名称:
hibernate.cfg.xml
●位置:
src(classpath)--->WEB-INF/classes
●配置BeanFactory异常
原因:
javaweb6.0项目,默认进行Bean校验,通常不使用。
解决方案:
方案1:
删除此jar
方案2:
hibernate配置取消
--1基本4项-->
com.mysql.jdbc.Driver
jdbc:
mysql:
///h_day01_db
root
1234
--2方言-->
org.hibernate.dialect.MySQL5Dialect
--3开发时,优化设置-->
--3.1显示生产sql语句-->
true
--3.2格式化方式显示sql-->
true
--4表的创建(了解)
*开发中表先由DBA创建好,通过表自动生成hbm.xml映射文件。
*学生时,方便使用。
*取值:
validate|update|create|create-drop
create:
每一次都将创建表,如果表已经存在将删除。
(测试)程序结束之后,表存在的。
create-drop:
每一次都将创建表,如果表已经存在将删除。
(测试)程序结束之后,将删除表。
注意:
必须执行factory.close()否则与“create”相同
update:
如果表不存在,将创建。
如果存在,将维护对应关系(映射文件-表)【】
注意:
只负责添加,但不进行删除。
validate:
运行时,将校验映射文件和表对应关系,如果一一对应程序正常运行,如果不对应抛异常。
-->
--5取消bean校验-->
none
--6将session绑定当本地线程中
*hibernatesession管理:
只将使用。
*当在cfg.xml配置thread,SessionFactory提供getCurrentSession()将可以使用。
*hibernate底层使用ThreadLocal线程局部变量,可以在一个线程中共享数据。
***get()##map.get(Thread)
***set(value)##map.put(Thread,value)
***remove()##map.remove(Thread)
-->
thread
6问题
●如果使用session.openSession()可以通过执行多次session.beginTransaction()进行多次事务操作。
●但如果使用session.getCurrentSession()只能使用一次,如果进行提交,默认情况下,将进行session.close(),解决此问题,spring采用OpenSessionInViewFilter过滤器。
@Test
publicvoiddemo01(){
Configurationconfig=newConfiguration().configure();
SessionFactoryfactory=config.buildSessionFactory();
Sessionsession=factory.getCurrentSession();
//开启事务
Transactiontransaction=session.beginTransaction();
//****操作
Useruser=newUser();
user.setUsername("rose2");
user.setPassword("1234");
session.save(user);
//5提交
mit();
//再开启SpringOpenSessionInViewFilter
Transactiontransaction2=session.beginTransaction();
//****操作
Useruser2=newUser();
user2.setUsername("tom");
user2.setPassword("1234");
session.save(user2);
//5提交
mit();
//6释放
session.close();
//7关闭工厂
factory.close();
}
7映射文件详解
●文件名称:
javabean名称.hbm.xml
●位置:
javabean同包
●内容:
7.1约束
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http:
//www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
7.2属性基本设置
普通属性
name:
默认用于配置javabean属性名称
length:
配置长度,字符串默认255,mysql类型varchar(255)
column:
当前属性对应表中字段(列)名称,默认name的值
方式1:
column属性(attribute),
方式2:
子标签
type:
数据字段类型
方式1:
hibernate类型,例如:
string
方式2:
java类型,例如:
java.lang.String
方法3:
mysql类型,例如:
varchar(50)
日期时间类型
date,日期java.util.Date,对应jdbc类型:
java.sql.Date
time,时间java.util.Date,对应jdbc类型:
java.sql.Time
timestamp,时间戳java.util.Date(注意:
时间戳随着数据更改变化),对应jdbc类型:
java.sql.Timestamp
项目使用:
字符串、long(date.getTime())、日期时间