- 关于spring整合mybatis的步骤applicationContext.xml的配置:https://blog.csdn.net/IT_CREATE/article/details/85329007
- mybatis框架之mapper的xml映射配置的编写(insert、delete、update、select标签使用):https://blog.csdn.net/IT_CREATE/article/details/85687293
- mybtis中的级联关系(关联关系、集合关系)association、collection(一对一关系、一对多关系、多对多关系):https://blog.csdn.net/IT_CREATE/article/details/86523101
- mybatis中的级联关系中的鉴别器(discriminator、case、result):https://blog.csdn.net/IT_CREATE/article/details/86561051
动态sql需要使用的标签
在mybatis中,我们除了做一些固定sql之外,还要做一些动态的sql拼接,因为我们要对从浏览器传下来的参数进行值判断,为不为空这些啊,所以我们根据条件去做到动态sql拼接,才满足我们的需求。
在mybitis中的sql语句都是进行拼接的,意思就是任何用于动态sql的标签都是在前面已经写的sql语句后面进行追加sql语句。
逻辑标签的使用
1、<where>--<if>标签
if标签,顾名思义,就和我们Java中的if一样,是用做判断的,if标签可单独使用,也可嵌套where标签使用。它的使用也很简单。
比如我做查找时:(test属性就是写条件表达式的)
<select id="findUserBeanByMap" resultMap="userMap">
select
id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
t_user
<where>
1 = 1
<if test="m.userName != null && m.userName != ''">
and user_name like concat(#{m.userName},'%')
</if>
<if test="m.age != null">
and age = #{m.age}
</if>
<if test="m.gender != null">
and gender = #{m.gender}
</if>
</where>
</select>
里面有where标签,这个标签就是自动在后面拼接where的,用于我们拼接where条件,在where标签中,如果第一个条件前面含有“AND”或“OR”,它会自动进行忽略,一般和if标签进行嵌套使用,用于动态拼接where条件。同时注意的是:在xml中有时我们用一些“<”这类符号去做if条件判断时,可能它会认不到,所以我们要用到转义字符,常用的有:
< < 小于号
> > 大于号
& & 和
' ' 单引号
" " 双引号
实体必须以符号"&"开头,以符号";"结尾。 注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
其实标签之间是可以嵌套使用,也可以单独使用,根据你的情况而定。
2、<foreach>标签
顾名思义,就是用作循环用的,相当于java中的foreach循环。
比如我们做批量新增时:(collection表示的是集合,只就是从接口传下来的集合;item表示的是集合每个单独的值,自己随便起名字;separator表示每次循环结束用什么隔开)
<insert id="addBatchUserBean">
<!-- 批量新增的语法:insert into 表 (列名列表) values (),(),()…… -->
insert into
t_user(login_name,user_name,user_pwd,age,gender,birthday,create_time)
values
<!-- 循环语句,类似我们java的 for(UserBean u,users){ } ,separator表示每个结果之间用什么隔开-->
<foreach collection="users" item="u" separator=",">
(#{u.loginName},#{u.userName},#{u.password},#{u.age},#{u.gender},#{u.birthday},now())
</foreach>
</insert>
比如我们用于批量删除时:(foreach 该标记主要用于遍历集合或者数组,collection 属性代表需要遍历的集合或数组,item 代表每次遍历取出来的数据,open 代表遍历开始前,以什么符号开始, close 代表遍历结束后,以什么符号结束 ,separator 代表每次遍历的分隔符):
<delete id="deleteBatchUserBean">
<!-- 批量删除的语法:delete from 表 where id in (……) -->
<!-- collection 如果接口传下来的list参数并未取参数别名,那么此处就要写成array,
取了别名,那么就按照别名来写,例如:ids -->
delete from t_user where id in
<foreach collection="ids" item="id" open="(" close=")"
separator=",">
#{id}
</foreach>
<!-- foreach 该标记主要用于遍历集合或者数组,collection 属性代表需要遍历的
集合或数组 item 代表每次遍历取出来的数据,open 代表遍历开始前,以什么符号开始,
close 代表遍历结束后,以什么符号结束 ,separator 代表每次遍历的分隔符 -->
</delete>
3、<set>--<if>标签
set标签主要用在做修改的时候,我们要实现按需修改,就是只对表中的特定列进行修改的时候用,它主要和if标签嵌套使用。
这里,set 元素会动态前置 SET 关键字,同时也会删掉无关的逗号,因为用了条件语句之后很可能就会在生成的 SQL 语句的后面留下这些逗号。(译者注:因为用的是“if”元素,若最后一个“if”没有匹配上而前面的匹配上,SQL 语句的最后就会有一个逗号遗留),意思是如果在set中最后的条件没匹配上,会遗留下前面匹配上的条件的“,”,所以为了避免这种情况最后的条件一定要匹配上,所以我们可以在最后加上一个一定能匹配上的条件。
比如:
<update id="updateUserBean">
update t_user
<!-- set-if判断,可以在修改的时候对指定列进行修改,而不是全部修改-->
<set>
<if test="u.loginName != null and u.loginName != ''">
login_name = #{u.loginName},
</if>
<if test="u.userName != null and u.userName != ''">
user_name = #{u.userName},
</if>
<if test="u.age != null">
age = #{u.age},
</if>
<if test="u.gender != null">
gender = #{u.gender},
</if>
<if test="u.password != null and u.password != ''">
user_pwd = #{u.password},
</if>
<if test="u.birthday != null">
birthday = #{u.birthday},
</if>
update_time = now()
</set>
where id = #{u.id};
</update>
4、<choose>--<when>--<otherwise>标签
这一组标签等同于java中的switch case default条件控制语句,用法如下,不过比起比起上面的where--if嵌套,明显where--if要更好一些,where--if足以。
<select id="findUserBeanByObject" resultMap="userMap">
select
id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
t_user
<where>
<!-- choose when otherwise 等同于java中的switch case default -->
<choose>
<when test="u.userName != null && u.userName != ''">
and user_name like concat(#{u.userName},'%')
</when>
<when test="u.age != null">
and age = #{u.age}
</when>
<when test="u.gender != null">
and gender = #{u.gender}
</when>
<otherwise>
1=1
</otherwise>
</choose>
</where>
order by ${sort} ${order}-->
</select>
5、<trim>--<if>标签
这个标签其实和where--if标签非常接近,也是动态拼接,不过使用where--if就足够了。
<select id="findUserBeanByObject" resultMap="userMap">
select
id,login_name,user_name,age,gender,user_pwd,birthday,create_time from
t_user
<!-- trim if 作用跟where if 非常的接近
prefix="where" 表示需要条件判断之前,以什么开始
prefixOverrides="and|or" 如果where 后直接跟and或者or ,那么将使用空字符串替换-->
<trim prefix="where" prefixOverrides="and|or">
<if test="u.userName != null && u.userName != ''">
and user_name like concat(#{u.userName},'%')
</if>
<if test="u.age != null">
and age = #{u.age}
</if>
<if test="u.gender != null">
and gender = #{u.gender}
</if>
</trim>
order by ${sort} ${order}
</select>
以上这些标签足够了,也是我们常用的。
更多动态sql标签参考myvatis官网:http://www.mybatis.org/mybatis-3/zh/dynamic-sql.html