MyBatis-sql动态语句学习用法参考

本文详细介绍了MyBatis中的动态SQL元素,包括<if>、<where>、<set>、<trim>、<foreach>和<choose>的使用方法。通过示例展示了如何在mapper接口和SQL语句中应用这些元素,以实现灵活的条件查询和更新操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.<if>

2.<where>

3.<set> 

4.<trim>

5.<foreach>  1.list 集合   2.array 数组

6.<choose>

 首先,我们需要一些配置,当然前面你自己可能已经配置好了,那么久简单来一些数据

使用sql 添加一些数据,那么我们开始吧

create table useradd(id bigint primary key auto_increment comment 'id',username varchar(50) comment '用户名',
password varchar(64) comment '密码',nickname varchar(50) comment '昵称',gender varchar(250) comment '势力'
)comment '用户' charset =utf8;

insert into useradd( username, password, nickname, gender) VALUES
('rod','123456','可莉','蒙德'),
('feng','123456','风神','蒙德'),
('gen','123456','刻晴','璃月'),
('mager','123','神里凌华','稻妻'),
('lei','123','雷电将军','稻妻'),
('chong','123','八重子','稻妻')

1. <if> 标签
 

mapper 接口上: List<UserDto> getByUser(UserDto dto);

sql 语句上:  

<select id="getByUser" resultMap="ResMap">
       select <include refid="add" /> from useradd
        <if test="nickname !=null and nickname !=''">
          where  nickname=#{nickname}
        </if>
        <if test="gender !=null and gender !=''">
            or gender=#{gender}
        </if>
   </select>

在sql 中的 <if>里的判断,只要判断有为空,或者错误时,就不会进行条件查询了,也就是不会执行这里的sql语句了 

<if> 类似于 and 所有你想全部进行条件查询 就改成 or

查询为:

  @Test
    void getById(){
        UserDto dto =new UserDto();
        dto.setNickname("可莉");
        dto.setGender("稻妻");
        List<UserDto> list = mapper.getByUser(dto);
        list.forEach(System.out::println);

        System.out.println("<if> 方式的选项 类似于 and ");
    }


 

2. <where> 语句的用法
 

mapper 接口:  List<UserDto> getWhere(UserDto dto);

sql 语句:

<select id="getWhere" resultMap="ResMap">
        select <include refid="add" /> from useradd
        <where>
            <if test="nickname !=null and nickname !=''">
                nickname=#{nickname}
            </if>
            <if test="gender!=null and gender !=''">
                or gender=#{gender}
            </if>
            <if test="id !=null and id !=''">
              or  id=#{id}
            </if>
        </where>
    </select>

    当数值为null或" "的时候,我们依然可以进行where条件的判断,可以查询; 如果不想的话,

把 or 该成 and 就可以了,

      由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要限制那个条件,只需要附上相应的值就会where这个条件,相反不去赋值同样在where中判断,但依然可以进行查询 ;

        查询为:

 void getById01(){
        UserDto dto =new UserDto();
        dto.setNickname("可莉");
        dto.setGender("璃月");
        List<UserDto> list = mapper.getWhere(dto);
        list.forEach(System.out::println);

        System.out.println("<if> 方式的选项 类似于 and ");
    }

 

3. < set > 语句的用法
 

mapper 接口:  void updateName(UserDto dto);

sql 语句:

<update id="updateName" >
        update useradd
        <set>
            <if test="username !=null and username !=''">
                username=#{username},
            </if>
            <if test="password !=null and password !=''">
                 password=#{password},
            </if>
            <if test="nickname !=null and nickname!=''">
                nickname=#{nickname},
            </if>
            <if test="gender !=null and gender !=''">
                gender=#{gender}
            </if>
        </set>
        where id=#{id}
    </update>

       当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set 标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。
没有使用if标签时,如果有一个参数为null,都会导致错误 ;

     使用 set+if 标签修改后,如果某项为null则不进行更新,而是保持数据库原值 ;

        查询为:

@Test
    void getUpdateById() {
        UserDto dto = new UserDto();
        dto.setId(7L);

        dto.setUsername("keq");
        dto.setNickname("刻晴-雷");
        dto.setGender("稻妻-神里");
        dto.setPassword("456789");

        mapper.updateName(dto);
        System.out.println("修改成功!");

        List<UserDto> list = mapper.getWhere(dto);
        list.forEach(System.out::println);
    }

4. <trim> 语句的用法


 trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

mapper 接口:  List<UserDto> getWhere02(UserDto dto);

                void updateName02(UserDto dto);

sql 语句:

<select id="getWhere02" resultMap="ResMap">
        select <include refid="add" /> from useradd
        <trim prefix="where" prefixOverrides="and| or">
            <if test="nickname !=null and nickname !=''">
                nickname=#{nickname}
            </if>
            <if test="gender!=null and gender !=''">
                or gender=#{gender}
            </if>
            <if test="id !=null and id !=''">
                or  id=#{id}
            </if>
        </trim>
    </select>

  prefi= 指定代替的类型   where 用:prefixocerrides= " "  类型  里面判断类型 可以自己添加

          trim 指定 < set> 的用法 : 这里就是 suffixOverrides=","   用逗号

<update id="updateName02" >
        update useradd
        <trim prefix="set" suffixOverrides="," >
            <if test="username !=null and username !=''">
                username=#{username},
            </if>
            <if test="password !=null and password !=''">
                 password=#{password},
            </if>
            <if test="nickname !=null and nickname!=''">
                nickname=#{nickname},
            </if>
            <if test="gender !=null and gender !=''">
                gender=#{gender}
            </if>
        </trim>
        where id=#{id}
    </update>

查询:

 @Test
    void getById03() {
        UserDto dto = new UserDto();
        dto.setId(7L);

        dto.setUsername("keq");
        dto.setNickname("刻晴-雷");
        dto.setGender("稻妻-神里");
        dto.setPassword("456789");

        mapper.updateName02(dto);
        System.out.println("修改成功!");

        List<UserDto> list = mapper.getWhere02(dto);
        list.forEach(System.out::println);
    }

   这个两个一起使用了 , trim -> 指定的类型不用,后面的类型也需要使用不同的类型

5. <foreach> 语句的用法

      对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。
List 实例将使用“list”做为键,数组实例以“array” 做为键。

                        List 集合方式的使用
Mapper 接口:  List<UserDto> getList(List<String> name);

sql 语句:

<select id="getList" resultMap="ResMap">
        select <include refid="add" /> from useradd where nickname in
            <foreach collection="list" item="name" open="(" separator="," close=")">
                #{name}
            </foreach>
    </select>

查询为:

 @Test
    void getList(){
        List<String> list =new ArrayList<>();
        list.add("可莉");
        list.add("神里凌华");

        List<UserDto> dtos = mapper.getList(list);
        dtos.forEach(System.out::println);
        System.out.println( "list 集合 方式,多查询");
    }

                 <Array> 语句的用法

mapper 接口:  List<UserDto> getArray(String[] name);

sql 语句:

 <select id="getArray" resultMap="ResMap">
        select <include refid="add" /> from useradd where nickname in
        <foreach collection="array" item="name" open="(" separator="," close=")">
            #{name}
        </foreach>
 </select>

   查询为:

 @Test
    void getArray(){
        String[] list =new String[3];
        list[0] ="可莉";
        list[1] ="神里凌华";
        list[2] ="神里凌华527";

        List<UserDto> dtos = mapper.getArray(list);
        dtos.forEach(System.out::println);
        System.out.println( "Array 数组 方式,多查询");
    }

    这当中的 List 跟 array 是非常相似的

6.< choose >  的用法

接口: List<UserDto> getWhere03(UserDto dto);

sql 语句:

  <select id="getWhere03" resultMap="ResMap">
        select <include refid="add" /> from useradd
        <where>
            <choose>
                <when test="nickname !=null and nickname !=''">
                    nickname=#{nickname}
                </when>
                <when test="gender!=null and gender !=''">
                    and gender=#{gender}
                </when>
                <when test="id !=null and id !=''">
                    and  id=#{id}
                </when>
                <otherwise>

                </otherwise>
            </choose>
        </where>
    </select>

查询为:

 @Test
    void getChoos() {
        UserDto dto = new UserDto();
        dto.setId(7L);
     
        dto.setNickname("刻晴-雷");
        dto.setGender("稻妻-神里");

        List<UserDto> list =mapper.getWhere03(dto);
        list.forEach(System.out::println);
        System.out.println(" 查询也跟前面也是比较相似的! ");

    }

           有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。
         if 是与(and)的关系,而choose是或(or)的关系。
 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值