收藏 分销(赏)

2023年hibernate知识点详解王成敏.doc

上传人:二*** 文档编号:4751703 上传时间:2024-10-11 格式:DOC 页数:69 大小:1.28MB 下载积分:5 金币
下载 相关 举报
2023年hibernate知识点详解王成敏.doc_第1页
第1页 / 共69页
本文档共69页,全文阅读请下载到手机保存,查看更方便
资源描述
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 缓存:介于应用程序和数据库之间
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服