Hibernate框架概述
什么是框架
- 软件的一个半成品,已经帮你完成了部分功能。
- 把一些不确定的东西,按照框架要求,达到相应的功能
hibernate简介(JavaEE技术三层架构所用到的技术)
hibernate是什么框架
- Hibernate是一个开放源代码的对象关系映射框架
- 它对JDBC进行了非常轻量级的对象封装
- 它将POJO与数据库表建立映射关系,是一个全自动的orm框架
- hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
- Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用
- 持久层的ORM框架
ORM
- Object Relational Mapping(对象关系映射)。
- 指的是将一个Java中的对象与关系型数据库中的表建立一种映射关系,从而操作对象就可以操作数据库中的表。
hibernate好处
- 对JDBC访问数据库的代码进行了轻量级封装,简化了数据访问层繁琐重复性的代码,减少了内存消耗,加快了运行效率
- 是一个基本JDBC的主流持久化框架,很大程度上简化了DAO层的编码工作
- 性能非常好, 映射灵活性比较好,支持多关系数据库,一对一,一对多,多对多的各种复杂关系
- 可扩展性强,源代码及API开放,当本身功能不够用时,可以自行编码进行扩展
Hibernate基本使用
下载框架
https://sourceforge.net/projects/hibernate/files/hibernate-orm/
Hibernate目录
documentation
Hibernate开发的文档
lib
Hibernate开发的文档
required
Hibernate开发的必须的依赖包
optional
Hibernate开发的可选的jar包
project
Hibernate提供的参考项目
使用
1.创建一个项目
- 可以Java项目中使用
- 可以在Web项目中使用都可以
2.引入必须的jar包
- 数据库的驱动包
- Hibernate开发必须的Jar包
3.建表
CREATE TABLE `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;
4.创建ORM类
package ***.***.****;
import lombok.Getter;
import lombok.Setter;
import java.util.HashSet;
import java.util.Set;
@Getter@Setter
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;
@Override
public String toString() {
return "Customer{" +
"cust_id=" + cust_id +
", cust_name=\'" + cust_name + \'\\\'\' +
", cust_source=\'" + cust_source + \'\\\'\' +
", cust_industry=\'" + cust_industry + \'\\\'\' +
", cust_level=\'" + cust_level + \'\\\'\' +
", cust_phone=\'" + cust_phone + \'\\\'\' +
", cust_mobile=\'" + cust_mobile + \'\\\'\' +
\'}\';
}
}
5.创建Hibernate的核心配置文件
通常叫hibernate.cfg.xml
创建完毕后, 也有一个约束要引入
在org.hibernate包当中可以找到对应的dtd configuration.dtd
属性名记不住
在目录提供的project当中有一个etc
在etc当中 有一个hibernate.properties的文件打开
打开后,会看到连接各种数据库时需要的属性参数
需要配置方言
不同的数据库,使用的语言不一样
在hibernate当中,sql语句会自动帮你生成
设置方言,就是设置自动生成的语言是哪个数据库当中的sql
配置核心配置文件要加载哪一个映射
映射的路径就是上面创建的跟表相对应的配置文件
把全路径的点,要换成斜杠
6.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:///hibernate</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">1234</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>
<!-- 自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping resource="customer.hbm.xml"/>
</session-factory>
</hibernate-configuration>
7.customer.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.myxq.domain.Customer" table="customer" >
<!--建立类属性哪一个是主键 还要跟数据库当中主键进行对象-->
<id name="cust_id" column="cust_id" >
<generator class="native"/>
</id>
<!--建立类中的普通属性与数据库当中字段进行关联-->
<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"/>
<!--一对多-->
<set name="linkmens" cascade="save-update,delete" inverse="true"><!--set属性名称-->
<key column="link_cust_id"></key><!--外键-->
<one-to-many class="com.myxq.domain.Linkman"></one-to-many>
</set>
</class>
</hibernate-mapping>
8.创建 Test 类执行
@Test
public void test()
{
// 1.加载Hibernate的核心配置文件
Configuration configuration = new Configuration().configure();
// 2.创建一个SessionFactory对象:类似于JDBC中连接池
SessionFactory sessionFactory = configuration.buildSessionFactory();
// 3.通过SessionFactory获取到Session对象:类似于JDBC中Connection
Session session = sessionFactory.openSession();
// 5.编写代码
Customer customer = new Customer();
customer.setCust_name("Myxq2");
customer.setCust_level("12");
session.save(customer);
// 6.资源释放
session.close();
sessionFactory.close();
}
常见配置
xxx.hbm.xml映射配置
class标签
作用
建立类与表的映射关系
属性
name
类的全路径
table
表名
类名与表名一致,table可以省略
如果没有该表,或自动创建一个表
catalog
数据库名,可以不写
ID标签
作用
建立类中的属性与表中主键的对应关系
属性
name
column
length
type
property标签
作用
用于建立类中普通属性与表的对应关系
属性
name
类中的属性名
column
表中的字段名
如果字段名与类中的属性名一致,column是可以省略
length
字段的长度
默认数据库当中已经有长度了
hibernate是可以根据映射自动建表
建表是没有设定长度,就使用默认的长度
type
类型
可以不用写,会自动帮你装换
not-null
不允许为空
unique
唯一的
hibernate.cfg.xml核心配置
必须配置
连接数据库的基本的property参数
驱动类
url路径
用户名
密码
方言
可选配置
显示SQL
hibernate.show_sql
格式化SQL
hibernate.format_sql
自动建表
hibernate.hbm2ddl.auto
属性
none
不使用hibernate的自动建表
create
无论数据库中是否已经有表,都执行删除原有表,重新创建表的操作
create-drop
如果数据库中已经有表,删除原有表,执行操作,删除这个表。如果没有表,新建一个,使用完了删除该表。
最后数据库中一个表没有,为了做测试用
把sessionFactory也close掉时才有效果
update
如果数据库中有表,使用原有表,如果没有表,创建新表
更新表结构,如果column没有时会创建新的一列
validate
校验映射和表结构是否一致,不一致就会报错
如果没有表,不会创建表。只会使用数据库中原有的表
引入映射文件
<mapping resource="映射文件全路径"/>
提示
- dtd必须得要联网
- 如果没有联网,就没有提示
- 添加外部DTD
核心API
Configuration
Hibernate的配置对象
Configuration 类的作用是对Hibernate 进行配置,以及对它进行启动。
在Hibernate 的启动过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。
虽然Configuration 类在整个Hibernate 项目中只扮演着一个很小的角色,但它是启动hibernate 时所遇到的第一个对象。
通过这个对象去加载它里面的配置
把里面的数据内容或得到,才能进行后面的工作
作用
1.加载核心配置文件
核心配置文件是属性文件
直接configuration cfg = new configuration()
名称为:hibernate.properties
核心配置文件是一个xml
名称为:hibernate.cfg.xml
1.configuration cfg = new configuration();
2.cfg.config()
2.加载映射文件
属性文件是没有办法加载映射
可以通过config加载映射文件
configuration.addResource("映射文件的全路径");
SessionFactory
sessionFactory简介
SessionFactory接口:SessionFactory接口负责初始化Hibernate。
并负责创建Session对象。
需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,
当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory。
内部维护了Hibernate的连接池和Hibernate的二级缓存
一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
hibernate.cfg.xml 添加,配置连接池
- 了解即可,以后会使用spring进行整合
- C3P0
引入C3P0的jar包
添加C3P0的配置信息
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<!--在连接池中可用的数据库连接的最少数目 -->
<property name="c3p0.min_size">5</property>
<!--在连接池中所有数据库连接的最大数目 -->
<property name="c3p0.max_size">20</property>
<!--设定数据库连接的过期时间,以秒为单位,如果连接池中的某个数据库连接处于空闲状态的时间超过了timeout时间,就会从连接池中清除 -->
<property name="c3p0.timeout">120</property>
<!--每3000秒检查所有连接池中的空闲连接 以秒为单位-->
<property name="c3p0.idle_test_period">3000</property>
查看日志
把log4j.preperties放到src下
结构
输出源
- console控制台
- file文件
级别
error
只显示error信息
warn
显示warn error信息,比自己严重的信息
info
会显示 info debug trace级别的信息
debug
调试信息,会把上面的都显示
trace
栈信息
工具类
- 一个项目只需要创建一个就行了,因为里面有连接池,连接池创建一个就可以了
- 通过一个工具类来获取,只需要创建一次
session
- 代表的是hibernate与数据库的连接对象
- 与数据库交互的桥梁,通过它来完成与数据库的增删改查的工作
session的api
保存
save(Object obj)
查询
get(T.class,id)
1.查询之后,返回的是真实对象本身
2.没有查询到指定的id,返回的是一个空值
load(T.class,id)
1.查询之后返回的是一个代理对象,使用的是第三方的代理机制,javassist.jar
2.没有查询到结果直接报一个异常
修改
void update(Object obj)
直接创建对象修改
- 如果没有指定其它的字段,会把其它的字段设置为null
- 不建议使用
查询之后再修改
- 修改了某一个字段,不会把其它的字段设置为null
删除
void delete(Object obj)
直接创建对象删除(不支持级联删除)
查询之后再删除(支持级联删除)
保存或更新
void saveOrUpdate(Object obj)
没有设置id,是保存的操作
设置了id是修改的操作,如果设置的id没有,就会报错
查询所有
使用HQL的方式
HQL:Hibernate Query Language 面向对象的查询语言
Query query = session.createQuery("from Customer");
List
支持SQL语句的方式
SQLQuery query = session.createSQLQuery("sql语句");
List<Object[]> query.list();