动态 sql 是 Mybatis 的强⼤特性之⼀,能够完成不同条件下不同的 sql 拼接。
前端用户输入时有些选项是非必填的, 那么此时传到后端的参数是不确定的, 比如:
那如果在添加⽤户的时候有不确定的字段传⼊,程序应该如何实现呢?
这个时候就需要使⽤动态标签 来判断了,⽐如添加的时候性别 country 和 city 为⾮必填字段,具体实现如下:
<insert id="insert" parameterType="com.example.springboot3.model.User">
insert into userinfo (
username, phone, email,
<if test="country != null">
country,
</if>
<if test="city != null">
city,
</if>
) values (
#{username},#{phone}, #{email},
<if test="country != null">
#{country},
</if>
<if test="city != null">
#{city},
</if>
)
</insert>
这样当 test 中判断结果为 true 时才会拼接上去.
上面的插⼊⽤户功能,country 和 city 是选填项,如果所有字段都是选填项,就考虑使⽤
<insert id="insert" parameterType="com.example.springboot3.model.User">
insert into userinfo
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="username != null">
username,
</if>
<if test="phone != null">
phone,
</if>
<if test="email != null">
email,
</if>
<if test="country != null">
country,
</if>
<if test="city != null">
city,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="username != null">
#{username},
</if>
<if test="phone != null">
#{phone},
</if>
<if test="email != null">
#{email},
</if>
<if test="country != null">
#{country},
</if>
<if test="city != null">
#{city},
</if>
</trim>
</insert>
在以上 sql 动态解析时,会对
主要作用: 实现查询中的 where 替换, 可以实现无条件查询.
若存在查询条件会生成 where 的 sql 查询, 并且 where 标签可以去除最前面的 and
如果 where 中的所有参数为空, 那么 where 的 sql 就不会生成, 直接就是无条件查询
比如根据 国家(地区) 或者城市进行搜索, 根据属性做 where 条件查询,国家(地区) 或者城市不为 null 的,作为查询条件。
UserMapper 接口中的方法:
List<User> selectByCondition(String country, String city);
UserMapper.xml 中的实现:
<select id="selectByCondition" resultType="com.example.springboot3.model.User">
select * from userinfo
<where>
<if test="country != null">
and country=#{country}
</if>
<if test="city != null">
and city=#{city}
</if>
</where>
</select>
以上
主要作用: 进行修改操作时, 配合 if 处理非必须传输的参数, 特点是自动去除最后一个 ,
根据传⼊的⽤户对象属性来更新⽤户数据,可以使⽤标签来指定动态内容。
UserMapper 接口中的方法:
int updateById(User user);
UserMapper.xml 中的实现:
<update id="updateById">
update userinfo
<set>
<if test="username != null">
username=#{username},
</if>
<if test="phone != null">
phone=#{phone},
</if>
<if test="email != null">
email=#{email},
</if>
<if test="country != null">
country=#{country},
</if>
<if test="city != null">
city=#{city},
</if>
</set>
where id=#{id}
</update>
对集合进⾏遍历时可以使⽤该标签。
比如根据用户 id 删除用户:
UserMapper 接口中的方法:
int deleteByIds(List<Integer> ids);
UserMapper.xml 中的实现:
<delete id="deleteByIds">
delete from userinfo where id in
<foreach collection="ids" open="(" item="item" close=")" separator=",">
#{item}
</foreach>
</delete>
好啦! 以上就是对 Mybatis 动态 SQL 的讲解,希望能帮到你 !
评论区欢迎指正 !