通过MyBatis使用SQL查询数据

MyBatis是一个Java数据持久层框架,支持自定义SQL、存储过程以及高级映射。您可以通过MyBatis使用表格存储的JDBC驱动来快速访问表格存储。

背景信息

MyBatis是一个Java数据持久层框架,支持自定义SQL、存储过程以及高级映射。使用MyBatis能免除JDBC代码以及设置参数和获取结果集的工作。更多信息,请参见MyBatis官网文档

注意事项

目前支持使用SQL查询功能的地域有华东1(杭州)、华东2(上海)、华北2(北京)、华北3(张家口)、华北5(呼和浩特)、华北6(乌兰察布)、华南1(深圳)、西南1(成都)、中国香港、新加坡、印度尼西亚(雅加达)、德国(法兰克福)和美国(弗吉尼亚)。

前提条件

  • 如果要使用RAM用户进行操作,请确保已创建RAM用户,并为RAM用户授予所有SQL操作权限,即在自定义权限策略中配置"Action": "ots:SQL*"。具体操作,请参见通过RAM PolicyRAM用户授权

  • 已获取AccessKey(包括AccessKey IDAccessKey Secret)。具体操作,请参见创建AccessKey

  • 已创建数据表并为数据表创建映射关系。具体操作,请分别参见创建数据表创建表的映射关系

使用流程

步骤一:安装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>

步骤二:安装MyBatis

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

  • 下载MyBatis安装包(即mybatis-x.x.x.jar)并导入到项目中。具体下载路径请参见MyBatis安装包

    mybatis-x.x.x.jar中的x.x.x表示MyBatis的版本号,请根据实际下载所需版本的安装包。

  • Maven项目中加入依赖项

    Maven工程中使用MyBatis,只需在pom.xml中加入相应依赖即可。以3.5.9版本为例,在<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;
    
        // 添加设置/返回字段值方法。
        // 此处以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为例介绍。

    关于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会话,可以实现客户端与表格存储之间的连接。

  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

    com.alicloud.openservices.tablestore.jdbc.OTSDriver

    表格存储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);
        // 由于表格存储目前暂不支持事务,因此是否自动提交配置必须设置为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();
    }
}

相关文档