Mybatis中的动态SQL
Mybatis的动态SQL包括以下几种元素
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支判断 |
choose(when,otherwise) | 相当于java中的switch…case语句 | 多条件分支判断 |
trim(where,set) | 辅助元素,用于特定的SQL拼装问题,比如去掉多余的and,or等 | 用于SQL拼装的问题 |
foreach | 循环语句 | 在SQL语句中的in语句等列举条件常用 |
bind | 通过OGNL表达式自定义一个上下文变量 | 常用于模糊查询中 |
if元素
if元素是最常用的判断语句,相当于java中的if语句,常常与test属性联合使用。
使用if构建动态SQL
<select id = "selStu" parameterType = "String" resultType = "stu">
SELECT stuId,stuName,stuNote
FROM t_stu
WHERE 1 = 1
<if test="stuName != null and stuName != ''">
AND stuName like CONCAT('%',#{stuName},'%')
</select>
当参数stuName传递进映射器时,如果参数不为空,则对stuName进行模糊查询。
choose,when,otherwise元素
choose元素类似于java中的switch…case…default…语句,进行多条件分支判断。
- 假设有这样一个场景:
- 如果学生学号不为空,则只用学号查询。
- 如果学生学号为空,而学生备注不为空。则按备注查询。
- 如果学生学号,备注都为空,则学生姓名不能为空。
使用choose,when,otherwise
<select id = "selStu" parameterType = "stu" resultType = "stu">
SELECT stuId,stuName,stuNote
FROM t_stu
WHERE 1 = 1
<choose>
<when test = "stuId != null and stuId != ''">
AND stuId = #{stuId}
</when>
<when test ="stuNote != null and stuNote != ''">
AND stuNote = #{stuNote}
</when>
<otherwise>
AND stuName IS NOT NULL
</otherwise>
</choose>
</select>
trim,where,set元素
where元素
你会发现前面的两条动态SQL语句中都加有 1 = 1 条件,如果没有加入这个条件,那可能会变成一条错误的语句:
SELECT stuId,stuName,stuNote
FROM t_stu
WHERE
AND stuName like CONCAT('%',#{stuName},'%')
显然是错误的。但是我们可以用where元素去掉1 = 1这个条件,也一样能到达预期的效果。
使用where元素
<select id = "selStu" parameterType = "String" resultType = "stu">
SELECT stuId,stuName,stuNote
FROM t_stu
<where>
<if test="stuName != null and stuName != ''">
AND stuName like CONCAT('%',#{stuName},'%')
<if test="stuNote != null and stuNote != ''">
AND stuNote like CONCAT('%',#{stuNote },'%')
</where>
</select>
当where元素里的条件成立时,才会加入where这个SQL关键字到组装的SQL里面,否则就不加人。
trim元素
有时候需要去掉一些特殊的SQL语法,例如and,or。Mybatis可以使用trim元素到达预期的效果。
trim元素里中的四个参数:
参数 | 作用 |
---|---|
prefix | 前缀 |
prefixOverrides | 去掉第一个关键字(and或or) |
suffix | 后缀 |
suffixOverrides | 去掉最后一个关键字或符号(,) |
使用trim元素
<select id = "selStu" parameterType = "String" resultType = "stu">
SELECT stuId,stuName,stuNote
FROM t_stu
<trim prefix = "where" prefixOverrides = "and">
<if test="stuName != null and stuName != ''">
AND stuName like CONCAT('%',#{stuName},'%')
</trim>
</select>
set元素
set元素常常用于数据的更新语句。
使用set元素
<update id = "updStu" parameterType = "stu">
UODATE t_stu
<set>
<if test="stuName != null and stuName != ''">
stuName = #{stuName },
</if>
<if test="stuNote != null and stuNote != ''">
stuNote = #{stuNote }
</if>
</set>
WHERE stuId = #{stuId}
</update>
foreach元素
foreach使用循环语句,它的作用是遍历集合,能够很好地支持数组和List,Set接口的集合,往往用于SQL的in关键字中。
使用foreach元素
<select id = "selStuById" resultMap = "stuMap">
SELECT stuId,stuName,stuNote
FROM t_stu
WHERE stuId IN
<foreach item = "stuId" index = "index" collection = "stuIdList"
open = "(" separaotr = "," close = ")">
#{stuId}
</foreach>
</select>
参数 | 作用 |
---|---|
collection | 配置的stuIDList是传递进来的参数名称,它可以是一个数组,List,Set等集合 |
item | 循环当前的元素 |
index | 当前元素在集合的位置下标 |
open和close | 是以什么符号将这些集合元素包装起来 |
separaotr | 各个元素的间隔符 |
bind元素
bind元素的作用是通过OGNL表达式自定义一个上下文变量,这样更方便使用,在模糊查询中很常见。
使用bind元素
<select id = "selStu" resultMap = "stuMap">
<bind name = "stuName" value = "'%'+'_Name'+'%'"/>
<bind name = "stuNote" value = "'%'+'_Note'+'%'"/>
SELECT stuId,stuName,stuNote
FROM t_stu
WHERE stuName LIKE#{stuName}
AND stuNote LIKE #{stuNote}
</select>
这里面的_Name和_Note是传递进来的参数,它和通配符(%)连接后分别赋值给stuName和stuNote,然后可以在select语句中使用这个变量进行模糊查询了。