本文介紹了如何通過MyBatis使用Tablestore的JDBC驅動來快速存取Tablestore。

背景資訊

MyBatis是一個Java資料持久層架構,支援自訂SQL、預存程序以及進階映射。使用MyBatis能免除JDBC代碼以及設定參數和擷取結果集的工作。更多資訊,請參見MyBatis官網文檔

注意事項

目前支援使用SQL查詢功能的地區有華東1(杭州)、華東2(上海)、華北2(北京)、華北3(張家口)、華南1(深圳)和新加坡。

前提條件

  • 如果要使用RAM使用者進行操作,請確保已建立RAM使用者,並為RAM使用者授予所有SQL操作許可權,即在自訂權限原則中配置"Action": "ots:SQL*"。具體操作,請參見t1985835.html#section_6hb_cr0_iv9
  • 已擷取AccessKey(包括AccessKey ID和AccessKey Secret)。具體操作,請參見擷取AccessKey
  • 已建立資料表並為資料表建立映射關係。具體操作,請分別參見建立資料表建立表的映射關係

步驟一:安裝JDBC驅動

您可以通過以下兩種方式安裝JDBC驅動。

  • 下載Tablestore JDBC驅動並匯入到專案中。具體下載路徑請參見Tablestore JDBC驅動
  • 在Maven專案中加入依賴項
    在Maven工程中使用Tablestore JDBC驅動,只需在pom.xml中加入相應依賴即可。以5.13.5版本為例,在<dependencies>內加入如下內容:
    <dependency>
      <groupId>com.aliyun.openservices</groupId>
      <artifactId>tablestore-jdbc</artifactId>
      <version>5.13.5</version>
    </dependency>                

步驟二:安裝MyBatis

您可以通過以下兩種方式安裝MyBatis。
  • 下載MyBatis安裝包(即mybatis-x.x.x.jar)並匯入到專案中。具體下載路徑請參見MyBatis安裝包

    mybatis-x.x.x.jar中的x.x.x表示MyBatis的版本號碼,請根據實際下載所需版本的安裝包。

  • 在Maven專案中加入依賴項

    在Maven工程中使用MyBatis,只需在pom.xml中加入相應依賴即可。以3.6.3.Final版本為例,在<dependencies>內加入如下內容:

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.9</version>
    </dependency>

步驟三:映射SQL欄位

  1. 建立資料表欄位對應的Java Bean。在本樣本中trip_id為資料表中的唯一主鍵。
    注意 填寫時請確保Java Bean的成員變數名稱和資料表的欄位名相同。
    package mybatis;
    
    public class Trip {
    
        private long trip_id;
        private long duration;
        private String start_date;
        private String end_date;
        private long start_station_number;
        private long end_station_number;
        private String start_station;
        private String end_station;
        private String bike_number;
        private String member_type;
        // ...
    }
  2. 建立映射設定檔,並在映射設定檔中定義查詢條件。此處以在mybatis目錄下建立TripMapper.xml為例介紹。

    關於SQL功能支援情況,請參見SQL支援功能說明

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="mybatis.TripMapper">
        <select id="selectTrip" resultType="mybatis.Trip">
            select * from trips where trip_id = #{id}
        </select>
    </mapper>

步驟四:構建SqlSessionFactory

SqlSessionFactory用於建立MyBatis會話,通過MyBatis會話,可以實現用戶端與Tablestore之間的串連。

  1. 建立MyBatis設定檔mybatis-config.xml後添加如下內容。並根據實際修改對應配置項。
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
            PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <!-- 設定資料來源類型。由於Tablestore JDBC驅動需要主動關閉後才能讓進程退出,請根據實際使用選擇合適的資料來源類型。-->
                <!-- 如果程式常駐執行,則您可以使用POOLED維護一個串連池;如果希望程式完成資料查詢後退出,則只能使用UNPOOLED。-->    
                <dataSource type="UNPOOLED">
                    <property name="driver" value="com.alicloud.openservices.tablestore.jdbc.OTSDriver"/>
                    <property name="url" value="jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance"/>
                    <property name="username" value="***********************"/>
                    <property name="password" value="********************************"/>
                </dataSource>
            </environment>
        </environments>
        <mappers>
            <!-- 設定為映射設定檔的路徑。-->
            <mapper resource="mybatis/TripMapper.xml"/>
        </mappers>
    </configuration>
    配置項說明請參見下表。
    配置項 類型 是否必選 樣本 描述
    driver class com.alicloud.openservices.tablestore.jdbc.OTSDriver Tablestore JDBC驅動的類名,設定為com.alicloud.openservices.tablestore.jdbc.OTSDriver。
    url string jdbc:ots:https://myinstance.cn-hangzhou.ots.aliyuncs.com/myinstance 執行個體訪問地址。格式為jdbc:ots:endpoint/instanceName,其中endpoint為執行個體的服務地址。更多資訊,請參見服務地址。instanceName為執行個體名稱,請根據實際修改。

    填寫時必須加上首碼jdbc:ots:

    username string ************************ 阿里雲帳號或者RAM使用者的AccessKey ID。
    password string ******************************** 阿里雲帳號或者RAM使用者的AccessKey Secret。
  2. 通過載入MyBatis設定檔來構建SqlSessionFactory。
    String resource = "mybatis/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

步驟五:建立SqlSession查詢資料

SqlSession session = sqlSessionFactory.openSession(true);

Trip trip = (Trip) session.selectOne("mybatis.TripMapper.selectTrip", 99L);
System.out.println("trip id: " + trip.getTrip_id());
System.out.println("start date: " + trip.getStart_date());
System.out.println("end date: " + trip.getEnd_date());
System.out.println("duration: " + trip.getDuration());
session.close();

完整樣本

查詢表中主鍵列值為99的行資料,並擷取指定列的值。

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import mybatis.Trip;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisDemo {
    public static void main(String[] args) throws IOException {
        // 設定MyBatis設定檔的
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 由於Tablestore目前暫不支援事務,因此是否自動認可配置必須設定為true。
        SqlSession session = sqlSessionFactory.openSession(true);
        // 填寫要執行的SELECT語句對應的標識並設定主索引值為99。
        // SELECT語句對應的標識格式為“映射設定檔路徑.SELECT語句id”,樣本中mybatis.TripMapper.selectTrip表示執行mybatis節點下TripMapper.xml檔案內id為selectTrip的SELECT語句。
        Trip trip = (Trip) session.selectOne("mybatis.TripMapper.selectTrip", 99L);
        // 列印需要擷取的列值。
        System.out.println("trip id: " + trip.getTrip_id());
        System.out.println("start date: " + trip.getStart_date());
        System.out.println("end date: " + trip.getEnd_date());
        System.out.println("duration: " + trip.getDuration());
        session.close();
    }
}