1、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提供了对关系
2、型数据库增删改查操作 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
3、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 约束:
l 正文内容
6、operty>
8、
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 约束:
l 正文内容:
11、ibernate.cfg.xml)中
12、nfigure(); //2 获得sessionFactory,相称于连接池 SessionFactory factory = config.buildSessionFactory(); //3 获得session,相称于jdbc连接 Session session = factory.openSession(); //4启动事务 Transaction transaction = session.beginTransaction(); // 操作:添加 session.save(book); //5 提交或回滚 commi
13、t() | 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(){ //添加
14、 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
15、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(){ //更新 bi
16、d=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.beginTransactio
17、n(); //操作 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();
18、 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 publ
19、ic 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 b
20、ook = (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.buildSessionFact
21、ory(); 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语句使用的对象
22、
Query query = session.createQuery("from Book");
List
23、 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 tr
24、ansaction = session.beginTransaction(); //分页,在查询所有基础上 Query query = session.createQuery("from Book"); // ### 第一页 // * 设立开始索引 //query.setFirstResult(0); // * 设立每页显示个数 //query.setMaxResults(2); // ### 第二页 // * 设立开始索引 query.setFirstResult(2); // (2 - 1) * 2 //
25、 设立每页显示个数
query.setMaxResults(2);
List
26、ervice层,根据不同页面封装对象,也许包含多个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 hibern
27、ate提供参考文献 %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 总结 开发中,必须将
28、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 获得一个新的ses
29、sion , 每执行一次openSession() 将获得一个新的session Session session = factory.openSession(); //3.2 获得当前线程中绑定的session,同一个线程共享一个session // * 注意:默认情况下不能使用,必须进行配置(暂时不用) Session session2 = factory.getCurrentSession(); 8.3.3 工具类 public class H3Utils { // 获得SessionFactory。相称于连接池,只有一个 private static Sessi
30、onFactory factory; static{ factory = new Configuration().configure().buildSessionFactory(); } /** * 获得一个新的session * @return */ public static Session openSession(){ return factory.openSession(); } /** * 获得线程中绑定的session * @return */ public static Session get
31、CurrentSession(){ 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
32、值,将执行save 及 insert语句。 假如有id值,将执行update 及 update语句。 delete : 通过id删除 get : 通过id查询对象,立即查询,当执行get方法之后,立即触发select语句。假如没有查询到,返回null load : 通过id查询对象,延迟查询,当执行load方法之后,不触发select语句,直到使用了查询对象的具体的数据时,才触发select语句。假如没有查询到,将抛异常。 createQuery: 执行HQL语句 createSQLQuery:执行sql语句 createCriteria : hibernat
33、e提供 QBC语句。(不研究) merge : 与saveOrUpdate非常相似,假如没有id值将执行insert语句 假如有id值,将执行select语句,假如数据没有变化,将不触发任何语句。 假如数据变化了,将触发update语句。 8.5 事务transaction对象 l 启动事务:session.beginTransaction(); l 提交事务:mit(); l 回滚事务:transaction.rollback(); l 获得当前事务:session.getTransaction(); //启动 session.beginTrans
34、action(); //获得当前事务并提交 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:/
35、/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.conne
36、ction.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 内容
38、
39、MySQL5Dialect
41、
46、成策略 主键生成策略,hibernate根据不同策略用于生成数据库的主键值的。 #1 increment , hibernate 自己维护主键的增强。通过执行select max(id) from ...查询最大值,加1. 建议:一般不使用,存在线程并发访问问题 #2 identity ,hibernate 将采用数据库底层的自动增强。例如:mysql auto_increment #3 sequence ,hibernate 将采用数据库底层的序列。例如:oracle 不支持自动增强,但支持序列 #4 hilo,高低位算法,假如数据库不支持序列,也不支持自动增强,h
47、ibernate将采用算法机制。 #5 native ,根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。【】 *** 以上5个策略 主键字段类型,必须是整形(long, short 或者 int ) #6 uuid 使用随机字符串【】 *** 以上6个策略 代理主键(hibernate维护的) #7 assigned 自然主键(程序自己维护)【】 11 持久对象唯一标记符:OID l 数据库中的数据,根据主键的值不同进行区分。 l java对象,根据内存中地址不同进行分区。 l PO对象,根据对象的用于存放主键的字段的值进行区分。
48、用于存放表中主键的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)
49、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 缓存:介于应用程序和数据库之间






