通过MyBatis使用SQL查询

更新时间:
复制为 MD 格式

MyBatis 是一个 Java 数据持久层框架。通过 MyBatis 集成表格存储 JDBC 驱动,可以在 Java 项目中以 SQL 方式访问表格存储数据。更多信息,参见MyBatis 官网

前提条件

  • 已获取 AccessKey,RAM 用户需具备"Action": "ots:SQL*"权限。

  • 已创建数据表和映射表,详见DDL 操作

使用流程

完成以下步骤,将 MyBatis 与表格存储 JDBC 驱动集成。

重要

表格存储的 JDBC 驱动自带连接池功能,不建议使用外部数据库连接池工具,以避免兼容性问题。

步骤一:安装 JDBC 驱动

可以通过以下两种方式安装 JDBC 驱动。

添加Maven依赖

在 Maven 工程中使用表格存储 JDBC 驱动,在 pom.xml 中加入以下依赖。以 5.17.0 版本为例,在 <dependencies> 内加入如下内容:

<dependency>
  <groupId>com.aliyun.openservices</groupId>
  <artifactId>tablestore-jdbc</artifactId>
  <version>5.17.0</version>
</dependency>

手动安装

下载表格存储 JDBC 驱动并导入到项目中。具体下载路径参见表格存储 JDBC 驱动

步骤二:安装 MyBatis

可以通过以下两种方式安装 MyBatis。

添加Maven依赖

在 Maven 工程中使用 MyBatis,在 pom.xml 中加入以下依赖。以 3.5.9 版本为例,在 <dependencies> 内加入如下内容:

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

手动安装

下载 MyBatis 安装包并导入到项目中。具体下载路径参见MyBatis 安装包

步骤三:映射 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;
    
        // 以 trip_id 为例,其他字段类似。
        public void setTrip_Id(Long trip_id){
            this.trip_id = trip_id;
        }
        public Long getTrip_Id() {
            return trip_id;
        }
    }
  2. 创建映射配置文件,并在映射配置文件中定义查询条件。此处以在 mybatis 目录下创建 TripMapper.xml 为例。

    <?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 会话,通过会话连接表格存储。

  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"/>
                <!-- 表格存储 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

    表格存储 JDBC 驱动的类名,固定为 com.alicloud.openservices.tablestore.jdbc.OTSDriver

    url

    string

    实例访问地址。格式为jdbc:ots:endpoint/instanceName,其中 endpoint 为实例的服务地址,instanceName 为实例名称,根据实际情况修改。

    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 查询数据

表格存储不支持事务,openSession 的 autoCommit 参数必须设置为 true。

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 {
        String resource = "mybatis/mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 表格存储不支持事务,autoCommit 必须设置为 true。
        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();
    }
}