1.2 Hibernate的概述
1.2.1 什么Hibernate
Hibernate就是一个持久层的ORM的框架。对JDBC做了封装。
1.2.2 什么是ORM
ORM:Object Relational Mapping对象关系映射。
将对象与数据库中表建立映射关系,操作对象就可以操作数据库中表。
1.2.3 为什么学习Hibernate
1.3 Hibernate的入门
1.3.1 下载Hibernate的开发包
Hibernate提供了3.x 、4.x、 5.x版本
https://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/
1.3.2 解压hibernate
documentation :Hibernate的开发规范和文档
lib :Hibernate的开发使用的jar包
project :Hibernate的提供测试的工程。
1.3.3 创建项目,引入jar包
引入lib/required/*.jar
数据库驱动包
日志包
1.3.4 创建数据库和表
CREATE TABLE `cst_customer` (
`cust_id` int 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;
1.3.5 创建实体类
1.3.6 创建Hibernate的映射文件
Hibernate的映射文件只要是一个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:类的全路径
* table:数据库表名称
-->
<class name="com.itheima.hibernate.domain.Customer" table="cst_customer">
<!-- 建立类中的属性与表中的字段的映射 -->
<!--
id标签:用来建立表中的主键字段与类中的属性的映射
-->
<id name="cust_id" column="cust_id">
<!-- 主键生成策略: -->
<generator class="native"/>
</id>
<!-- 其他的属性都是用property建立映射 -->
<property name="cust_name" column="cust_name"/>
<property name="cust_source" column="cust_source"/>
<property name="cust_industry" column="cust_industry"/>
<property name="cust_level" column="cust_level"/>
<property name="cust_phone" column="cust_phone"/>
<property name="cust_mobile" column="cust_mobile"/>
</class>
</hibernate-mapping>
1.3.7 创建Hibernate核心配置文件: 默认SRC下有个hibernate.cfg.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:///hibernates</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">abcd</property>
<!-- 配置Hibernate的相关属性 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选属性 -->
<!-- 显示SQL -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL -->
<property name="hibernate.format_sql">true</property>
<!-- hbm2ddl -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载映射文件: -->
<mapping resource="com/itheima/hibernate/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
ml 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> <!-- session-factory:连接池 session:连接对象 -->
<!-- 5个必选项 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</property>
<!-- 配置方言 分页: limit sqlserver:top oracle:sql嵌套 -->
<!-- 作用:就是让hibernte自动的匹配符合当前数据库的sql语法 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选的 -->
<!-- 集成c3p0连接池 -->
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!-- 让控制台输出hibernate生成的sql语句 默认是一行-->
<property name="hibernate.show_sql">true</property>
<!-- 可以格式化sql语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 可以让hibernate根据配置好的映射文件自己生成表 -->
<!--
create: 没有 :hibernate根据映射文件创建对应的表,如果有表:删除再创建
create-drop:没有 :hibernate根据映射文件创建对应的表,如果有表:删除再创建 ,用完就删掉
// 测试数据的时候使用
update: 没有表创建表,有表使用表
validate: 默认的值 hibernate不会创建任何表
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 引入映射文件地址 -->
<mapping resource="cn/itcast/domain/Customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
1.3.8 编写代码
@Test
/**
* 保存客户
*/
public void demo1(){
// 1.加载核心配置文件:
Configuration configuration = new Configuration().configure();
// 2.创建一个SessionFactory对象(类似于连接池)
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.获得Session对象(连接对象)
Session session = sessionFactory.openSession();
// 4.开启事务
Transaction transaction = session.beginTransaction();
// 5.操作
Customer customer = new Customer();
customer.setCust_name("郝宝强");
session.save(customer);
// 6.事务提交
transaction.commit();
// 7.资源释放
session.close();
}
1.4 Hibernate的常见配置
1.4.1 XML的提示问题
1.4.2 核心配置文件的配置
l Hibernate的核心配置文件的方式有两种
n hibernate.properties:不能加载映射文件。必须手动编写代码加载映射文件。(必须加载核心配置文件hibernate.properties,还要加载映射文件customer.hbm.xml文件)
n hibernate.cfg.xml:结构清晰。(工作中使用)
手动加载映射文件 手动加载:con.addResource("cn/itcast/domain/customer.hbm.xml");
l Hibernate的核心配置文件中的内容:
n 数据库连接基本的参数
n Hibernate的属性
n 映射文件加载
1.4.3 映射文件配置
映射文件就是将类与表建立映射关系文件,这个文件只要是XML即可。通常名称:类名.hbm.xml
l class标签:建立类和表的映射
n name :类的全路径
n table :数据库中表的名称。
n catalog :数据库名称(可以省略)
l id标签:建立主键和类中属性映射
n name :类中的属性的名称
n column :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)
l property标签:建立普通字段与类中属性映射
n name :类中的属性的名称
n column :表中的字段名称。(如果类中的属性名和表中的字段名一致,column可以省略)
n length :字段的长度(自动创建表) 在hibernate自动创建表的时候字段的长度都是最长
n not-null :非空(自动创建表)
n unique :唯一(自动创建表)
1.5 Hibernate的常用API
1.5.1 Configuration :配置对象
l 用来加载核心配置文件
n hibernate.cfg.xml
Configuration cfg = new Configuration().configure();
l 用来加载映射文件
手动加载:con.addResource("cn/itcast/domain/customer.hbm.xml");
1.5.2 SessionFactory:session工厂对象
Session工厂,是一个线程安全的对象,内部维护Hibernate的连接池。一般一个应用只需要创建一次的对象。
l 抽取工具类:
l 配置C3P0连接池:
引入C3P0相关jar包:
配置C3P0
<!-- 配置C3P0连接池 -->
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
1.5.3 Session(*****):连接对象
Session相对于Connection,是线程不安全的,Session是Hibernate持久化操作的核心API。
l Serializable save(Object obj); 保存数据
l T get(Class clazz, Serializable id); 根据ID查询数据
l T load(Class clazz, Serializable id); 根据ID查询数据
l update(Object obj);
l delete(Object obj);
1.5.4 Transaction :事务对象
l commit();提交事务
l rollback();回滚事务
1.5.5 Hibernate 单条查询get和load区别
l hibernate在单条查询的时候有
l session.get(class,id)
l session.load(class,id)
l 两者的区别:
l 1.get查询是立即加载,load查询延迟加载
l 2.get返回的是本身的对象,load返回的是代理对象
l 3.get在查不到数据的时候返回null load在查不到数据的时候会报错