MyBatis操作数据库——进阶
MyBatis操作数据库——进阶
文章目录
- MyBatis操作数据库——进阶
- 动态SQL
- if 标签
- 接口定义
- Mapper.xml实现
- trim 标签
- Mapper.xml 中插入语句代码
- where 标签
- 接口定义
- Mapper.xml实现
- set 标签
- 接口定义
- Mapper.xml
- foreach 标签
- 接口方法
- ArticleMapper.xml 中新增删除 sql
- include 标签
动态SQL
一般不建议使用注解来写,过于复杂。一般使用xml的方式来写动态SQL
if 标签
if 标签: 主要用于进行条件判断。根据test属性中表达式的结果(true 或 false),决定是否将标签内的 SQL 片段包含在最终的 SQL 语句中。例如,在查询时判断某个参数是否为空,进而决定是否添加对应的查询条件
接口定义
Integer insertUserByCondition(UserInfo userInfo);
Mapper.xml实现
<insert id="insertUserByCondition">INSERT INTO userinfo (username,`password`,age,<if test="gender != null">gender,</if>phone)VALUES (#{username},#{age},<if test="gender != null">#{gender},</if>#{phone})
</insert>
trim 标签
trim 标签中有如下属性:
- prefix:表示整个语句块,以prefix的值作为前缀
- suffix:表示整个语句块,以suffix的值作为后缀
- prefixOverrides:表示整个语句块要去除掉的前缀
- suffixOverrides:表示整个语句块要去除掉的后缀
Mapper.xml 中插入语句代码
<insert id="insertUserByCondition">INSERT INTO userinfo<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">username,</if><if test="password !=null">`password`,</if><if test="age != null">age,</if><if test="gender != null">gender,</if><if test="phone != null">phone,</if></trim>VALUES<trim prefix="(" suffix=")" suffixOverrides=","><if test="username !=null">#{username},</if><if test="password !=null">#{password},</if><if test="age != null">#{age},</if><if test="gender != null">#{gender},</if><if test="phone != null">#{phone}</if></trim>
</insert>
在以上 sql 动态解析时,会将第一个部分做如下处理:
- 基于
prefix
配置,开始部分加上(
- 基于
suffix
配置,结束部分加上)
- 多个组织的语句都以
,
结尾,在最后拼接好的字符串还会以,
结尾,会基于suffixOverrides
配置去掉最后一个,
- 注意
<if test="username !=null">
中的username
是传入对象的属性
where 标签
where 标签: 用于智能处理 SQL 语句中的WHERE条件部分。它会自动判断其内部的 SQL 片段是否有内容:
- 如果内部有内容,会在拼接的 SQL 语句中添加WHERE关键字,并自动去除开头多余的AND 或 OR
- 如果内部没有内容,标签不会在 SQL 中添加任何内容,避免生成如WHERE AND 或 WHERE OR 这样错误的 SQL 语法。
接口定义
List<UserInfo> queryByCondition();
Mapper.xml实现
<select id="queryByCondition" resultType="com.example.demo.model.UserInfo">select id, username, age, gender, phone, delete_flag, create_time, update_timefrom userinfo<where><if test="age != null">and age = #{age}</if><if test="gender != null">and gender = #{gender}</if><if test="deleteFlag != null">and delete_flag = #{deleteFlag}</if></where>
</select>
<where>
只会在子元素有内容的情况下才插入where
子句,而且会自动去除子句的开头的AND
或OR
以上标签也可以使用 <trim prefix="where" prefixOverrides="and">
替换,但是此种情况下,当子元素都没有内容时,where
关键字也会保留
set 标签
set 标签:根据传入的用户对象属性来更新用户数据,可以使用标签来指定动态内容
接口定义
根据传入的用户 id 属性,修改其他不为 null 的属性
Integer updateUserByCondition(UserInfo userInfo);
Mapper.xml
<update id="updateUserByCondition">update userinfo<set><if test="username != null">username = #{username},</if><if test="age != null">age = #{age},</if><if test="deleteFlag != null">delete_flag = #{deleteFlag},</if></set>where id = #{id}
</update>
<set>
:动态的在 SQL 语句中插入set
关键字,并会删掉额外的逗号(用于update
语句中)- 以上标签也可以使用
<trim prefix="set" suffixOverrides=",">
替换
foreach 标签
对集合进行遍历时可以使用该标签。标签有如下属性:
collection
:绑定方法参数中的集合,如List
,Set
,Map
或数组对象item
:遍历时的每一个对象open
:语句块开头的字符串close
:语句块结束的字符串separator
:每次遍历之间间隔的字符串
需求:根据多个userid
,删除用户数据
接口方法
void deleteByIds(List<Integer> ids);
ArticleMapper.xml 中新增删除 sql
<delete id="deleteByIds">delete from userinfowhere id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
</delete>
include 标签
我们可以对重复的代码片段进行抽取,将其通过 <sql>
标签封装到一个 SQL 片段,然后再通过 <include>
标签进行引用。
<sql>
:定义可重用的 SQL 片段<include>
:通过属性refid
,指定包含的 SQL 片段
<sql id="allColumn">id, username, age, gender, phone, delete_flag, create_time, update_time
</sql>
通过 <include>
标签在原来抽取的地方进行引用。操作如下:
<select id="queryAllUser" resultMap="BaseMap">select<include refid="allColumn"></include>from userinfo
</select><select id="queryById" resultType="com.example.demo.model.UserInfo">select<include refid="allColumn"></include>from userinfo where id= #{id}
</select>