使用 MyBatis 连接 TiDB
TiDB 是兼容 MySQL 的数据库,MyBatis 是流行的开源 Java ORM 框架。
在本教程中,你可以学习如何使用 TiDB 和 MyBatis 完成以下任务:
- 搭建你的开发环境。
- 使用 MyBatis 连接到你的 TiDB 集群。
- 构建并运行你的应用程序。你还可以参考 基础 CRUD 操作的示例代码片段。
注意
本教程适用于 starter、essential 以及 TiDB 自建集群。
前置条件
完成本教程,你需要:
- Java Development Kit (JDK) 17 或更高版本。你可以根据业务和个人需求选择 OpenJDK 或 Oracle JDK。
- Maven 3.8 或更高版本。
- Git。
- 一个 TiDB 集群。
如果你还没有 TiDB 集群,可以按如下方式创建:
- (推荐)参考 创建 starter 集群 创建你自己的平凯数据库云服务集群。
- 参考 部署本地测试 TiDB 集群 或 部署生产环境 TiDB 集群 创建本地集群。
运行示例应用并连接 TiDB
本节演示如何运行示例应用代码并连接到 TiDB。
步骤 1:克隆示例应用仓库
在终端窗口中运行以下命令,克隆示例代码仓库:
git clone https://github.com/tidb-samples/tidb-java-mybatis-quickstart.git
cd tidb-java-mybatis-quickstart步骤 2:配置连接信息
根据你选择的 TiDB 部署方式,连接到你的 TiDB 集群。
-
进入 Clusters 页面,点击目标集群名称进入集群概览页。
-
点击右上角的 Connect,弹出连接对话框。
-
确保连接对话框中的配置与你的操作环境一致。
- Connection Type 设置为
Public - Branch 设置为
main - Connect With 设置为
General - Operating System 与你的环境一致
提示:
如果你的程序运行在 Windows Subsystem for Linux (WSL) 中,请切换到对应的 Linux 发行版。
- Connection Type 设置为
-
点击 Generate Password 生成随机密码。
提示:
如果你之前已经创建过密码,可以继续使用原密码,或点击 Reset Password 生成新密码。
-
运行以下命令,复制
env.sh.example并重命名为env.sh:cp env.sh.example env.sh -
将对应的连接字符串复制粘贴到
env.sh文件中。示例结果如下:export TIDB_HOST='{host}' # e.g. gateway01.ap-northeast-1.prod.aws.tidbcloud.com export TIDB_PORT='4000' export TIDB_USER='{user}' # e.g. xxxxxx.root export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='true'请务必将
{}占位符替换为连接对话框中获取的连接参数。starter 需要安全连接,因此你需要将
USE_SSL的值设置为true。 -
保存
env.sh文件。
-
运行以下命令,复制
env.sh.example并重命名为env.sh:cp env.sh.example env.sh -
将对应的连接字符串复制粘贴到
env.sh文件中。示例结果如下:export TIDB_HOST='{host}' export TIDB_PORT='4000' export TIDB_USER='root' export TIDB_PASSWORD='{password}' export TIDB_DB_NAME='test' export USE_SSL='false'请务必将
{}占位符替换为连接参数,并将USE_SSL设置为false。如果你在本地运行 TiDB,默认主机地址为127.0.0.1,密码为空。 -
保存
env.sh文件。
步骤 3:运行代码并检查结果
-
执行以下命令运行示例代码:
make -
检查 Expected-Output.txt 文件,确认输出是否一致。
示例代码片段
你可以参考以下示例代码片段,完成你自己的应用开发。
完整示例代码及运行方法请参考 tidb-samples/tidb-java-mybatis-quickstart 仓库。
连接 TiDB
编辑 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>
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="false"/>
<setting name="aggressiveLazyLoading" value="true"/>
<setting name="logImpl" value="LOG4J"/>
</settings>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="${tidb_jdbc_url}"/>
<property name="username" value="${tidb_user}"/>
<property name="password" value="${tidb_password}"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="${mapper_location}.xml"/>
</mappers>
</configuration>请务必将 ${tidb_jdbc_url}、${tidb_user} 和 ${tidb_password} 替换为你 TiDB 集群的实际值。同时,将 ${mapper_location} 替换为你的 mapper XML 配置文件路径。如果有多个 mapper XML 配置文件,需要为每个文件添加一个 <mapper/> 标签。然后,定义如下函数:
public SqlSessionFactory getSessionFactory() {
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}插入数据
在 mapper XML 中添加节点,并在 XML 配置文件的 mapper.namespace 属性配置的接口类中添加同名函数:
<?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="com.pingcap.model.PlayerMapper">
<insert id="insert" parameterType="com.pingcap.model.Player">
insert into player (id, coins, goods)
values (#{id,jdbcType=VARCHAR}, #{coins,jdbcType=INTEGER}, #{goods,jdbcType=INTEGER})
</insert>
</mapper>更多信息请参考 插入数据。
查询数据
在 mapper XML 中添加节点,并在 XML 配置文件的 mapper.namespace 属性配置的接口类中添加同名函数。特别地,如果你在 MyBatis 查询函数中使用 resultMap 作为返回类型,请确保 <resultMap/> 节点配置正确。
<?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="com.pingcap.model.PlayerMapper">
<resultMap id="BaseResultMap" type="com.pingcap.model.Player">
<constructor>
<idArg column="id" javaType="java.lang.String" jdbcType="VARCHAR" />
<arg column="coins" javaType="java.lang.Integer" jdbcType="INTEGER" />
<arg column="goods" javaType="java.lang.Integer" jdbcType="INTEGER" />
</constructor>
</resultMap>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select id, coins, goods
from player
where id = #{id,jdbcType=VARCHAR}
</select>
</mapper>更多信息请参考 查询数据。
更新数据
在 mapper XML 中添加节点,并在 XML 配置文件的 mapper.namespace 属性配置的接口类中添加同名函数:
<?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="com.pingcap.model.PlayerMapper">
<update id="updateByPrimaryKey" parameterType="com.pingcap.model.Player">
update player
set coins = #{coins,jdbcType=INTEGER},
goods = #{goods,jdbcType=INTEGER}
where id = #{id,jdbcType=VARCHAR}
</update>
</mapper>更多信息请参考 更新数据。
删除数据
在 mapper XML 中添加节点,并在 XML 配置文件的 mapper.namespace 属性配置的接口类中添加同名函数:
<?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="com.pingcap.model.PlayerMapper">
<delete id="deleteByPrimaryKey" parameterType="java.lang.String">
delete from player
where id = #{id,jdbcType=VARCHAR}
</delete>
</mapper>更多信息请参考 删除数据。
后续步骤
- 通过 MyBatis 官方文档 学习更多 MyBatis 的用法。
- 通过 开发者指南 各章节学习 TiDB 应用开发最佳实践,例如 插入数据、更新数据、删除数据、单表读取、事务 以及 SQL 性能优化。
- 通过专业的 TiDB 开发者课程 学习,并在通过考试后获得 TiDB 认证。
- 通过 Java 开发者课程学习:Working with TiDB from Java。