7.mybatis中动态SQL

7.动态SQL

7.1 if

package com.itany.ms.dao;
import com.itany.ms.entity.User;
import java.util.List;
public interface UserDao2 {
    List<User> selectFuzzy(User user);
}
<?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.itany.ms.dao.UserDao2">
    <!--
    if标签: 分支标签,
    test属性的值 是boolean类型的,为true时,会显示 标签中的内容,否则,不显示。
    test属性中的 内容写法 类似 java的代码写法
    and( && ) , or ( || ) 表示 条件的关联
    ==(在此处可以用于比较字符串的内容), gt( > ), lt ( < ), gte( >= ), lte ( <= ),
    字符串参数与其他字符串比较, 还可以使用 参数名.equals('其他值')
    在 test 属性中 获取 参数对象的属性值 不需要 #{}, 直接写属性名 就可获取
    -->
    <select id="selectFuzzy" resultType="com.itany.ms.entity.User">
        select
        id, name, pwd, age
        from t_user
        where 1 = 1
        <if test="null != id">
        and id = #{id}
        </if>
        <if test="null != name and '' != name">
        and name = #{name}
        </if>
        <if test="null != pwd">
        and pwd = #{pwd}
        </if>
        <if test="null != age">
        and age = #{age}
        </if>
    </select>
</mapper>
@Test
public void test11() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    User u = new User();
    u.setId(6);
    u.setName("");
    u.setPwd("");
    u.setAge(null);
    List<User> users = dao.selectFuzzy(u);
    System.out.println(users);
}

7.2 where

<!-- where标签的作用 替代 where 关键字,
    如果where标签中没有任何条件时,会省略where关键字。
    还会去除 紧接其后的 条件前的 and 或者 or 关键字
-->
<select id="selectFuzzy2" resultType="com.itany.ms.entity.User">
    select
    id, name, pwd, age
    from t_user
    <where>
        <if test="null != id">
            and id = #{id}
        </if>
        <if test="null != name and '' != name">
            and name = #{name}
        </if>
        <if test="null != pwd">
            and pwd = #{pwd}
        </if>
        <if test="null != age">
            and age = #{age}
        </if>
    </where>
</select>

7.3 set

作用类似 where标签。用于替代 set 关键字,并删除 最后多余的逗号。

如果set标签中没有任何内容时,则会省略SET关键字。

<update id="updateUserById">
    update t_user
    <set>
        <if test="null != name and '' != name">
            name = #{name},
        </if>
        <if test="null != age">
            age = #{age},
        </if>
        <if test="null != pwd">
            pwd = #{pwd},
        </if>
    </set>
    where id = #{id}
</update>
// 接口新增方法
void updateUserById(User user);

// 测试代码
@Test
public void test12() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    User u = new User();
    u.setId(6);
    u.setName("");
    u.setPwd("123");
    u.setAge(18);
    dao.updateUserById(u);
}

7.4 trim

  • 在标签内的开头 或者 末尾 添加内容
  • 删除标签内的 开头 或者 末尾的 内容
<!--
    此种用类似 where标签, 开开头加where关键字,去除多余的 and或者or
	prefixOverrides 中的 | 表示 或者的关系
-->
<select id="selectFuzzy3" resultType="com.itany.ms.entity.User">
    select
    id, name, pwd, age
    from t_user
    <trim prefix="where" prefixOverrides="and|or" >
        <if test="null != id">
            and id = #{id}
        </if>
        <if test="null != name and '' != name">
            and name = #{name}
        </if>
        <if test="null != pwd">
            and pwd = #{pwd}
        </if>
        <if test="null != age">
            and age = #{age}
        </if>
    </trim>
</select>
<update id="updateUserById2">
    update t_user
    <trim prefix="SET" suffixOverrides="," suffix="WHERE" >
        <if test="null != name and '' != name">
            name = #{name},
        </if>
        <if test="null != age">
            age = #{age},
        </if>
        <if test="null != pwd">
            pwd = #{pwd},
        </if>
    </trim>
    id = #{id}
</update>
List<User> selectFuzzy3(User user);
void updateUserById2(User user);
@Test
public void test13() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    User u = new User();
    u.setId(6);
    u.setName("");
    u.setPwd("");
    u.setAge(null);
    List<User> users = dao.selectFuzzy3(u);
    System.out.println(users);
}
@Test
public void test14() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    User u = new User();
    u.setId(6);
    u.setName("aaaa");
    u.setPwd("qqqq");
    dao.updateUserById2(u);
}

7.5 foreach

<!--
    collection属性:
        如果参数类型是 数组   其值写 array
        如果参数类型是 List   其值写 list
        如果参数类型是 对象   其值写 属性名 (遍历其属性值中的内容)
        如果参数类型是 Map   其值写 Map的key值 (遍历该key对应的value中的内容)
    item属性:元素的别名, 在循环中可以通过 #{别名} 取值
    separator属性: 在元素值之间加入 分隔指定的字符串
    open属性: 在循环开头 加入指定的字符串
    close属性: 在循环末尾 加入指定的字符串
    index属性: 元素下标
-->
<select id="select1" resultType="com.itany.ms.entity.User" >
    select
    id, name, pwd, age
    from t_user
    where id in
    <foreach collection="array" item="id" separator="," open="(" close=")" >
        #{id}
    </foreach>
</select>
<select id="select2" resultType="com.itany.ms.entity.User" >
    select
    id, name, pwd, age
    from t_user
    where id in
    <foreach collection="list" item="id" separator="," open="(" close=")" >
        #{id}
    </foreach>
</select>
<select id="select3" resultType="com.itany.ms.entity.User" >
    select
    id, name, pwd, age
    from t_user
    where id in
    <foreach collection="idArr" item="id" separator="," open="(" close=")" >
        #{id}
    </foreach>
</select>
List<User> select1(int[] idArr);
List<User> select2(List<Integer> idList);
List<User> select3(Map<String, int[]> map);
@Test
public void test15() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    List<User> users = dao.select1(new int[]{ 1,3,5,7 });
    System.out.println(users);
}
@Test
public void test16() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    List<Integer> idList = Arrays.asList(new Integer[]{1, 3, 5, 7});
    List<User> users = dao.select2(idList);
    System.out.println(users);
}
@Test
public void test17() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    Map<String, int[]> map = new HashMap<>();
    map.put("idArr", new int[]{ 3,5,7,9,11 });
    List<User> users = dao.select3(map);
    System.out.println(users);
}

7.6 bind

/**
* 根据name模糊查询
* @param name
* @return
*/
List<User> selectByNameLike(@Param("name") String name);
<!--
    bind标签, 对传入的参数值进行处理,并赋值到新的参数变量中
    name值是新参数变量名, value是原始参数处理后的值
当参数是 基本数据类型等时,且只有一个时,即 参数没有手动定义名称,
    在 if等标签属性中 取值时 可以通过 _parameter 取值。即 参数名是 _parameter
-->
<select id="selectByNameLike" resultType="com.itany.ms.entity.User" >
    select
    id, name, pwd, age
    from t_user
    <where>
        <if test="null != name and '' != name">
            <bind name="nameLike" value="'%'+name+'%'" ></bind>
            and name like #{nameLike}
        </if>
    </where>
</select>
@Test
public void test19() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    String name = "a";
    //        String nameLike = "%"+ name +"%";
    List<User> users = dao.selectByNameLike(name);
    System.out.println(users);
}

7.7 choose

List<User> selectByAge(@Param("age") Integer age);
<!--
    choose 标签
        子标签 when 表示 一个分支, test属性的值是 boolean,
        当一个when标签的test属性值是true时,会显示其中内容,此时,其他的when标签则直接跳过。
        子标签 otherwise 表示默认分支,所有的when都符合时,会显示 otherwise 标签中内容
-->
<select id="selectByAge" resultType="com.itany.ms.entity.User" >
    select
    id, name, pwd, age
    from t_user
    where
    <choose>
        <when test="null != age and age gte 0" >
            age = #{age}
        </when>
        <when test="null != age and age lt 0" >
            age is null
        </when>
        <otherwise>
            1 = 1
        </otherwise>
    </choose>
</select>
@Test
public void test20() {
    UserDao2 dao = sqlSession.getMapper(UserDao2.class);
    // Integer age = null;
    // Integer age = 20;
    Integer age = -20;
    List<User> users = dao.selectByAge(age);
    System.out.println(users);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值