MyBatis 如何为不同的数据库后端生成不同的 sql
MyBatis how can I generate different sql for different database backend
我正在使用 mybatis-spring 1.2.3 和 Spring4 一起创建一个 Web 应用程序。生产环境主要数据存储是MySQL,但是我在单元测试中也使用了内存数据库H2。
MyBatis 在测试和生产中与 MySQL 和 H2 都工作得很好,但我遇到了一个问题,有一天我需要在查询 MySQL 中使用 force index(idx1)
,这将导致单元测试出现语法错误,因为 H2 不支持 force index
。结果,单元测试完全崩溃了。
我想知道MyBatis有什么办法可以处理这样的情况吗? (测试和生产的数据库类型不同,它们对 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="myproject.mapper.UserMapper">
<select id="getGameUsersForDate" resultType="myproject.dao.domain.GameUser">
select
*
from game_user
force index(idx1)
where
game_id in
<choose>
<when test="gameIds.size() > 0">
<foreach item="gameId" collection="gameIds" open="(" separator="," close=")">
#{gameId}
</foreach>
</when>
<otherwise>
(null)
</otherwise>
</choose>
and uid in
<choose>
<when test="uids.size() > 0">
<foreach item="uid" collection="mids" open="(" separator="," close=")">
#{mid}
</foreach>
</when>
<otherwise>
(null)
</otherwise>
</choose>
and `date` = #{date}
</select>
</mapper>
我正在使用 mybatis-spring 1.2.3 和 Spring4 一起创建一个 Web 应用程序。生产环境主要数据存储是MySQL,但是我在单元测试中也使用了内存数据库H2。
MyBatis 在测试和生产中与 MySQL 和 H2 都工作得很好,但我遇到了一个问题,有一天我需要在查询 MySQL 中使用 force index(idx1)
,这将导致单元测试出现语法错误,因为 H2 不支持 force index
。结果,单元测试完全崩溃了。
我想知道MyBatis有什么办法可以处理这样的情况吗? (测试和生产的数据库类型不同,它们对 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="myproject.mapper.UserMapper">
<select id="getGameUsersForDate" resultType="myproject.dao.domain.GameUser">
select
*
from game_user
force index(idx1)
where
game_id in
<choose>
<when test="gameIds.size() > 0">
<foreach item="gameId" collection="gameIds" open="(" separator="," close=")">
#{gameId}
</foreach>
</when>
<otherwise>
(null)
</otherwise>
</choose>
and uid in
<choose>
<when test="uids.size() > 0">
<foreach item="uid" collection="mids" open="(" separator="," close=")">
#{mid}
</foreach>
</when>
<otherwise>
(null)
</otherwise>
</choose>
and `date` = #{date}
</select>
</mapper>