学习时发现其中有几个 mybaitis 标签以前从没用过,这次一起做篇笔记,以后需要用到时,能够快速上手他们的用法。
准备
创建数据库表
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(11) DEFAULT NULL,
`password` varchar(11) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
)
创建实体类
public class User{
private Integer id;
private String username;
private String password;
private Integer age;
}
创建 UserRepository
public interface UserRepository {
public User findByUser(User user);
}
创建 UserRepository.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.guozh.label.UserRepository">
</mapper>
if
判断参数是否为空的情况,如果为空,不用作为条件,同时可以兼容 and
<select id="findByUser" parameterType="com.guozh.label.User" resultType="com.guozh.label.User">
select * from t_user where
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
<if test="age!=null">
and age = {age}
</if>
</select>
但是这样会存在一个情况,就是第一个 if 为空,如果第一个 if 判断是 null,则 sql 中 where and 会连在一起,这是一个错误的 sql 。
需要用 where 标签处理,同时 where 也确实和 if 结合一起使用较多。
where
select * from t_user
<where>
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
<if test="age!=null">
and age = #{age}
</if>
</where>
choose when
这两个标签的作用和 if 是一样的,但使用比它更麻烦,所以平时几乎没用过
select * from t_user
<where>
<choose>
<when test="id!=null">
id = #{id}
</when>
<when test="username!=null">
and username = #{username}
</when>
<when test="password!=null">
and password = #{password}
</when>
<when test="age!=null">
and age = #{age}
</when>
</choose>
</where>
trim
先看 trim 标签有哪些属性,一共就这四个
<trim prefix="" suffix="" prefixOverrides="" suffixOverrides=""/>
前两个 prefix
和 suffix
代表标签内的 sql 拼接,前拼接或后拼接。
比如 插入
insert into t_user ()
如果要用 trim 标签,则可以
insert into t_user
<trim prefix="(" suffix=")"></trim>
但是一般不会这么简单的使用,这两个属性还会结合 prefixOverrides
、suffixOverrides
一起使用。继续用刚才的插入举例
insert into t_user (id,username,password,age) values ()
加上是否为null的判断条件,就变成如下:
insert into t_user
<trim prefix="(" suffix=")">
<if test="id!=null">
id ,
</if>
<if test="username!=null">
username,
</if>
<if test="password!=null">
password,
</if>
<if test="age!=null">
age
</if>
</trim>
values ()
但是,如果 age 是null 时,整个 sql 就会变成如下错误的语句。
insert into t_user (id,username,password,) values ()
所以以上写法就有隐患,trim标签内的 sql 可能后面多出 「,」
这里就是用 prefixOverrides="" suffixOverrides=""
来排除这个隐患,因为是后面,所以这里使用 suffixOverrides=""
,删除多余的「,」 ,全部代码如下
insert into t_user
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id!=null">
id ,
</if>
<if test="username!=null">
username,
</if>
<if test="password!=null">
password,
</if>
<if test="age!=null">
age
</if>
</trim>
() values ()
再回到前面的例子
select * from t_user
<trim prefix="where" prefixOverrides="and">
<if test="id!=null">
id = #{id}
</if>
<if test="username!=null">
and username = #{username}
</if>
<if test="password!=null">
and password = #{password}
</if>
<if test="age!=null">
and age = #{age}
</if>
</trim>
set
set 标签用于 Update 操作,会自动根据参数选择生成 SQL 语句。
update t_user
<set>
<if test="username!=null">
username = #{username},
</if>
<if test="password!=null">
password = #{password},
</if>
<if test="age!=null">
age = #{age}
</if>
</set>
where id = #{id}
foreach
学习下面的 open 写法,平时大部分时都会将 in 放到前面去,这里放在里面
select * from t_user
<where>
<foreach collection="ids" open="id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</where>
以上代码笔记内容来自付费专栏:案例上手 Spring 全家桶
PS:并没有透露关键内容,纯粹是零碎笔记。如果侵犯版权,请联系我。
本文由老郭种树原创,转载请注明:https://guozh.net/spring-mybatis-mapper-xml-label/