全部產品
Search
文件中心

ApsaraDB for OceanBase:Hibernate 串連 OceanBase 資料庫

更新時間:Jul 01, 2024

本文介紹 Hibernate 串連樣本,並測試幾個常用功能。

配置依賴

<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>8.0.25</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.mysql.cj.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://xxx.xxx.xxx.xxx:3306/test</property>
        <property name="connection.username">a****</property>
        <property name="connection.password">******</property>

        <!-- 可選配置 -->
        <!--是否支援方言-->
        <!--在 MySQL 模式下,必須有如下配置-->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</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 資料庫中的結果:

3

4

從結果上看 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();
}

執行語句及資料庫結果顯示如下:

6

7

在原有表的基礎上,架構根據實體類及 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 功能支援良好。