Hibernate 连接 OceanBase 数据库

本文介绍 Hibernate 连接示例,并测试几个常用功能。

配置依赖

<dependency>
    <groupId>com.oceanbase</groupId>
    <artifactId>oceanbase-client</artifactId>
    <version>2.4.0</version>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.0.7.Final</version>
</dependency>

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>
        <!--oceanbase 连接信息-->
        <property name="connection.driver_class">com.oceanbase.jdbc.Driver</property>
        <property name="connection.url">jdbc:oceanbase://xxx.xxx.xxx.xxx:1521/</property>
        <property name="connection.username">a****</property>
        <property name="connection.password">******</property>

        <!-- 可选配置 -->
        <!--是否支持方言 -->
        <!--在 Oracle 模式下,必须有如下配置-->
        <property name="dialect">org.hibernate.dialect.Oracle12cDialect</property>
      
        <!--执行 CURD 时是否打印 sql 语句  -->
        <property name="show_sql">true</property>
        <!--自动建表(修改表)-->
        <!--<property name="hbm2ddl.auto">update</property>-->
        <!--<property name="hbm2ddl.auto">create</property>-->

        <!-- 资源注册 (实体类映射文件)-->
        <mapping resource="./UserModel.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

测试准备

实体类

public class User implements Serializable {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;
    //先注释一个字段,以便验证使用框架建表后,自动根据实体类新增属性修改表
    //private String tel;
    //。。。。。。构造器、get、set 方法此处省略。。。。。。。。
}

实体类映射表 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:全路径类名 -->
    <!-- table:表名 -->
    <class name="com.alibaba.ob.pojo.User" table="user">
        <!-- 主键的映射制作在 id 元素上 -->
        <!-- name:对象中用于作为主键的属性名 -->
        <!-- colomn:表中主键字段名 -->
        <!-- 如果 name 与 column 值相同,可以省略 column -->
        <id name="id" column="id">
            <!-- 将 generator 元素 class 属性设置为 "assigned" 手动生成,必须给 id -->
            <generator class="identity"  />

            <!--**要注意 Hibernate 主键生成策略**-->

        </id>
        <!-- 属性与字段的映射制作在 property 元素上 -->
        <!-- name:类中的属性名 -->
        <!-- column:表中的字段名 -->
        <!-- 如果 name 与 column 值相同,可以省略 column -->
        <property name="username" />
        <property name="birthday" />
        <property name="sex" />
        <property name="address"/>
       <!--此处同实体类-->
    <!--<property name="tel"/>-->
    </class>
</hibernate-mapping>

示例代码

连接

@Test
public void testConnection(){
    //加载配置信息
    Configuration conf = new Configuration().configure();
    //基于配置信息,创建 SessionFactory 对象
    SessionFactory sessionFactory = conf.buildSessionFactory();
    //打开一个与数据库相关的 session 对象
    Session session = sessionFactory.openSession();
    System.out.println(session);
}

成功建立连接:

1

自动建表

将配置文件本行注释打开:

2

将数据库中user表删除后,执行如下测试方法:

@Test
public void testCreateTableAndInsertData(){
    //创建要测试的对象
    User user = new User();
    user.setUsername("hibernateTest");
    user.setSex("女");
    user.setBirthday(new Date());
    user.setAddress("北京");

    //开启事务,基于 session 得到
    Transaction transaction = session.beginTransaction();
    //通过 session 保存数据
    session.save(user);
    //提交事务
    transaction.commit();
    //操作完毕,关闭 session 连接对象
    session.close();
}

查看控制台打印出来的所执行 sql 语句以及 oceanbase 数据库中的结果:

34

从结果上看 OceanBase 对于 hibernate 的 create table 功能支持良好。

修改表(增加字段

首先修改配置文件,如下:

<!--自动建表(修改表)-->
<property name="hbm2ddl.auto">update</property>
<!--<property name="hbm2ddl.auto">create</property>-->

将实体类和 xml 文件中关于 tel 属性的注释打开,执行如下方法:

@Test
public void testAlterTable(){
    //创建要测试的对象
    User user = new User();
    user.setUsername("hibernateTest");
    user.setSex("女");
    user.setBirthday(new Date());
    user.setAddress("北京");
    user.setTel("12345678911");

    //开启事务,基于 session 得到
    Transaction transaction = session.beginTransaction();
    //通过 session 保存数据

    session.save(user);
    //提交事务
    transaction.commit();
    //操作完毕,关闭 session 连接对象
    session.close();
}

执行语句及数据库结果显示如下:

67

在原有表的基础上,框架根据实体类及 xml 文件,自动对表进行了新增字段处理。

从结果上来看,OceanBase 对于 hibernate 的 alert table 功能支持良好。

持久化数据

测试方法:

@Test
public void testInsert() {
    User u1 = new User("asd", new Date(), "男", "漳州");
    User u2 = new User("qwe", new Date(), "女", "杭州");
    User u3 = new User("zxc", new Date(), "男", "上海");
    User u4 = new User("xcv", new Date(), "女", "杭州");
    User u5 = new User("sdf", new Date(), "男", "杭州");
    User u6 = new User("wer", new Date(), "女", "杭州");
    User u7 = new User("ert", new Date(), "男", "漳州");
    User u8 = new User("rty", new Date(), "女", "上海");
    User u9 = new User("tyu", new Date(), "男", "杭州");
    ArrayList<User> users = new ArrayList<>();
    users.add(u1);
    users.add(u2);
    users.add(u3);
    users.add(u4);
    users.add(u5);
    users.add(u6);
    users.add(u7);
    users.add(u8);
    users.add(u9);
    //开启事务,基于 session 得到
    Transaction transaction = session.beginTransaction();
    //通过 session 保存数据
    for (User user : users) {
        session.save(user);
    }
    //提交事务
    transaction.commit();
    //操作完毕,关闭 session 连接对象
    session.close();
}

执行结果如下:

8

从结果上来看,OceanBase 对于 hibernate 的 Insert 功能支持良好,且支持 Hibernate 自增主键生成策略。

HQL 模式和 SQL 模式查询

测试方法:

@Test
public void testQuery() {
    //SQL 模式
    //SQLQuery query = sessionFactory.openSession().createSQLQuery("select * from user where sex = '男'").addEntity(User.class);
    //HQL 模式
    //Query query = sessionFactory.openSession().createQuery("select User from User User where User.sex = '男'");
    List<User> list = query.list();
    list.forEach(System.out::println);
}

执行结果如下:

SQL 模式:

9

HQL 模式:

10

从结果上来看,OceanBase 对于 hibernate 的 query 功能支持良好。

修改操作

测试方法:

@Test
public void testChange(){
    User user = (User) session.createSQLQuery("select * from user where id = 1").addEntity(User.class).list().get(0);
    System.out.println("修改前:"+user);
    user.setAddress("杭州");
    session.update(user);
    user = (User) session.createSQLQuery("select * from user where id = 1").addEntity(User.class).list().get(0);
    System.out.println("修改后:"+user);
}

执行结果如下:

11

从结果上来看,OceanBase 对于 hibernate 的 updata 功能支持良好。

删除操作

测试方法:

@Test
public void testDelete(){
    Transaction transaction = session.beginTransaction();
    List<User> list = session.createSQLQuery("select * from user").addEntity(User.class).list();
    System.out.println(list);
    int i = session.createSQLQuery("delete from user where id = " + list.get(0).getId()).executeUpdate();
    list = session.createSQLQuery("select * from user").addEntity(User.class).list();
    System.out.println(list);
    //提交事务
    transaction.commit();
    //操作完毕,关闭 session 连接对象
    session.close();
}

执行结果如下:

12

从结果上来看,OceanBase 对于 hibernate 的 delete 功能支持良好。