1.Hibernate框架的概述
1.1 框架的概述
1.2 什么是框架
框架指的是软件的半成品,已经完成了部分功能
1.3 EE的三层结构
1.4 hibernate的基本概述
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的JaveEE架构中取代CMP,完成数据持久化的重任。
1.5 什么是ORM
ORM:Object Relational Mapping(对象关系映射) 指的是将一个java中的对象与关系型数据库中的表建立一中关系映射,从而来操作对象,就可以操作数据库中的表。
1.6 为什么学习Hibernate
与其他操作数据库的技术相比,Hibernate具有以下几点优势:
-
hibernate对JDBC访问数据库的代码做了轻量级封装,大大简化了数据访问层繁琐的重复性代码,并且减少了内存消耗,加快了运行效率。
-
Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度的简化了DAO(Data Access Object,数据访问对象)层编码工作
-
Hibernate的性能非常好,映射的灵活性很出色。它 支持很多关系型数据库,从一对一到多对多的各种复杂关系。
-
可扩展性强,由于源代码的开源以及API 的开放,当本身功能不够用时,可以自行编码进行扩展、
2.Hibernate入门
2.1下载Hibernate
http://https://sourceforge.net/projects/hibernate/
2.1.1 解压,目录结构
- documentation:Hibernate开发的文档
- lib:Hibernate开发包
- required:Hibernate开发的必须的依赖包
- optional:Hibernate开发的可选的jar包
- project:Hibernate提供的项目
2.2 创建一个项目,引入jar包
- 数据库驱动包
- Hibernate开发的必须的jar包
- 在hibernate解压目录下的lib/required目录下的所有jar包
- Hibernate引入日志记录包
2.3 建表
CREATE TABLE `cst_customer` (
`cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客户编号(主键)',
`cust_name` varchar(32) NOT NULL COMMENT '客户名称(公司名称)',
`cust_source` varchar(32) DEFAULT NULL COMMENT '客户信息来源',
`cust_industry` varchar(32) DEFAULT NULL COMMENT '客户所属行业',
`cust_level` varchar(32) DEFAULT NULL COMMENT '客户级别',
`cust_phone` varchar(64) DEFAULT NULL COMMENT '固定电话',
`cust_mobile` varchar(16) DEFAULT NULL COMMENT '移动电话',
PRIMARY KEY (`cust_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2.4创建实体类
public class Customer {
private long cust_id;
private String cust_name;
private String cust_source;
private String cust_industry;
private String cust_level;
private String cust_phone;
private String cust_mobile;
- 创建Customer.java实体类
- 生成set()和get()方法
2.5 创建映射
映射需要通过XML的配置文件来完成,这个配置文件可以任意命名。尽量统一命名规范(类名.hbm.xml)。
<?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="com.hibernate.day01.Customer" table="cst_customer">
<!-- 建立类中的属性与表中的主键对应 -->
<id name="cust_uid" column="cust_uid">
<generator class="native"></generator>
</id>
<!-- 建立类中的普通的属性和表的字段的对应 -->
<property name="cust_name" column="cust_name"></property>
<property name="cust_source" column="cust_source"></property>
<property name="cust_industry" column="cust_industry"></property>
<property name="cust_level" column="cust_level"></property>
<property name="cust_phone" column="cust_phone"></property>
<property name="cust_mobile" column="cust_mobile"></property>
</class>
</hibernate-mapping>
2.6 创建一个Hibernate的核心配置文件
Hibernate的核心配置文件的名称:hibernate.cnf.xml
<?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>
<!-- 连接数据库的基本参数 -->
<property name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url"> jdbc:mysql:///hibernate_day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 配置Hibernate的方言-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="com/hibernate/day01/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
以上配置必须要有,如果要打印SQL语句,就加上以下配置即可。
<!-- 可选配置 -->
<!-- 打印SQL语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.formate_sql">true</property>
2.7 测试
public class HibernateDemo01 {
@Test
// 保存客户的案例
public void demo1(){
// 1.加载Hibernate的核心配置文件
Configuration configuration = new Configuration().configure();
// 2.创建一个SessionFactory对象:类似于JDBC中连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.通过SessionFactory获取到Session对象:类似于JDBC中Connection
Session session = sessionFactory.openSession();
// 4.手动开启事务:
Transaction transaction = session.beginTransaction();
// 5.编写代码
Customer customer = new Customer();
customer.setCust_name("admin");
session.save(customer);
// 6.事务提交
transaction.commit();
// 7.资源释放
session.close();
sessionFactory.close();
}
}
3. Hibernate的配置
3.1 映射的配置
hibernate根据映射关系可以自动生成表。
- 【class标签的配置】
- 标签用来建立类与表的映射关系
- 属性:
- name:类的全路径
- table: 表名(类名与表名一致时,table可以省略)
- catalog: 数据库名,可不写
- 【id标签的配置】
- 标签用来建立类中的属性与表中的主键的对应关系
- 属性:
- name:类中的属性名
- colums:表中的字段名(类中的属性名和表中的字段名一致时,column可以省略)
- length:长度
- type:类型
- 【property标签的配置】
- 标签用来建立类中的普通属性与表的字段的对应关系
- 属性:
- name:类中的属性
- colums:表中的字段名
- length:长度
- type:类型
- not-null: 非空约束
- unique: 唯一约束
3.2 Hibernate的核心的配置
3.2.1 属性文件方式
-
hibernate.properties文件
hibernate.connection.driver_class=com.mysql.jdbc.Driver hibernate.connection.url = jdbc:mysql:///hibernate_day01 hibernate.connection.username=root hibernate.connection.password=root
-
不能引入映射文件 (手动编写代码加载映射文件,比较少见)
3.2.2 方式二:xml文件方式(最常用)
- 必须的配置(hibernate/project/etc/hibernate.properties中有所有的配置)
- 连接数据库的基本的参数
- 驱动类
- url路径
- 用户名
- 密码
- 方言的配置
- 连接数据库的基本的参数
- 可选的配置
- 显示SQL语句:hibernate.show_sql
- 格式化SQL语句:hibernate.format_sql
- 自动建表:hibernate.hbm2ddl.auto
- none:不使用hibernate的自动建表
- create:如果数据库中已经游标,删除原有表一,重新创建;如果没有表,则新建表(测试)
- create-drop:如果数据库中已经游标,先删除原有表,然后执行操作,删除这个表;如果没有表,新建一个,使用了删除这个表。(测试)
- update:如果数据库中有表,使用原有表;如果没有,创建新表(更新表结构)
- validate:如果没有表,则不会创建新表,只会使用数据库中原有的表。(校验映射和表结构)
- 映射文件的引入
- 引入映射文件的位置
4.Hibernate的核心API
4.1 Hibernate的API
4.1.1 Configuration:Hibernate的配置对象
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
- 加载核心配置文件
- hibernate.properties
- Configuration cfg = new Configuration();
- 手动加载映射:
cfg.addResource("com/hibernate/day01/Customer.hbm.xml");
- 手动加载映射:
- Configuration cfg = new Configuration();
- hibernate.cfg.xml (常用)
-
Configuration configuration = new Configuration().configure();
-
- hibernate.properties
4.2 SessionFactory:Session工厂
SessionFactory接口负责初始化Hibernate。它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
SessionFactory内部维护了Hibernate的连接池和Hibernate的二级缓存。是线程安全的对象,一个项目创建一个对象即可。
- 配置连接池
<!-- 在连接池中可用的数据库连接的最小数目 -->
<property name="hibernate.c3p0.max_size">2</property>
<!-- 在连接池中可用的数据库连接的最大数目 -->
<property name="hibernate.c3p0.min_size">2</property>
<!-- 设定数据库连接的过期时间,以秒为单位, 如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_statements">100</property>
<!--没3000毫秒检查所有连接池中的空闲连接 -->
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="hibernate.c3p0.acquire_increment">2</property>
<property name="hibernate.c3p0.validate">false</property>
-
抽取工具类
public class HibernateUtils { public static final Configuration cfg; public static final SessionFactory sf; static { cfg = new Configuration().configure(); sf = cfg.buildSessionFactory(); } public static Session openSession() { return sf.openSession(); } }
4.3 Session:代表的是hibernate与数据库的连接对象。不是线程安全的。与数据库交互的桥梁。
Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。
-
Session中的API:
-
保存方法:
-
Serializable save(object obj)
public void save() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); customer.setCust_name("张三"); session.save(customer); transaction.commit(); session.close(); }
-
-
查询方法:
- T get(Class c,Serializable id)
- T load(Class c,Serializable id)
-
get方法和load方法的区别?
public void getANDload() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); /** * get方法: * 采用的是立即加载,执行到这行代码的时候,就会马上发送SQL语句去查询 * 查询后返回的是真是对象本身 * 查询一个找不到的对象的时候,返回null * * load方法: * 采用的是延迟加载,执行到这行代码的时候,不会发送SQL语句,当真正使用这个对像 的时候才会发送SQL语句 * 查询后返回的是一个代理对象。javassist-3.24.0-GA.jar利用javassist技术产生的代理 * 查询一个找不到的对象的时候,返回ObjectNotFoundException */ //使用get方法查询 //Customer customer = session.get(Customer.class, 1l); //System.out.println(customer); //使用load方法查新 Customer customer = session.load(Customer.class, 2l); System.out.println(customer); transaction.commit(); session.close(); }
-
修改方法
-
void update(Object obj)
public void update() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //直接创建对象,进行修改(不推荐) //Customer customer = new Customer(); //customer.setCust_id(1l); //customer.setCust_name("mamat"); //session.update(customer); //先查询,再修改(推荐) Customer customer = session.get(Customer.class, 1l); customer.setCust_name("萨马特"); session.update(customer); transaction.commit(); session.close(); }
-
-
删除方法
-
void delete(Object obj)
public void delete() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); //直接创建对象,在删除 //Customer customer = new Customer(); //customer.setCust_id(1l); //session.delete(customer); //先查询,再删除-->级联删除 Customer customer = session.get(Customer.class, 2l); session.delete(customer); transaction.commit(); session.close(); }
-
-
保存或更新
-
saveOrupdate(Object obj)
public void test05() { Session session = HibernateUtils.openSession(); Transaction transaction = session.beginTransaction(); Customer customer = new Customer(); //customer.setCust_name("老大"); //session.saveOrUpdate(customer); customer.setCust_id(9l); customer.setCust_name("唠叨"); session.saveOrUpdate(customer); transaction.commit(); session.close(); }
-
-
4.4 Transaction:事务对象
Hibernate中管理事务的对象。
- Transaction的API:
- commit():提交事务
- rollback():回滚