Mybatis动态拼接SQL语句篇

MyBatis常用OGNL表达式

使用OGNL表达式,类似EL表达式。使用如下标签,类似JSTL标签

以下介绍的标签基本都在操作标签内(

1、:相当于给sql语句后面自动添加一个 where 1=1,避免sql语句where后面紧跟着一个and即第一个条件为假

2、:if语句
test:对属性的条件,填写OGNL表达式,

3、: 对拼接后的sql语句再进行最后的修改
prefix:给拼串后的整个字符串加一个前缀
prefixOverrides:前缀覆盖: 去掉整个字符串前面多余的字符
suffix:suffix给拼串后的整个字符串加一个后缀
suffixOverrides:去掉整个字符串后面多余的字符

4、:相当于带break的choose语句,只能执行第一个匹配条件的语句
:相当于switch语句
test:属性值的判断,ONGL表达式
:相当于default语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  <select id="getEmpByCondition" resultType="mybatis.bean.Employee">
select* from tb1_employee

<where>
<if test="id!=null">
and id=#{id}
</if>
<if test="lastName!=null">
and last_name=#{lastName}
</if>
<if test="email!=null">
and email=#{email}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</where>


<trim prefix="where" prefixOverrides="and">
<if test="id!=null">
and id=#{id}
</if>
<if test="lastName!=null">
and last_name=#{lastName}
</if>
<if test="email!=null">
and email=#{email}
</if>
<if test="gender!=null">
and gender=#{gender}
</if>
</trim>

<where>
<choose>
<when test="id!=null">and id=#{id}</when>
<when test="lastName!=null">and last_name=#{lastName}</when>
<when test="email!=null"> and email=#{email}</when>
<otherwise>
and gender=#{gender}
</otherwise>
</choose>
</where>
</select>

5、:相当于给sql语句后面自动添加一个 set,同时去掉set条件后的逗号( , ),在更新数据表数据时使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 <update id="updateByCondition">
update tb1_employee
<set>
<if test="id!=null">
id=#{id}
</if>
<if test="lastName!=null">
last_name=#{lastName}
</if>
<if test="email!=null">
email="[email protected]"
</if>
<if test="gender!=null">
gender=#{gender}
</if>
</set>
where email=#{email};
</update>

6、:遍历传入的List列表参数或Map集合参数的标签

collection:指定要遍历的集合参数名

item:正在遍历的元素名(自己取名)

separator:每个元素之间的分隔符

open:在遍历出来的结果前添加前缀

close:在遍历出来的结果后添加后缀

index:索引。遍历list的时候是index就是索引,item就是当前值

#{元素名(即item)}:取出元素

使用根据传入的List拼接sql查询语句

1
2
3
4
5
6
 <select id="getEmpsByList" resultType="mybatis.bean.Employee">
select* from tb1_employee where id in
<foreach collection="list" item="idItem" separator="," open="(" close=")">
#{idItem}
</foreach>
</select>

使用进行批量插入的俩种方法:

第一种:MySQL支持values(…),values(…),…来插入多条数据

1
2
3
4
5
6
7
8
9
10
11
12
	<insert id="insertBatchOne">
insert into tb1_employee values
<foreach collection="list" item="employee" separator=",">
(
#{employee.id},
#{employee.lastName},
#{employee.gender},
#{employee.email},
#{employee.dept.id}
)
</foreach>
</insert>

第二种:拼写多条insert语句,需要开启在全局配置文档中修改

database=jdbc:mysql://localhost:3306/mybatis?allowMultiQueries=true

1
2
3
4
5
6
	<insert id="insertBatchTwo">
<foreach collection="list" item="employee" separator=";">
insert into tb1_employee values(#{employee.id},#{employee.lastName},
#{employee.gender}, #{employee.email},#{employee.dept.id})
</foreach>
</insert>

7、:存储常用ONGL表达式

name:引用时别名

value :ONGL表达式

#{name}:使用ONGL表达式

1
2
3
4
	<select id="getByLastName" resultType="mybatis.bean.Employee">
<bind name="similarLastName" value="'%'+lastName+'%'"/>
select* from tb1_employee where last_name like #{similarLastName}
</select>

8、:存储sql语句的数据库常用列名

id:引用时别名

:根据refid取出标签存储的列名

refid:取出refid与id相同的列名

1
2
3
4
5
6
7
8
9
10
11
12
13
	<sql id="insertColumn">
last_name,gender
</sql>
<insert id="insertEmployee">
insert into tb1_employee(
<include refid="insertColumn">
</include>
) values
(
#{lastName},
#{gender}
)
</insert>

二、内置参数

1
2
3
         <if test="_parameter!=null">
            where id = #{_parameter.id}
        </if>