程序员

Hibernate学习(一)

2017-11-28  本文已影响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包

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>

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

策略 描述
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来进行管理,必须手动设置主键

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>

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对象
Transaction接口

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

image
上一篇 下一篇

猜你喜欢

热点阅读