Spring笔记(09) Mybatis mapper.xml 标签

学习时发现其中有几个 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=""/>

前两个 prefixsuffix 代表标签内的 sql 拼接,前拼接或后拼接。

比如 插入

insert into t_user ()

如果要用 trim 标签,则可以

 insert into t_user 
        <trim prefix="(" suffix=")"></trim>

但是一般不会这么简单的使用,这两个属性还会结合 prefixOverridessuffixOverrides 一起使用。继续用刚才的插入举例

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/

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注