字节跳动飞书内推!
北京、杭州、武汉、广州、深圳、上海,六大城市等你来投。
感兴趣的朋友可以私我咨询&内推,也可以通过链接直接投递!
海量HC,极速响应,快来和我成为同事吧。
今日头条、抖音、Tik Tok也可以内推~
点击进入我的博客
MyBatis详解1.概述
MyBatis详解2.MyBatis使用入门
MyBatis详解3.MyBatis配置详解
MyBatis详解4.映射器Mapper
MyBatis详解5.动态SQL
MyBatis详解6.MyBatis技术内幕
MyBatis详解7.插件
MyBatis详解8.集成Spring
1 概述
MyBatis提供了对SQL语句动态的组装能力,大量的判断都可以在 MyBatis的映射XML文件里面配置,以达到许多我们需要大量代码才能实现的功能,大大减少了我们编写代码的工作量。
动态SQL的元素
元素 | 作用 | 备注 |
---|---|---|
if | 判断语句 | 单条件分支判断 |
choose、when、otherwise | 相当于Java中的 case when语句 | 多条件分支判断 |
trim、where、set | 辅助元素 | 用于处理一些SQL拼装问题 |
foreach | 循环语句 | 在in语句等列举条件常用 |
2 if元素
if元素相当于Java中的if语句,它常常与test属性联合使用。现在我们要根据name去查找学生,但是name是可选的,如下所示:
<select id="selectByName" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE 1=1
<if test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</if>
</select>
3 choose、when、otherwise元素
有些时候我们还需要多种条件的选择,在Java中我们可以使用switch、case、default语句,而在映射器的动态语句中可以使用choose、when、otherwise元素。
<!-- 有name的时候使用name搜索,没有的时候使用id搜索 -->
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE 1=1
<choose>
<when test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</when>
<when test="id != null">
AND id = #{id}
</when>
</choose>
</select>
4 where元素
上面的select语句我们加了一个1=1
的绝对true的语句,目的是为了防止语句错误,变成SELECT * FROM student WHERE
这样where后没有内容的错误语句。这样会有点奇怪,此时可以使用<where>
元素。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
<where>
<if test="name != null and name != ''">
name LIKE concat('%', #{name}, '%')
</if>
</where>
</select>
5 trim元素
有时候我们要去掉一些特殊的SQL语法,比如常见的and、or,此时可以使用trim元素。trim元素意味着我们需要去掉一些特殊的字符串,prefix代表的是语句的前缀,而prefixOverrides代表的是你需要去掉的那种字符串,suffix表示语句的后缀,suffixOverrides代表去掉的后缀字符串。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
<trim prefix="WHERE" prefixOverrides="AND">
<if test="name != null and name != ''">
AND name LIKE concat('%', #{name}, '%')
</if>
<if test="id != null">
AND id = #{id}
</if>
</trim>
</select>
6 set元素
在update语句中,如果我们只想更新某几个字段的值,这个时候可以使用set元素配合if元素来完成。注意:set元素遇到,
会自动把,
去掉。
<update id="update">
UPDATE student
<set>
<if test="name != null">
name = #{name},
</if>
<if test="sex != null">
sex = #{sex}
</if>
</set>
WHERE id = #{id}
</update>
7 foreach元素
foreach元素是一个循环语句,它的作用是遍历集合,可以支持数组、List、Set接口。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
SELECT * FROM student
WHERE name IN
<foreach collection="names" open="(" close=")" separator="," item="item">
#{item}
</foreach>
</select>
- collection配置的是传递进来的参数名称
- item配置的是循环中当前的元素。
- index配置的是当前元素在集合的位置下标。
- open和 close配置的是以什么符号将这些集合元素包装起来。
- separator是各个元素的间隔符。
8 bind元素
bind元素的作用是通过OGNL表达式去自定义一个上下文变量,这样更方便我们使用。在我们进行模糊查询的时候,如果是MySQL数据库,我们常常用到的是一个concat用“%”和参数相连接;然而在Oracle数据库则是用连接符号“||”,这样SQL就需要提供两种形式去实现。但是有了bind元素,我们就完全不必使用数据库的语言,只要使用MyBatis的语言即可与所需参数相连。
<select id="select" resultType="com.ankeetc.spring.domain.StudentDomain">
<bind name="pattern" value="'%' + name + '%'"/>
SELECT * FROM student WHERE name LIKE #{pattern}
</select>