# 命名SQL支持多数据库

命名SQL

命名SQL就是给每个sql语句定义一个唯一表示(id),配置sql语句执行所需要参数以及如何处理sql语句执行后的结果。

通过命名SQL可以达到集中管理sql语句的作用,因为所有sql语句都是定义在文件中而不是散落在代码里。在调用时,只需传入唯一标识(id)和参数即可。

# 命名SQL多数据库支持有两种方式

# 1.根据命名SQL的id进行匹配

匹配策略:id + 任意字符 + 数据库类型 + 分隔字符 + 数据库版本, 不区分大小写,分割字符可以是点(.)或者中杠(-)或者下划线(_),优先精准匹配模式。

示例如下:

命名sql定义:
<select id="selectSchool" resultClass="commonj.sdo.DataObject">
	<![CDATA[SELECT * from school order by school_id]]>
</select>
<select id="selectSchool.mysql" resultClass="commonj.sdo.DataObject">
	<![CDATA[SELECT * from school order by school_id]]>
</select>
<select id="selectSchool.mysql_5.7" resultClass="commonj.sdo.DataObject">
	<![CDATA[SELECT * from school order by school_id]]>
</select>

Java调用:
INamedSqlSession namedSqlSession = NamedSqlSessionFactory.createSQLMapSession(connection);
List schools = session.queryForList("selectSchool", null);

匹配说明:
如果数据库信息是:Mysql 5.7.31,则会匹配selectSchool.mysql_5.7对应的sql;
如果数据库信息是:Mysql 5.6,则会匹配selectSchool.mysql对应的sql;
如果数据库信息是:Oracle 11g,则会匹配selectSchool对应的sql。

# 2.动态sql中使用内置数据库信息变量进行判断

内置的数据库信息变量如下:

  • context.databaseType:数据库类型信息
  • context.databaseTypeLowerCase:数据库类型信息(小写)
  • context.databaseTypeUpperCase:数据库类型信息(大写)
  • context.databaseVersion:数据库版本信息
  • context.databaseVersionLowerCase:数据库版本信息(小写)
  • context.databaseVersionUpperCase:数据库版本信息(大写)

示例如下:

<select id="dynamicGetAccountList" resultMap="commonj.sdo.DataObject" >
  select * from ACCOUNT
  <isEqual prepend="and" property="context.databaseTypeLowerCase" compareValue="mysql">
       where ACC_ID = #id#
  </isEqual>
  order by ACC_LAST_NAME
</select>
或者
<select id="dynamicGetAccountList" resultMap="commonj.sdo.DataObject" >
  select * from ACCOUNT
  <isTrue prepend="and" expression="context.databaseTypeLowerCase == 'mysql'">
       where ACC_ID = #id#
  </isTrue>
  order by ACC_LAST_NAME
</select>
或者
<select id="dynamicGetAccountList" resultMap="commonj.sdo.DataObject" >
  select * from ACCOUNT
  <switch>
    <case expression="context.databaseTypeLowerCase == 'mysql'">
        where ACC_ID = '1'
    </case>
    <case expression="context.databaseTypeLowerCase == 'oracle'">
        where ACC_ID = '2'
    </case>
    <default>
        where ACC_ID = '3'
    </default>
  </switch>
  order by ACC_LAST_NAME
</select>
说明:expression支持groovy表达式,内置变量:context,parameterObject
上次更新: 2023/3/20下午3:44:43