Hibernate 框架(第一天笔记)
1、Hibernatede 用处、作用和优势
- Hibernate使程序员通过操作对象的方式来操作数据库表记录
- Hibernate的作用
- 将数据存储到数据库中
- 从数据库中读取数据
- Hibernate的优势
- 屏蔽了应用程序与数据库之间的联系,让应用程序操作数据库更加简单
- 当底层数据库发生变化的时候,应用程序不需要发生改变,方便
2、Hibernate 的快速入门
入门程序创建的是Java项目
-
下载Hibernate 的运行环境
-
搭建hibernate 的开发环境
- 创建工程
- 引入所需的jar包
- 在工程目录下新建lib文件夹
- 复制官方发布的lib包中的required下的jar包
- 引入数据库的jar包
-
创建表结构
- 新建数据库:
- 数据库名称:hibernate 注意编码方式UTF-8
- 创建表
- 新建数据库:
-
编写Javabean实体类
- 注意实体类的编写规范
- 尽量使用包装类型
- 建议实现序列化接口
- 一定要无参构造方法
- 注意实体类的编写规范
-
创建类结构与表结构的映射
- 在JavaBean所在的包下创建xml的映射文件
- 映射文件命名规范:实体类名称.hbm.xml
- 在映射文件中引入约束
- 如果电脑可以联网,则自动从网上下载DTD,在编写xml就会有提示
- 如果不能上网,编写配置文件是没有提示的,需要自己来配置实际开发中,都是配置本地DTD文件的
- 编写映射文件
- 在JavaBean所在的包下创建xml的映射文件
-
编写hibernate的核心配置文件
- 在src目录下创建核心配置文件 hibernate.cfg.xml
- 在xml文件中引入DTD约束
- 没网的情况下,编写xml时,没有提示,需要手动配置,配置方法同映射文件的配置
- 编写核心配置文件
-
编写测试代码
- 测试代码执行过程
- 实例化Configuration的对象
- 读取配置文件(hibernate.cfg.xml)
- 构建SessionFactry
- 获取session
- 开启事务
- 执行数据库操作(存或读)
- 提交事务
- 释放资源
- 测试代码执行过程
3、Hibernate映射文件
-
class标签
- 作用:将类与数据库建立映射联系(建在domain包下)
- name 属性: 类的全路径名
- table 属性: 表名(类名与表名一致,那么table属性可以省略)
- catalog 属性:数据库的名称,基本上都会省略不写
-
id 标签
- 作用:用来将类中的属性与表中的主键建立映射,id标签就是用来配置主键的
- name属性:类中属性名
- column属性:表中的字段名(如果类中的属性名与表中的字段名一致,那么可以不用写)
- length属性:字段长度,如果数据库已经创建好了,那么length可以不写。如果没有创建好,生成表结构的时候length最好指定
- generator标签:用于指定主键的生成策略,class 属性一般取值为native,表示:判断底层数据库类型,如果是mysql,采用自增长来维护主键,如果是orcal,采用序列化来维护主键
-
property标签
- 作用:用来将类中的普通属性与表中的字段建立映射
- name属性:类中的属性名
- column属性:表中的字段名(如果类中的属性名与表中的字段名一致,则可以省略)
- length属性:字段的长度。(一般不写)
- thpe属性:数据类型(一般都不需要编写)
4、Hibernate核心配置文件
-
核心配置的两种方式
-
第一种方式是属性文件的形式,即properties的配置文件
hibernate.propertieshibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url=jdbc:mysql://localhost:3306/hibernate hibernate.connection.username=root hibernate.connection.password=123456 hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=true hibernate.format_sql=true
缺点:不能加载映射的配置文件,需要手动编写代码去加载
//创建Configuration类的对象 Configuration cfg = new configuration();<br> //添加映射文件<br> cfg.addResource("cn/jhw/domain/Customer.hbm.xml");
-
第二种方式是XML文件的形式,开发基本都会选择这种方式
hibernate.cfg.xml
//加载配置文件 Configuration configuration = new Configuration().configure()
优点:
- 格式比较清晰
- 编写有提示
- 可以在该配置文件中加载映射的配置文件(最主要的)
-
-
关于hibernate.cfg.xml文件的配置方式
- 必须有的配置
数据库连接信息
<!-- 配置数据库驱动类名 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 配置数据库连接地址 --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate</property> <!-- 数据库用户名 --> <property name="hibernate.connection.username">root</property> <!-- 数据库密码 --> <property name="hibernate.connection.password">123</property>
数据库方言
<!-- 配置数据库方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
可选配置
hibernate.show_sql:显示sql语句<!-- 打印sql语句 --> <property name="hibernate.show_sql">true</property>
hibernate.format_sql:格式化sql语句
<!-- 格式化sql --> <property name="hibernate.format_sql">true</property>
hibernate.hbm2ddl.auto :通过映射转成DDL语句,可取create、create-drop、update(常用)、validate
<!-- create:指定每次在加在hibernate框架时,先删除表结构,再创建表结构 create-drop:指定每次在加在hibernate框架时,先删除表结构,再创建表结构,当sf关闭时,删除表结构 update:指定每次在加在hibernate框架时,验证实体类和表结构是否一致,如果不一致,就更新表结构 validate:指定每次在加在hibernate框架时,验证实体类和表结构是否一致,如果不一致,就会报错 --> <property name="hibernate.hbm2ddl.auto">update</property>
加载映射文件
<!-- 引入自定义的映射文件 --> <mapping resource="cn/jhw/domain/Customer.hbm.xml"/>
5、Hibernate 中的API介绍
-
Configuration类
-
作用
- Configuration对象用于配置并且启动Hibernate
- Hibernate应用通过该对象来获取对象关系映射文件中的数据,以及动态的配置Hibernate属性,然后创建SessionFactory对象
- 简单的一句话:加载Hibernate的核心配置文件,可以获取SessionFactory对象
-
常用方法
- 默认的构造函数:只能加载类的根路径下,名称为hibernate.properties的配置文件;
- configure() :用于加载类的根路径下,名称为hibernate.cfg.xml的配置文件;
- buildSessionFactory() :根据配置文件,构建SessionFactory;
- addResource():指定映射文件的位置;
- addClass(Class clazz):指定实体类的字节码;
-
-
SessionFactory 接口(一般应用使用一个SessionFactory,最好是应用启动时就完成初始化。)
-
作用
- SessionFactory接口负责初始话hibernate,充当数据处理源的代理,并负责创建Session对象
-
常用方法
- openSession():每次都是生成一个新的Session
- getCurrentSession():获取当前线程的Session
-
-
编写HibernateUtils的工具类
/** * Hibernate的工具类:创建SessionFactory,获取Session * @author jhw */ public class HibernateUtils { private static final SessionFactory sf; static{ sf = new Configuration().configure().buildSessionFactory(); } /** * 获取Session的工具方法 * @author jhw */ public static Session openSession(){ return sf.openSession(); } }
-
SessionFactory 中使用数据库连接池
- 如果我们要使用第三方的连接池如c3p0,那么需要我们自己手动去配置
- 配置步骤:
-
导入c3p0所需的jar包
-
在hibernate的核心配置文件中配置
<!-- 指定采用c3p0数据库连接池 --> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!-- 在数据库连接池中可用的数据库连接的最小数目 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 在数据库连接池中可用的数据库连接的最大数目 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 设置数据库连接的过期时间,以秒为单位,连接池中某个数据库连接空闲时间超过了timeout时间,就会从连接池中清除 --> <property name="hibernate.c3p0.timeout">5000</property> <!-- 每3000秒检查所有的连接池中的空闲连接,以秒为单位 --> <property name="hibernate.c3p0.idle_test_period">3000</property>
-
-
Session接口
-
概述
- Session是在Hibernate中使用最频繁的接口,它提供了和持久化有关的操作,比如增删改查;
- Session是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate运作的中心
- Session是线程不安全的
- 持久化对象必须在Session的管理下才可以进行持久化操作
-
特点
- 不是线程安全的,应避免多个线程使用同一个Session实例
- Session是轻量级的,它的创建和销毁不会消耗太多资源。应为每次客户请求分配独立的session实例
- Session有一个缓存,被称之为Hibernate的一级缓存,每个session实例都有一个自己的缓存。
-
常用方法
- save(Object entity); //保存一个实体到数据库
- update(Object entity); //更新一个实体
- delete(Object entity); //删除一个实体
- get(Class clazz,Serializable id);//根据id查询一个实体。Class:表示要查询的实体类字节码 Serializable:就是查询条件
- beginTransaction();//开启事务,并返回事务对象
- load(Class clazz,Serializable id);//根据id查询一个实体。Class:表示要查询的实体类字节码 Serializableb:就是查询条件
-
-
Transaction 接口
- 什么是事务? ---> 事务是逻辑上的一组操作单元,该单元里的所有操作要么全部成功,要么全部取消
- 事务的特性:原子性、一致性、隔离性、持久性、
补充 : 实体查询的两个方法
-
概念 : 所谓的实体查询即OID查询,就是使用主键作为条件来查询一个实体。其中涉及的方法是Session对象get方法和load方法。
-
两种方法的区别:
-
查询时机不一样
-
get方法任何时候都是立即加载,即只要一调用get马上发起数据库的查询
-
load方法默认情况下是延迟加载,即真正用到对象的非OID字段数据时才会发起查询
-
load方法可以通过配置的方式改为立即加载。
配置方式<class name="Customer" table="cst_customer" lazy="false">
-
-
返回结果不一样
- get方法永远返回查询的实体类对象
- load方法当延迟加载时,返回的时实体类的代理对象
-
-
涉及的概念:
- 立即加载:
- 是不管用不用马上查询。
- 延迟加载:
- 等到用的时候才真正发起查询。
- 立即加载: