# 命名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