Mybatis中动态SQL的用法

在访问数据库时,需要拼装SQL语句,在Mybatis中提供了对SQL的拼装,只有几个简单的元素:iftestchoose,when,otherwisewheresettrimforeachbind
用法都十分简单,总结以下基本的用法。

首先准备一实体类

1
2
3
4
5
6
7
8
9
10
11

public class User {

private int id;

private String name;

private int sex;

//省略掉构造方法和setter、getter方法
}

if、test元素

if 元素是最常用的判断语句,相当于java中的if语句。
test元素用于条件判断的语句中,它的作用相当于判断真假。 常常与if联合使用。

以按姓名查询的例子来说明if和test的用法

1
2
3
4
5
6
7
<select id="getUser" parameterType="string" resultType="com.yao.beans.User">
select * from user where 1=1
<if test="name != null and name != ''">
and name = #{name}
</if>

</select>

choose、when、otherwose元素

choose、when、otherwose是一个组合的元素,相当于java语句中的switch…case…default语句。

以按对象来查询的例子来说明choose、when、otherwose的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select id="getUserByChose" parameterType="com.yao.beans.User" resultType="com.yao.beans.User">
select * from user where 1=1
<choose>
<when test="id !=null and id != ''">
and id =#{id}
</when>
<when test=" name != null and name != ''">
and name = #{name}
</when>
<otherwise>

</otherwise>
</choose>
</select>

where、set元素

在前面的元素中查询时要加入1=1否则可能会出现语法错误,Mybatis提供了where标签来处理SQL语句

以按姓名查询为例子来说明where的用法

1
2
3
4
5
6
7
8
9
<select id="getUserByWhere" parameterType="string" resultType="com.yao.beans.User">

select * from user
<where>
<if test="name != null and name != ''">
and name = #{name}
</if>
</where>
</select>

where元素会判断SQL语句是不是要删去and或者or

set元素用于更新操作。

1
2
3
4
5
6
7
8
9
10
<update id="updateBySet" parameterType="com.yao.beans.User">
update user
<set>
<if test="name != null and name != ''">
name = #{name},
</if>

</set>
where id = #{id}
</update>

set元素在遇到,时会自动判断是不是在最后,需不需要删去。

trim元素

有时候需要处理一些特殊的SQL语句,trim可以帮助处理一些不规则的语法。trim元素有点类似于replace。
trim有四个属性

  • prefix:前缀覆盖并增加其内容。也就是给中的sql语句加上前缀;
  • suffix:后缀覆盖并增加其内容。给包裹的sql语句加上后缀;
  • prefixOverrides:前缀判断的条件。取消指定的前缀,如where;
  • suffixOverrides:后缀判断的条件。取消指定的后缀,如and | or.,逗号等。

以插入一条数据来说明trim的用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<insert id="insertByTrim" parameterType="com.yao.beans.User">
insert user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null and name !=''">
name,
</if>
<if test="sex != null and sex != ''">
sex,
</if>
</trim>

<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="name != null and name !=''">
#{name},
</if>
<if test="sex != null and sex != ''">
#{sex},
</if>
</trim>

</insert>

trim处理完后相当于insert user (name ,sex) valuse( #{name},#{sex} )

foreach元素

foreach元素是一个循环语句,它的作用是遍历集合,而且能够很好的支持数组和List、Set接口的集合。

以获取sex为1和0的例子来说明foreach的用法

1
2
3
4
5
6
<select id="findUserByForeach" resultType="com.yao.beans.User">
select * from user where sex in
<foreach collection="sexList" item="sex" index="index" open="(" separator="," close=")">
#{sex}
</foreach>
</select>

  • collection 是传递进来的参数名称,可以是数组、List、Set等集合
  • item 当前元素
  • index 当前元素在集合的位置下标
  • open 以什么符号开始
  • separator 元素之间的分隔符
  • close 以什么时候结束

bind元素

bind可以通过OGNL表达式去自定义一个上下文变量方便使用。

比如进行模糊查询

1
2
3
4
5
<select id="findUserByBind" resultType="com.yao.beans.User">

<bind name="patten" value="'%'+ _parameter+'%'"/>
select * from user where name like #{patten}
</select>

_parameter是传进来的参数,跟通配符连接后赋值给patten。
bind可以定义多个对象。

-------------本文结束感谢您的阅读-------------