58 lines
3.1 KiB
Plaintext
58 lines
3.1 KiB
Plaintext
|
|
SQL语句的构建基于FreeMarker模板,即在语句中可以使用FreeMarker支持的所有标签,如<#if>、<#list>以及${expr}等
|
|||
|
|
|
|||
|
|
标签格式:
|
|||
|
|
<sql id="sqlId"><![CDATA[
|
|||
|
|
SQL EXPRESSION
|
|||
|
|
]]></sql>
|
|||
|
|
<sql id="sqlIdCount"><![CDATA[
|
|||
|
|
SQL EXPRESSION
|
|||
|
|
]]></sql>
|
|||
|
|
在分页查询时,sqlIdCount中的语句将作为查询所有记录数的语句
|
|||
|
|
例:
|
|||
|
|
<sql id="sqlId"><![CDATA[
|
|||
|
|
SELECT USR.ID, USR.NAME, GP.NAME, GP.CODE FROM USERS USR
|
|||
|
|
LEFT JOIN GROUP GP ON USR.ID = GP.USERID
|
|||
|
|
WHERE USR.FLAG = 0
|
|||
|
|
<@p p=" AND (%s)" s=" OR " f="USR.%S LIKE ?">name,loginname</@p>
|
|||
|
|
]]></sql>
|
|||
|
|
<sql id="sqlIdCount"><![CDATA[
|
|||
|
|
SELECT 1 FROM USER
|
|||
|
|
WHERE USR.FLAG = 0
|
|||
|
|
<@p p=" AND (%s)" s=" OR " f="USR.%S LIKE ?">name,loginname</@p>
|
|||
|
|
]]></sql>
|
|||
|
|
例中的sqlIdCount会在执行sqlId的过程中自动执行,这可在某些复杂语句中提高查询性能
|
|||
|
|
|
|||
|
|
自定义标签说明:
|
|||
|
|
标签:<@p [p="prefix %s"] [s="separator"] [f="format"]>field1,field2,...</p>
|
|||
|
|
作用:检测所传参数中是否包含所列字段field1,field2,...,对检测出的每个字段生成相应的表达式
|
|||
|
|
标签参数[p="prefix %s"]:默认为空,表示若所传参数中包含列出的字段,则对处理完成的语句进行格式化,其中%s表示处理完成的语句
|
|||
|
|
标签参数[s="separator"]:默认为",",表示各表达式之间的分隔符
|
|||
|
|
标签参数[f="format"]:默认为"%S = ?",表达式的格式化字符串,其中%s或%S(大写)表示当前字段的名称,若字符串中包含?,则会将对应参数值添加到语句参数列表
|
|||
|
|
|
|||
|
|
特殊用法1:若所传参数为Collection<Object[]),则表示批量更新操作,如:
|
|||
|
|
对于语句:UPDATE TABLE1 SET <@p>name,age</p> WHERE <@p>id</p>,传入以下参数:
|
|||
|
|
List<Object[]> param = new ArrayList<Object[]>();
|
|||
|
|
param.add(new Object[]{"Jack", 27, 1});
|
|||
|
|
param.add(new Object[]{"Rose", 25, 2});
|
|||
|
|
data.put("name", param);
|
|||
|
|
data.put("age", param);
|
|||
|
|
data.put("id", param);
|
|||
|
|
则执行的语句为:
|
|||
|
|
UPDATE TABLE1 SET NAME = ?, AGE = ? WHERE ID = ?
|
|||
|
|
执行结果为更新两条数据
|
|||
|
|
|
|||
|
|
特殊用法2:若所传参数为Object[],则针对每个数组值生成一次表达式,如:
|
|||
|
|
对于语句:DELETE FROM TABLE1 WHERE ID IN(<@p f="?">id</@p>),传入以下参数:
|
|||
|
|
Object[] param = new Object[]{1, 2, 3};
|
|||
|
|
data.put("id", param);
|
|||
|
|
则执行的语句为:
|
|||
|
|
DELETE FROM TABLE1 WHERE ID IN(?, ?, ?)
|
|||
|
|
执行结果为删除id为1,2,3的数据
|
|||
|
|
|
|||
|
|
示例1:<@p>id</@p>
|
|||
|
|
1.所传参数(HashMap):{},结果:"",语句参数列表:[]
|
|||
|
|
2.所传参数(HashMap):{id=>37},结果:"ID = ?",语句参数列表:[37]
|
|||
|
|
|
|||
|
|
示例2:<@p p="AND (%s)" s=" OR" f="UPPER(%S) LIKE ?">title,content</@p>
|
|||
|
|
1.所传参数(HashMap):{title=>"标题"},结果:"AND UPPER(TITLE) LIKE ?",语句参数列表:["标题"]
|
|||
|
|
2.所传参数(HashMap):{title=>"标题",content=>"内容"},结果:"AND (UPPER(TITLE) LIKE ? OR UPPER(CONTENT) LIKE ?)",语句参数列表:["标题","内容"]
|