本文介紹 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);
}成功建立串連:

自動建表
將設定檔本行注釋開啟:

將資料庫中 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 資料庫中的結果:


從結果上看 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();
}執行語句及資料庫結果顯示如下:


在原有表的基礎上,架構根據實體類及 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();
}執行結果如下:

從結果上來看,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 模式:

HQL 模式:

從結果上來看,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);
}執行結果如下:

從結果上來看,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();
}執行結果如下:

從結果上來看,OceanBase 對於 hibernate 的 delete 功能支援良好。