if和多数据库支持
if
<select id="selectUserByAgeAndScore" parameterType="com.imooc.mybatis.model.User"
resultMap="userMap">
SELECT * FROM imooc_user
WHERE age = #{age}
<if test="score != null">
AND score = #{score}
</if></select>
多数据库支持
MyBatis 可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于配置文件中的 databaseId。
5.1 配置
首先在 MyBatis 的全局配置文件中添加如下配置:
<?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><databaseIdProvider type="DB_VENDOR" /></configuration>
在 configuration 中加入 databaseIdProvider 后,还需要在 databaseIdProvider 标签中添加上需要使用到的数据库名称,如:SQL Server。每一个 property 属性都代表了一个数据库,name 表示数据库厂商名称,value 用来设置别名。
<?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>
<databaseIdProvider type="DB_VENDOR">
<property name="SQL Server" value="sqlserver"/>
<property name="MySQL" value="mysql"/>
<property name="PostgreSQL" value="postgre"/>
</databaseIdProvider>
</configuration>
5.2 使用
配置完毕后,我们就可以在 mapper xml 文件中,通过 if 来判断当前的数据库厂商,从而动态生成不同数据库的 SQL。
例如,PostgreSQL 支持使用 ||
来拼接字符串,而 MySQL 需要使用 concat
函数来拼接字符串。
因此,如果在模糊查询的时候,不同的数据库厂商需要不同的 SQL 语句,通过 if 来判断数据库厂商来生成对于的 SQL 语句。
<select id="selectUserByLikeName" resultType="com.imooc.mybatis.model.User">
SELECT * FROM imooc_user
WHERE username LIKE
<if test="_databaseId == 'mysql'">
CONCAT('%',#{username},'%')
</if>
<if test="_databaseId == 'postgre'">
'%' || #{username} || '%'
</if>
</select>
注意,这里 _databaseId
参数是由 MyBatis 提供的内置参数,对应于 databaseIdProvider 中配置的数据库名称。
通过 databaseIdProvider
配置,即时数据库厂商之间存在差异,但仍然可以通过动态 SQL 的形式来支持多数据库。