Hibernate1(入门)

来源:互联网 发布:无法触碰影评 知乎 编辑:程序博客网 时间:2024/06/14 00:03

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有值

1 0
原创粉丝点击