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 的形式来支持多数据库。

posted @ 2020-08-01 07:44  柒丶月  阅读(81)  评论(0编辑  收藏  举报