Hibernate概述
什么是hibernate框架
1、 hibernate框架应用在JavaEE三层结构中的DAO层
2、 在DAO层里面做对数据库的crud操作,底层代码就是JDBC,hibernate对JDBC进行封装,最大好处就是不需要写复杂的JDBC代码以及SQL语句。
3、 开源轻量级框架
什么是ORM思想
1. hibernate使用orm思想对数据库进行crud操作
2. orm:object relationalmapping,对象关系映射
(1) 让实体类和数据库表进行一一对应:实体类与表,属性与字段
(2) 不需要直接操作数据库表,而操作表对应的实体类对象
hibernate入门
搭建环境
1、 导入jar包
2、 创建实体类
使用hibernate时,不需要自己手动创建表。
public class User {
/* hibernate要求实体类有一个属性唯一(类比于主键) */
private int uid;
private String username;
private String password;
private String address;
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
3、 配置一一对应(映射)
使用配置文件实现
(1) 创建XML格式的配置文件
建议在实体类所在的包里创建。实体类名.hbm.xml
(2) 配置文件是XML格式,需要引入XML约束
学过的约束:DTD SCHEMA,在hibernate里面引入的约束为DTD
(3) 配置映射关系
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 1.配置类和表对应
name:实体类全路径
table:数据库表的名称
-->
<class name="com.bpf.entity.User" table="t_user">
<!-- 2.配置实体类id和表id对应
hibernate要求实体类有一个属性唯一值
-->
<!--id标签
name:实体类里id的属性名称
column:生成的表字段名称
-->
<id name="uid" column="uid">
<!-- 设置数据库id增长策略
native:生成表的id值就是主键自动增长
-->
<generator class="native"></generator>
</id>
<!-- 3.其他属性和表字段对应 -->
<property name="username" column="username"></property>
<property name="password" column="password"></property>
<property name="address" column="address"></property>
</class>
</hibernate-mapping>
4、 创建hibernate核心配置文件
(1) 核心配置文件格式为XML,位置名称固定
位置:src下
名称:hibernate.cfg.xml
(2) 引入约束
(3) hibernate操作过程中,只会加载核心配置文件
第一部分:配置数据库信息
第二部分:配置hibernate信息
第三部分:把映射文件放入核心配置文件中
<?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.配置数据库信息 -->
<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">bestbpf7748</property>
<!-- 2.配置hibernate信息 (可选)-->
<!-- 输出底层sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 输出底层sql语句格式化 -->
<property name="hibernate.format_sql">true</property>
<!-- hibernate帮助创建表,需要配置 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!--配置数据库方言 (某数据库特有的语句)-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 3.把映射文件放到核心配置文件中 -->
<mapping resource="com/bpf/entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
测试(实现添加操作)
一、加载hibernate核心配置文件
二、创建SessionFactory对象
三、使用SessionFactory创建session对象
四、开启事务(建议手动)
五、写具体逻辑crud
六、提交事务
七、关闭资源
效果:(1)是否生成表 (2)是否成功插入记录
public class HibernateDemo {
@Test
public void testAdd() {
// 一、 加载hibernate核心配置文件
// 在hibernate中封装了对象
Configuration cfg = new Configuration();
cfg.configure();
// 二、 创建SessionFactory对象
// 读取核心配置文件内容
SessionFactory sessionFactory = cfg.buildSessionFactory();
// 三、 使用SessionFactory创建session对象
// 类似于连接
Session session = sessionFactory.openSession();
// 四、 开启事务(建议手动)
Transaction transaction = session.beginTransaction();
// 五、 写具体逻辑crud
// 添加
User user = new User();
user.setUsername("bpf");
user.setPassword("233");
user.setAddress("shanxi");
// 调用session方法添加
session.save(user);
// 六、 提交事务
transaction.commit();
// 七、 关闭资源
session.close();
sessionFactory.close();
}
}
Hibernate配置文件详解
映射配置文件
1、 映射配置文件名称和位置没有固定要求(但大多数遵循一个通常规范)
2、 映射配置文件中,标签name属性值写实体类相关内容
(1) class标签name属性值为实体类全路径
(2) id标签和property标签name属性是实体类中的属性名称
3、 id标签和property标签。Column属性可以省略,若省略会和实体类中的属性名一样
4、 property标签中还有一个属性type,设置字段的类型
核心配置文件
1、 主要配置内容位于
<hibernate-configuration>
<session-factory>
主要配置内容
</session-factory>
</hibernate-configuration>
2、 配置三部分内容
(1) 数据库信息
(2) Hibernate信息(可选)
(3) 映射文件
3、 名称位置固定
(1) 位置:src下
(2) 名称:hibernate.cfg.xml
Hibernate核心API
Configuration
(1) 在src下面找到名称hibernate.cfg.xml配置文件,创建对象,把配置文件放到对象里面
(加载核心配置文件)
SessionFactory(重点)
1、 使用Configuration对象创建SessionFactory对象
根据核心配置文件的配置到数据库中根据映射关系创建表
<!-- hibernate帮助创建表,需要配置 -->
<!--没有创建,有则更新 -->
<property name="hibernate.hbm2ddl.auto">update</property>
2、 创建SessionFactory过程中,特别消耗资源
在hibernate操作中,建议一个项目只创建一个SessionFactory对象
3、 具体实现
写一个工具类,写静态代码块实现
public class HibernateUtils {
private static final Configuration cfg;
private static final SessionFactory sessionFactory;
// 静态代码块
static {
cfg = new Configuration();
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
// 获得SessionFactory对象的方法
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}
Session(重点)
1、 调用session里面的不同方法实现crud操作
(1) 添加save
(2) 修改update
(3) 删除delete
(4) 根据ID查询get
2、 session对象是单线程对象
session对象不能共用,只能用自己的
Transaction
1、 事务对象
由Session对象的beginTransaction()方法开启
2、 事务提交和回滚
提交:commit()方法
回滚:rollback()方法
3、 事务概念
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务 (Transaction)是访问并 可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或 Java)书写的用户程序的执行所引起,并用形如 begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
4、 事务四个特性
a、原子性:原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚
b、一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
(可以简单理解为总量不变)
c、隔离性:隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之 间要相互隔离。
d、持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的 操作。
引入约束问题
没有正确引入约束会导致编写配置文件时不会提示相关标签属性
1、 在线引入约束(需要上网)
2、 把约束文件引入到eclipse中(Myeclipse中自带,但是可能版本不是最新)