您的位置:首页 > 财经 > 产业 > MyBatis 操作数据库(进阶)

MyBatis 操作数据库(进阶)

2024/12/22 14:54:51 来源:https://blog.csdn.net/qq_66333706/article/details/141254788  浏览:    关键词:MyBatis 操作数据库(进阶)

1. 动态SQL

动态 SQL 是Mybatis的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接

1.1 <if>标签

问题:注册分为两种字段:必填字段和⾮必填字段,那如果在添加⽤⼾的时候有不确定的字段传⼊,程序应 该如何实现呢?

  •  添加的时候性别 gender 为⾮必填字段
  • 当gender不为空的时候才会生成在sql语句中
Integer insertUserByCondition(UserInfo userInfo);1 <insert id="insertUserByCondition">
2 INSERT INTO userinfo (
3 username,
4 `password`,
5 age,
6 <if test="gender != null">
7 gender,
8 </if>
9 phone)
10 VALUES (
11 #{username},
12 #{age},
13 <if test="gender != null">
14 #{gender},
15 </if>
16 #{phone})
17 </insert>

1.2 <trim>标签

  • 如果有多个字段,⼀般考虑使⽤标签结 合标签,对多个字段都采取动态⽣成的⽅式
prefix:表⽰整个语句块,以prefix的值作为前缀
suffix:表⽰整个语句块,以suffix的值作为后缀
prefixOverrides:表⽰整个语句块要去除掉的前缀
suffixOverrides:表⽰整个语句块要去除掉的后缀
1 <insert id="insertUserByCondition">
2 INSERT INTO userinfo
3 <trim prefix="(" suffix=")" suffixOverrides=",">
4 <if test="username !=null">
5 username,
6 </if>
7 <if test="password !=null">
8 `password`,
9 </if>
10 <if test="age != null">
11 age,
12 </if>
13 <if test="gender != null">
14 gender
15 </if>
19 </trim> <insert id="insertUserByCondition">
2 INSERT INTO userinfo
3 <trim prefix="(" suffix=")" suffixOverrides=",">
4 <if test="username !=null">
5 username,
6 </if>
7 <if test="password !=null">
8 `password`,
9 </if>
10 <if test="age != null">
11 age,
12 </if>
13 <if test="gender != null">
14 gender
15 </if>
19 </trim>
在以上 sql 动态解析时,会将第⼀个 部分做如下处理:
基于 prefix 配置,开始部分加上 (
基于 suffix 配置,结束部分加上 )
多个 组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于
suffixOverrides 配置去掉最后⼀个 ,
注意 <if test="username !=null"> 中的 username 是传⼊对象的属性

1.3 <where>标签

根据属性做where条件查询

1 SELECT
2 *
3 FROM
4 userinfo
5 WHERE
6 age = 18
7 AND gender = 1
8 AND delete_flag = 0
Mapper.xml实现
1 < select id = "queryByCondition" resultType = "com.example.demo.model.UserInfo" >
2 select id, username, age, gender, phone, delete_flag, create_time,
update_time
3 from userinfo
4 < where >
5 < if test = "age != null" >
6 and age = #{age}
7 </ if >
8 < if test = "gender != null" >
9 and gender = #{gender}
10 </ if > 11 < if test = "deleteFlag != null" >
12 and delete_flag = #{deleteFlag}
13 </ if >
14 </ where >
15 </ select >

PS:<where> 只会在⼦元素有内容的情况下才插⼊where⼦句,⽽且会⾃动去除⼦句的开头的AND或 OR

1.4 <set>标签

需求: 根据传⼊的⽤⼾对象属性来更新⽤⼾数据,可以使⽤标签来指定动态内容.

1 < update id = "updateUserByCondition" >
2 update userinfo
3 < set >
4 < if test = "username != null" >
5 username = #{username},
6 </ if >
7 < if test = "age != null" >
8 age = #{age},
9 </ if >
10 < if test = "deleteFlag != null" >
11 delete_flag = #{deleteFlag},
12 </ if >
13 </ set >
14 where id = #{id}
15 </ update >

<set> :动态的在SQL语句中插⼊set关键字,并会删掉额外的逗号. (⽤于update语句中)

1.5 <foreach>标签

对集合进⾏遍历时可以使⽤该标签。标签有如下属性:
collection:绑定⽅法参数中的集合,如 List,Set,Map或数组对象
item:遍历时的每⼀个对象
open:语句块开头的字符串
close:语句块结束的字符串
separator:每次遍历之间间隔的字符串
1 < delete id = "deleteByIds" >
2 delete from userinfo
3 where id in
4 < foreach collection = "ids" item = "id" separator = "," open = "(" close = ")" >
5 #{id}
6 </ foreach >
7 </ delete >

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com