“动态 SQL 怎么兼容版本”这个问题,常见场景有 数据库版本兼容、MyBatis 动态 SQL 兼容、应用/框架版本兼容 三类。下面按最常见情况给你说明。
<choose>/<when>/<otherwise> 做版本分支根据传入参数(如 dbType、version)选择不同 SQL。
<select id="query" parameterType="map" resultType="map">
SELECT *
FROM user
<where>
<choose>
<when test="dbType == 'mysql'">
AND create_time >= #{start}
</when>
<when test="dbType == 'oracle'">
AND create_time >= TO_DATE(#{start}, 'YYYY-MM-DD')
</when>
<otherwise>
AND 1=1
</otherwise>
</choose>
</where>
</select>
✅ 优点:清晰、可控
❌ 缺点:SQL 会变复杂
<if> + 参数版本号适合小版本差异。
<if test="version >= 2">
AND status = 1
</if>
<if test="version < 2">
AND is_active = 1
</if>
<sql> + <include>)不同版本引用不同片段。
<sql id="mysqlCondition">
AND create_time >= #{start}
</sql>
<sql id="oracleCondition">
AND create_time >= TO_DATE(#{start}, 'YYYY-MM-DD')
</sql>
❌ 不兼容写法:
SELECT * FROM t LIMIT 10 OFFSET 5
✅ 兼容写法(Oracle):
SELECT * FROM (
SELECT ROWNUM rn, t.* FROM t
) WHERE rn BETWEEN 6 AND 10
COALESCE 替代 NVL / IFNULLCURRENT_DATE 替代数据库特有函数SqlMapClientSqlSession@Bean
@ConditionalOnProperty(name = "sql.mode", havingValue = "v1")
public SqlService sqlServiceV1() {
return new SqlServiceV1();
}
✅ 动态 SQL 兼容版本的最佳方式:
如果你指的是 某个具体技术(如 MyBatis-Plus、JPA、MySQL 5/8、Oracle 11g/19c),可以直接告诉我,我给你针对性方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。