资源描述
1 框架介绍
2 回顾
2.1 JDBC
2.2 DBUtils
3 ORM框架
l hibernate 就是一个ORM框架
4 hibernate介绍
l 版本:hibernate-distribution-3.6.10.Final-dist
4.1 分析
4.2 什么是hibernate
l Hibernate是轻量级JavaEE应用的持久层解决方案,是一个关系数据库ORM框架
轻量级:使用hibernate较少的依赖hibernate框架,只使用少量的api进行操作。
l Hibernate提供了对关系型数据库增删改查操作
l 流行数据库框架
1 JPA Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系(只有接口规范)
sun 对ORM框架推出一个规范(接口,没有实现),hibernate支持jpa
2 Hibernate 最流行ORM框架,通过对象-关系映射配置,可以完全脱离底层SQL
3 MyBatis 本是apache的一个开源项目 iBatis,支持普通 SQL查询,存储过程和高级映射的优秀持久层框架
4 Apache DBUtils 、Spring JDBCTemplate
4.3 优点
5 hello world(重要)
5.1 编写流程
l 导入jar包
l 核心配置文献:hibernate.cfg.xml
l java对象:javabean
l 映射文献:*.hbm.xml
需要将hbm.xml映射文献 添加到核心配置hibernate.cfg.xml中
l 操作api,进行添加操作:save
5.2 导入jar包
5.3 核心配置文献
l 位置:src
l 名称:hibernate.cfg.xml
l 约束:
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
l 正文内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- #1 基本4项
* 注意:必须手动创建数据库,create database h_day01;
-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- #2 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- #3 自动创建表
* 假如表不存在,抛异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'h_day01.t_book' doesn't exist
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 添加映射文献 -->
<mapping resource="cn/itcast/a_hello/Book.hbm.xml"/>
</session-factory>
</hibernate-configuration>
5.4 java对象:JavaBean
package cn.itcast.a_hello;
public class Book {
private Integer bid; //注意:类型必须是整形
private String title;
private String author;
5.5 映射文献
l 位置:和javabean同包
l 名称:Book.hbm.xml
l 约束:
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
l 正文内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.a_hello.Book" table="t_book">
<!-- 用于配置数据库中表的主键的 -->
<id name="bid">
<!-- 固定值 -->
<generator class="native"></generator>
</id>
<!-- 其他属性配置 -->
<property name="title"></property>
<property name="author"></property>
</class>
</hibernate-mapping>
l 注意:
将映射文献 添加到 核心配置文献(hibernate.cfg.xml)中
<!-- 添加映射文献 -->
<mapping resource="cn/itcast/a_hello/Book.hbm.xml"/>
5.6 操作api
@Test
public void demo01(){
Book book = new Book(); //注意:必须要手动bid的值
book.setTitle("宝典");
book.setAuthor("关系");
//1 加载核心配置文献
Configuration config = new Configuration().configure();
//2 获得sessionFactory,相称于连接池
SessionFactory factory = config.buildSessionFactory();
//3 获得session,相称于jdbc连接
Session session = factory.openSession();
//4启动事务
Transaction transaction = session.beginTransaction();
// 操作:添加
session.save(book);
//5 提交或回滚 commit() | rollback()
mit();
//6 释放资源
session.close();
factory.close();
}
6 整合日记log4j
6.1 java项目提醒
l 日记没有生效
6.2 日记框架介绍
6.3 整合log4j
l log4j 核心jar
l 过滤jar
l log4j 核心配置文献
注意:只需要添加文献,不需要读懂内容,之后讲解。
7 CURD操作
7.1 添加
@Test
public void demo01(){
//添加
Book book = new Book(); //注意:必须要手动bid的值
book.setTitle("宝典");
book.setAuthor("关系");
//1 加载核心配置文献
Configuration config = new Configuration().configure();
//2 获得sessionFactory,相称于连接池
SessionFactory factory = config.buildSessionFactory();
//3 获得session,相称于jdbc连接
Session session = factory.openSession();
//4启动事务
Transaction transaction = session.beginTransaction();
// 操作:添加
session.save(book);
//5 提交或回滚 commit() | rollback()
mit();
//6 释放资源
session.close();
factory.close();
}
7.2 更新
@Test
public void demo02(){
//更新 bid=3 title=葵花
Book book = new Book();
book.setBid(3);
book.setTitle("葵花");
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//操作
session.update(book); //通过id更新所有的数据,假如没有设立值,将更新默认值
mit();
session.close();
factory.close();
}
7.3 删除
@Test
public void demo03(){
// 删除 bid=2
Book book = new Book();
book.setBid(2);
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//删除 ,通过id删除
session.delete(book);
mit();
session.close();
factory.close();
}
7.4 通过id查询
@Test
public void demo04(){
// 通过 bid=4
Integer bid = 4;
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//通过id查询
Book book = (Book)session.get(Book.class, bid);
System.out.println(book);
mit();
session.close();
factory.close();
}
7.5 查询所有
@Test
public void demo05(){
// 查询所有
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//需要hibernate提供hql语句进行查询
// * hql : hibernate query language 查询语言,面向对象的查询语言,类似与sql语句。
// * sql语句查询所有:select * from t_book --sql语句使用的表
// * hql语句查询所有:from Book --hql语句使用的对象
Query query = session.createQuery("from Book");
List<Book> allBook = query.list();
for (Book book : allBook) {
System.out.println(book);
}
mit();
session.close();
factory.close();
}
7.6 分页查询
@Test
public void demo06(){
//分页查询
// * sql语句分页:select * from t_book limit ?,?
// * 开始索引:startIndex,从0开始 。算法:startIndex = (pageNum - 1) * pageSize
// * 每页显示个数:pageSize
Configuration config = new Configuration().configure();
SessionFactory factory = config.buildSessionFactory();
Session session = factory.openSession();
Transaction transaction = session.beginTransaction();
//分页,在查询所有基础上
Query query = session.createQuery("from Book");
// ### 第一页
// * 设立开始索引
//query.setFirstResult(0);
// * 设立每页显示个数
//query.setMaxResults(2);
// ### 第二页
// * 设立开始索引
query.setFirstResult(2); // (2 - 1) * 2
// * 设立每页显示个数
query.setMaxResults(2);
List<Book> allBook = query.list();
for (Book book : allBook) {
System.out.println(book);
}
mit();
session.close();
factory.close();
}
8 api详解
8.1 体系结构
vo:value object ,值对象,使用在web层,用于显示数据。
bo:business object,业务对象,使用在service层,根据不同页面封装对象,也许包含多个PO。
po:persistent object,持久对象,与数据库进行数据交互的。
一般情况使用javabean将三个对象统一。
8.2 Configuration对象
8.2.1 构造
l 用于加载src下的hibernate.properties文献,此文献为hibernate老版本中的核心配置文献,但现在已经不使用。
内容:properties中 key =value方式
例如:hibernate.connection.driver_class = com.mysql.jdbc.Driver
l hibernate提供参考文献
%hiberante%/project/etc/hibernate.properties
8.2.2 方法
l 核心配置文献
,加载的src下,hibernate.cfg.xml
configure("/资源文献途径") , 加载指定目录下的资源文献
l 映射文献
hbm.xml 后缀固定的,必须与javabean同包。
addResource("xml文献") 加载指定位置的映射文献
核心配置加载时,hibernate将执行addResource加载配置的映射文献
8.2.3 总结
开发中,必须将hbm.xml 配置到 hibernate.cfg.xml文献中
学习中,使用addClass 加载执行类的hbm.xml 文献,简化配置操作。
8.3 SessionFactory对象
l SessionFactory相称于连接池,可以提供操作数据的Session对象。
l SessionFactory 是线程安全,及不同的线程都可以使用。且可以保存,不同的线程获得session必须不同。
8.3.1 获得方式
SessionFactory factory = config.buildSessionFactory();
8.3.2 方法
//3.1 获得一个新的session , 每执行一次openSession() 将获得一个新的session
Session session = factory.openSession();
//3.2 获得当前线程中绑定的session,同一个线程共享一个session
// * 注意:默认情况下不能使用,必须进行配置(暂时不用)
Session session2 = factory.getCurrentSession();
8.3.3 工具类
public class H3Utils {
// 获得SessionFactory。相称于连接池,只有一个
private static SessionFactory factory;
static{
factory = new Configuration().configure().buildSessionFactory();
}
/**
* 获得一个新的session
* @return
*/
public static Session openSession(){
return factory.openSession();
}
/**
* 获得线程中绑定的session
* @return
*/
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}
8.4 Session对象
l 相称于JDBC的连接Connection ,用于操作PO(持久)对象
l session线程不安全的,及不同的线程必须使用不同的session。
l 常用方法:
save:将指定PO保存数据库,底层将触发一条insert语句。
persist 是jpa提供的保存对象的方法,与save等效的。
update:通过id更新所有的数据,底层将触发一条update语句。
saveOrUpdate:假如没有id值,将执行save 及 insert语句。
假如有id值,将执行update 及 update语句。
delete : 通过id删除
get : 通过id查询对象,立即查询,当执行get方法之后,立即触发select语句。假如没有查询到,返回null
load : 通过id查询对象,延迟查询,当执行load方法之后,不触发select语句,直到使用了查询对象的具体的数据时,才触发select语句。假如没有查询到,将抛异常。
createQuery: 执行HQL语句
createSQLQuery:执行sql语句
createCriteria : hibernate提供 QBC语句。(不研究)
merge : 与saveOrUpdate非常相似,假如没有id值将执行insert语句
假如有id值,将执行select语句,假如数据没有变化,将不触发任何语句。
假如数据变化了,将触发update语句。
8.5 事务transaction对象
l 启动事务:session.beginTransaction();
l 提交事务:mit();
l 回滚事务:transaction.rollback();
l 获得当前事务:session.getTransaction();
//启动
session.beginTransaction();
//获得当前事务并提交
session.getTransaction().commit();
9 核心配置文献详解
l 位置:src
l 名称:hibernate.cfg.xml
9.1 创建数据基本配置
## MySQL
#hibernate.dialect org.hibernate.dialect.MySQL5Dialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql://localhost:3306/test
#hibernate.connection.username gavin
#hibernate.connection.password
## Oracle
#hibernate.dialect org.hibernate.dialect.Oracle8iDialect
#hibernate.dialect org.hibernate.dialect.Oracle9iDialect
#hibernate.dialect org.hibernate.dialect.Oracle10gDialect
#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
#hibernate.connection.username ora
#hibernate.connection.password ora
#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:orcl
9.2 内容
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- #1 基本4项
* 注意:必须手动创建数据库,create database h_day01;
-->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/h_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- #2 方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- #3 自动创建表
* 假如表不存在,抛异常:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'h_day01.t_book' doesn't exist
* 开发时此配置不建议使用,学习时可以使用。
** 开发中先有数据库和表,根据表生成javabean和配置文献
* 取值:validate | update | create | create-drop
create : 每一次运营时,都将创建表,运营完毕表没有删除。一般用于测试。
create-drop : 每一次运营时,都将创建表,运营完毕表删除。一般用于测试。注意:factory必须执行close方法。
validate : 运营时校验hbm.xml 是否与 表匹配。假如不匹配,将抛异常。
update : 假如表不存在,将创建。假如表存在,将更新(只添加,不删除)字段。
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- #4 sql语句 -->
<!-- 显示sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- #5 java web 6.0项目 将对bean进行校验,假如不校验,运营时将抛异常。一般情况采用取消校验
* 6.0项目默认情况存在一个jar包,进行bean校验:bean-validator.jar
<property name="javax.persistence.validation.mode">none</property>
-->
<!-- 添加映射文献
-->
<mapping resource="cn/itcast/a_hello/Book.hbm.xml"/>
</session-factory>
</hibernate-configuration>
10 映射文献详解
10.1 基本配置内容
<!--
<hibernate-mapping> 根标签
* package 用于配置包。假如配置了包之后使用同包下面的类时,就可以只写类名,而不需要全限定名称。
# 没有配置 <class name="cn.itcast.d_hbm.User">
# 配置 <hibernate-mapping package="cn.itcast.d_hbm">
<class name="User">
<class> 用于配置 对象 和表 之间的关系的
* name : 用于拟定对象。默认使用的类的全限定名称
* table : 数据库中的表名。一般建议:表都应当有前缀
* catalog : 用于拟定数据库的名称,默认使用hibernate.cfg.xml 配置url设立的数据库名称。例如:h_day01
<id>子标签 , 用于配置主键
* name : 对象的字段名称
* <generator> 用于配置主键生成策略
<property> 用于配置PO类的普通属性
* name : 默认情况使用的是属性名称 (通过getter或setter方法获得)
* column : 拟定表中相应字段(列)名称。默认值name的值
* length : 拟定字段的长度。假如 varchar 默认值255
* type : 拟定字段类型
1 使用hibernate类型:type="string" 注意大小写
2 使用java类型:type="java.lang.String"
3 使用sql类型:例如:varchar
<property name="username">
<column name="xxx" sql-type="varchar(50)">
* not-null 是否为null
* unique 是否唯一
注意:假如配置文献存在sql关键字,建议使用重音符修饰字段的名称
<property name="desc" column="`desc`"></property>
托马斯·穆勒
-->
10.2 主键生成策略
主键生成策略,hibernate根据不同策略用于生成数据库的主键值的。
#1 increment , hibernate 自己维护主键的增强。通过执行select max(id) from ...查询最大值,加1.
建议:一般不使用,存在线程并发访问问题
#2 identity ,hibernate 将采用数据库底层的自动增强。例如:mysql auto_increment
#3 sequence ,hibernate 将采用数据库底层的序列。例如:oracle 不支持自动增强,但支持序列
#4 hilo,高低位算法,假如数据库不支持序列,也不支持自动增强,hibernate将采用算法机制。
#5 native ,根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】
*** 以上5个策略 主键字段类型,必须是整形(long, short 或者 int )
#6 uuid 使用随机字符串【】
*** 以上6个策略 代理主键(hibernate维护的)
#7 assigned 自然主键(程序自己维护)【】
11 持久对象唯一标记符:OID
l 数据库中的数据,根据主键的值不同进行区分。
l java对象,根据内存中地址不同进行分区。
l PO对象,根据对象的用于存放主键的字段的值进行区分。
用于存放表中主键的javabean的字段称为:OID
例如:
user1 = new User(); user1.setUid(1);
user2 = new User(); user2.setUid(1);
user1 和 user2 两个java对象,但是一个PO对象(oid相同)
12 持久对象状态
12.1 分类
l hibernate规定三种状态
瞬时态:transient,session没有缓存,数据库没有数据。例如:new对象
OID没有值
持久态:persistent,session缓存,数据库中最终会有数据。例如:save(obj)
OID有值
脱管态:detached,session没有缓存,但数据库中有数据。例如:new User() , user.setUid(1)
OID有值
12.2 状态的转换
l 瞬时
--> 持久:当执行save() 或 saveOrUpdate() 将瞬时转换持久
--> 脱管:手动设立OID
l 持久
--> 瞬时:执行delete()
--> 脱管:session.close() 关闭
session.clear() 清空缓存
session.evict(obj) 将执行的PO对象从session移除
l 脱管
--> 持久:执行update() 或 saveOrUpdate()
--> 瞬时:手动删除OID
13 一级缓存
13.1 介绍
l Session接口对象实现类,提供很多集合用于存放一个连接中的数据,此类集合将其称为:一级缓存。
l 一级缓存:session级别的缓存,假如session销毁,一级缓存不存在了。
l 缓存:介于应用程序和数据库之间
展开阅读全文