1、ORM数据库框架
ORM框架即(Object-Relational Mapping):对象关系映射
把JavaBean和数据库表中数据进行转换。
2、Hibernate介绍
1、ORM数据库框架
2、对关系数据库进行CRUD操作
3、轻量
4、自动生成sql语句
3、Hibernate的流程
package com.example.hiberante;
import javax.persistence.Temporal;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;
import com.example.bean.User;
public class TestDemo {
@Test
public void test1() {
User user = new User();
user.setUid(1);
user.setName("yu1");
user.setAge(20);
// 1、加载配置文件
Configuration configuration = new Configuration().configure();
// 2、获取SessionFactory,相当于获取链接池
SessionFactory factory = configuration.buildSessionFactory();
// 3、获取Session,连接JDBC,每执行一次openSession() 将获得一个新的session
Session session = factory.openSession();
// 4、事务
Transaction transaction = session.beginTransaction();
// 5、进行CRUD操作
session.save(user);
// 6、提交或者回滚
transaction.commit();
// 7、关闭session,factory
session.close();
factory.close();
}
}
1、核心配置文件
Configuration configuration = new Configuration().configure();
用于加载src下的hibernate.cfg.xml文件
名称必须是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://localhost:3306/student</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">123456</property>
<!--方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!--数据库表的设置,如果不存在就自动创建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 加载映射文件 -->
<mapping resource="com/example/bean/User.hbm.xml" />
</session-factory>
</hibernate-configuration>
在配置文件中
<property name="hibernate.hbm2ddl.auto">update</property>
1、create : 每一次运行时,都将创建表,运行完成表没有删除。一般用于测试。
2、create-drop : 每一次运行时,都将创建表,运行完成表删除。
3、validate : 运行时校验hbm.xml 是否与 表匹配。如果不匹配,将抛异常。
4、update : 如果表不存在,将创建。如果表存在,将更新(只添加,不删除)字段。
2、映射文件
核心配置加载时,hibernate将执行addResource加载配置的映射文件
hbm.xml 后缀固定的,必须与javabean同包。
<?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.example.bean.User" table="t_user">
<!-- 主键的配置 -->
<id name="uid">
<!-- 固定值 -->
<generator class="native"></generator>
</id>
<!-- 其他属性配置 -->
<property name="name"></property>
<property name="age"></property>
</class>
</hibernate-mapping>
映射文件详解:
<!--
<hibernate-mapping> 根标签
* package 用于配置包。如果配置了包之后使用同包下面的类时,就可以只写类名,而不需要全限定名称。
# 没有配置 <class name="cn.itcast.d_hbm.User">
# 配置 <hibernate-mapping package="cn.itcast.d_hbm">
<class name="User">
<class> 用于配置 对象 和表 之间的关系的
* name : 用于确定对象。默认使用的类的全限定名称
* table : 数据库中的表名。一般建议:表都应该有前缀
* catalog : 用于确定数据库的名称,默认使用hibernate.cfg.xml 配置url设置的数据库名称。例如:h_day01
<id>子标签 , 用于配置主键
* name : 对象的字段名称
* <generator> 用于配置主键生成策略
<property> 用于配置PO类的普通属性
* name : 默认情况使用的是属性名称 (通过getter或setter方法获得)
* column : 确定表中对应字段(列)名称。默认值name的值
* length : 确定字段的长度。如果 varchar 默认值255
* type : 确定字段类型
1 使用hibernate类型:type="string" 注意大小写
2 使用java类型:type="java.lang.String"
3 使用sql类型:例如:varchar
<property name="username">
<column name="xxx" sql-type="varchar(50)">
* not-null 是否为null
* unique 是否唯一
注意:如果配置文件存在sql关键字,建议使用重音符修饰字段的名称
<property name="desc" column="`desc`"></property>
-->
3、SessionFactory对象
1、SessionFactory相当于连接池,可以提供操作数据的Session对象。
2、SessionFactory 是线程安全,及不同的线程都可以使用。且可以保存,不同的线程获得session必须不同。
SessionFactory factory = config.buildSessionFactory();
4、Session对象
1、相当于 JDBC的 Connection
2、Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心
3、Session是线程不安全的
4、所有持久化对象必须在 session 的管理下才可以进行持久化操作
5、Session 对象有一个一级缓存,显式执行 flush 之前,所有的持久层操作的数据都缓存在 session 对象处
6、持久化类与 Session 关联起来后就具有了持久化的能力
常用方法:
1、save/persist:将指定PO保存到数据库,将执行一条insert语句
2、update:通过id更新所有数据,将执行一条update()语句
3、saveOrUpdate:如果没有id:执行save语句
如果有id:执行update语句
4、delete:通过id删除
5、get:通过id查询,立即执行sql语句
6、load:延迟查询,执行load后,不马上执行sql语句,当使用数据时,才执行真正的执行sql语句
7、createQuery:执行HQL语句
8、createSQLQuery:执行sql语句
9、merge:与saveOrUpdate非常相似
没有id值 :将执行insert语句
如果有id值,将执行select语句
如果数据没有变化,将不触发任何语句。
如果数据变化了,将触发update语句。
3、Transaction
1、开启事务:session.beginTransaction();
2、提交事务:transaction.commit();
3、回滚事务:transaction.rollback();
4、获得当前事务:session.getTransaction();
4、主键生成
1、 increment : hibernate 自己维护主键的增强。通过执行select max(id) from …查询最大值,加1.
2、identity :hibernate 将采用数据库底层的自动增强。例如:mysql auto_increment
3、sequence :hibernate 将采用数据库底层的序列。例如:oracle 不支持自动增强,但支持序列
4 、hilo:高低位算法,如果数据库不支持序列,也不支持自动增强,hibernate将采用算法机制。
5、uuid :使用随机字符串
6、assigned :自然主键(程序自己维护)
7、native :根据底层数据库的能力选择 identity、sequence 或者 hilo 中的一个。
<id name="uid">
<!-- 固定值 -->
<generator class="native"></generator>
</id>
5、Hibernate的三种状态
瞬时态:transient,session没有缓存,数据库没有数据。例如:new对象
OID没有值
持久态:persistent,session缓存,数据库中最终会有数据。例如:save(obj)
OID有值
脱管态:detached,session没有缓存,但数据库中有数据。例如:new User() , user.setUid(1)
OID有值