美文网首页程序员
Hibernate学习(一)

Hibernate学习(一)

作者: 许渺 | 来源:发表于2017-11-28 16:18 被阅读97次

1. Hibernate简单介绍

Hibernate是一个持久层的ORM(Object Relational Mapping)框架,通过编写XML映射文件使得Java对象与数据库表产生关联,并且Hibernate几乎支持所有的关系型数据库(RDBMS),如MySQL、Oracle等等。

image

2. 配置Hibernate运行环境

2.1 下载地址:http://hibernate.org/orm/releases/5.2/
2.2 引入所需的jar包
  • 数据库驱动jar包(这里我用的是MySQL)
  • Hibernate的jar包(在解压文件夹的lib->required
  • 日志控制jar包用户输出日志(log4j,slf4j

3. 创建表结构

create table t_user(
    uid bigint(32) not null auto_increment,
    uname varchar(32),
    phone varchar(32),
    primary key (uid)
);

4. 创建Java对象

public class User
{
    private Long uid;
    private String uname;
    private String phone;
    ...
}

5. 创建类与表的映射文件(User.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.example.hibernate.User" table="t_user">
        <id name="uid" column="uid">
            <generator class="native"/>
        </id>
        <property name="uname" column="uname" length="20" type="java.lang.String"/>
        <property name="phone" column="phone" length="11" type="java.lang.String"/>
    </class>

</hibernate-mapping>

类与表的映射文件标签介绍

  • <class> 将类和表建立映射关系

    • name 类的全路径
    • table 表名(如果类名和表名一致,可以省略不写)
    • catalog 数据库名称(可以省略不写)
  • <id> 将类中的属性与表中主键进行映射

    • name 类中的属性
    • column 表中字段(如果和name一致,可以省略不写)
    • length 指定字段数据的长度(如果没有创建表,最好要指定数据长度)
  • <generator> 主键的生成策略

策略 描述
increment 适用于short、int、long作为主键,不是使用的数据库的自动增长机制,Hibernate提供的一种增长机制(先查询到id的最大值+1在作为新的主键插入,但是不能再集群环境或者并发访问的情况下使用)。
identity 适用于short、int、long作为主键,但是使用的数据库底层必须有自动增长的机制(如MySQLauto_increment),而Oracle是没有的。
sequence 适用于short、int、long作为主键,底层使用的是序列的增长方式,Oracle需要自己创建序列。
uuid 适用于char、varchar类型作为主键(使用的是随机的字符串作为主键)
native 适用于short、int、long作为主键,用来自动生成主键值;将属性值设置为native使得Hibernate可以使用identitysequence等算法根据底层数据库的情况来创建主键(如MySQL使用的idenitiy,Oracle使用的是sequence)
assigned 主键的生成不用Hibernate来进行管理,必须手动设置主键
  • <property> 将类中普通的属性与表中字段进行映射
    • name 类中的属性
    • column 表中字段
    • length 数据长度
    • type 数据类型(需要按照规则来定义)
      • Hibernate数据类型:type="string"
      • Java数据类型:type="java.lang.String"
      • 数据库的数据类型:添加子标签<column name="" sql-type="varchar">

6. 创建Hibernate核心配置文件(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>
        <!--连接数据库URL,后面拼接的上防止读写时中文乱码-->
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hbmdb?useUnicode=true&amp;characterEncoding=utf-8</property>
        <!--数据库用户名-->
        <property name="hibernate.connection.username">root</property>
        <!--数据库密码-->
        <property name="hibernate.connection.password">123456</property>
        <!--数据库方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--可选配置-->
        <!--控制台打印sql日志-->
        <property name="hibernate.show_sql">true</property>
        <!--打印的日志的时候格式化-->
        <property name="hibernate.format_sql">true</property>
        <!--通过映射文件自动创建数据库表-->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!--配置session ,可以通过ThreadLocal存储-->
        <property name="hibernate.current_session_context_class">thread</property>

        <!--引入类的映射文件-->
        <mapping resource="com/example/hibernate/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  • hbm2ddl.auto通过映射文件自动创建数据库表
  • create:每次都会创建一个新的表
  • create-drop:每次都会创建一个新的表,当执行结束后删除
  • update:如果表不存在会创建
  • validate:如果表存在,使用原来的表;同时校验映射文件与表中的字段是否一致,如果不一致则会报错

7. 编写代码测试保存数据

public class JunitTest
{
    @Test
    public void save()
    {
        //加载配置文件,默认加载src目录下的hibernate.cfg.xml,也可以自己指定路径
        Configuration config = new Configuration().configure();
        //创建SessionFactory对象
        SessionFactory factory = config.buildSessionFactory();
        //创建session对象
        Session session = factory.openSession();
        //开启事务
        Transaction transaction = session.beginTransaction();

        try
        {
            //保存数据
            User user = new User();
            user.setUname("许渺");
            user.setPhone("12345678906");
            session.save(user);
            //提交事务
            transaction.commit();
        } catch (Exception e)
        {
            e.printStackTrace();
            //出现异常事务回滚
            transaction.rollback();
        } finally
        {
            //释放资源
            session.close();
            factory.close();
        }
    }
}

执行单元测试

image

查看表中数据

image

8. Hibernate常用类描述

Configurationd对象

Configuration对象用于配置并启动Hibernate框架,获取SessionFactory对象。

SessionFactory对象

是生成Session对象的工厂类,SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用。
SessionFactory 是一个重量级对象所以通常它都是在应用程序启动时创造然后留存为以后使用。每个数据库需要一个 SessionFactory 对象使用一个单独的配置文件。所以如果你使用多种数据库那么你要创造多种 SessionFactory 对象。

Session对象
  • Session是在Hibernate中使用最频繁的接口。也被称之为持久化管理器。它提供了和持久化有关的操作,比如添加、修改、删除、加载和查询实体对象
  • Session 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心
  • Session是线程不安全的
  • 所有持久化对象必须在 session 的管理下才可以进行持久化操作
  • Session 对象有一个一级缓存,显式调用 flush 方法之前,所有的持久化操作的数据都缓存在 session 对象中
  • 持久化类与 Session 关联起来后就具有了持久化的能力
Transaction接口

Transaction是处理事务的接口,如提交事务 commit 以及事务回滚 rollback ,Hibernate框架默认事务不自动提交,需要手动提交事务;如果没有开启事务,那么每个Session的操作,都相当于一个独立的事务。

image

相关文章

网友评论

    本文标题:Hibernate学习(一)

    本文链接:https://www.haomeiwen.com/subject/xprebxtx.html