首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MyBatis框架:第九章:动态SQL语句

MyBatis框架:第九章:动态SQL语句

作者头像
Java廖志伟
发布于 2022-09-28 11:21:18
发布于 2022-09-28 11:21:18
4240
举报
文章被收录于专栏:高级开发进阶高级开发进阶

准备工作:

public class User { private int id; private String lastName; private int sex;

14.1、if 语句 说明: if语句,可以动态的根据你的值来决定,是否需要动态的添加查询条件。

UserMapper类中的方法

代码语言:javascript
复制
public interface UserMapper {
    public List<User> queryUsersByNameAndSex(User user);
}

UserMapper配置文件中的配置

代码语言:javascript
复制
<!-- 
    if语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
    select id,last_name lastName,sex  from t_user where 
    <!-- 我们希望动态的创建这个条件语句 -->
    <if test="lastName != null">
        last_name like concat('%',#{ lastName },'%')
    </if>
    <if test="sex == 0 or sex == 1">
        and sex = #{sex}
    </if>
</select>

测试代码:

代码语言:javascript
复制
@Test
public void testQueryUsersByNameAndSex() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);			  
        List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 1));			
        System.out.println(users);			
    } finally {
        session.close();
    }
}

执行的结果:

14.2、where 语句 说明: where语句,可以帮我们在多个动态语句中,有效的去掉前面的多余的and 或 or 之类的多余关键字

UserMapper配置文件

代码语言:javascript
复制
<!-- 
    where - if语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.atguigu.bean.User">
    select id,last_name lastName,sex  from t_user  
    <where>
        <!-- 我们希望动态的创建这个条件语句 -->
        <if test="lastName != null">
            last_name like concat('%',#{ lastName },'%')
        </if>
        <if test="sex == 0 or sex == 1">
            and sex = #{sex}
        </if>
    </where>
</select>

测试的代码是:

代码语言:javascript
复制
@Test
public void testQueryUsersByNameAndSex() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);			  
        List<User> users = userMapper.queryUsersByNameAndSex(new User(0, null, 1));			
        System.out.println(users);			
    } finally {
        session.close();
    }
}

测试的结果:

14.3、trim语句 说明: trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容 prefix 前面添加内容 suffix 后面添加内容 suffixOverrides 去掉的后面内容 prefixOverrides 去掉的前面内容

UserMapper配置文件中的内容

代码语言:javascript
复制
<!-- 
    trim - if 语句
 -->
<select id="queryUsersByNameAndSex" parameterType="com.bean.User" resultType="com.bean.User">
    select id,last_name lastName,sex  from t_user  
    <!-- 
        trim 可以动态在包含的语句前面和后面添加内容。也可以去掉前面或者后面给定的内容
            prefix 前面添加内容
            suffix 后面添加内容
            suffixOverrides 去掉的后面内容
            prefixOverrides 去掉的前面内容
     -->
    <trim prefix="where" suffixOverrides="and" prefixOverrides="">
        <!-- 我们希望动态的创建这个条件语句 -->
        <if test="lastName != null">
            last_name like concat('%',#{ lastName },'%') and
        </if>
        <if test="sex == 0 or sex == 1">
         	sex = #{sex}
        </if>
    </trim>
</select>

测试代码:

代码语言:javascript
复制
@Test
public void testQueryUsersByNameAndSex() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);			  
        List<User> users = userMapper.queryUsersByNameAndSex(new User(0, "dmi", 5));			
        System.out.println(users);			
    } finally {
        session.close();
    }
}

测试的结果:

14.4、choose( when , otherwise )语句 说明:choose when otherwise 可以执行多路选择判断,但是只会有一个分支会被执行。 类似switch case 语句

UserMapper接口中添加的方法:

代码语言:javascript
复制
public List<User> queryUsersByNameAndSexForChoose(User user);

UserMapper配置文件的内容:

代码语言:javascript
复制
<!-- 
    choose when otherwise 语句
    有点类似于switch case 多路判断。只执行一路。
 -->
<select id="queryUsersByNameAndSexForChoose" parameterType="com.bean.User" 
    resultType="com.bean.User">
    select id,last_name lastName,sex  from t_user  
    <where>
        <choose>
            <when test="id > 0">
                id = #{ id }
            </when>
            <when test="lastName != null">
                last_name = #{lastName}
            </when>
            <otherwise>
                1 = 1
            </otherwise>
        </choose>
    </where>		
</select>

测试的代码:

代码语言:javascript
复制
@Test
public void testQueryUsersByNameAndSexForChoose() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);
        List<User> users = userMapper.queryUsersByNameAndSexForChoose(new User(1, "admin", 0));
        System.out.println(users);
    } finally {
        session.close();
    }
}

测试的结果:

14.4、set语句 说明: set语句可以去掉,更新时候,set更新的多个列,由于动态生成的sql语句,而导致多出来的逗号

UserMapper中添加的方法 public int updateUserForSet(User user);

UserMapper配置文件中的内容:

代码语言:javascript
复制
<!-- 
    update语句
    set标签,可以去掉,多个列中的逗号
 -->
<update id="updateUserForSet" parameterType="com.bean.User">
    update t_user 
    <set>
        <if test="lastName != null">
            last_name = #{lastName},
        </if>
        <if test="sex == 0 or sex == 1">
            sex = #{sex}
        </if>
    </set>
    where id = #{id}
</update>

测试代码:

代码语言:javascript
复制
@Test
public void testUpdateUserForSet() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);
        userMapper.updateUserForSet(new User(3, "xxxx", 10));
        session.commit();
    } finally {
        session.close();
    }
}

测试结果:

14.5、foreach语句 说明: foreach语句,可以遍历输出一个集合的数据

在UserMapper中添加的方法

代码语言:javascript
复制
public List<User> queryUserByidsForIn(@Param("ids")List<Integer> ids);

UserMapper配置文件中的内容

代码语言:javascript
复制
<!-- 
    foreach语句可以遍历输出数据
        collection属性设置遍历的集合
        open 属性设置遍历输出前的内容
        close 属性设置遍历输出后的内容
        separator 属性设置每输出一个元素中间的间隔内容
        item 属性 当前正在遍历到的数据名
 -->
<select id="queryUserByidsForIn" resultType="com.bean.User">
    select id,last_name,sex from t_user
    where 
        id in 
    <foreach collection="ids" open="(" close=")" separator="," item="item_id">
        #{item_id}
    </foreach>
</select>

测试代码:

代码语言:javascript
复制
@Test
public void testQueryUserByidsForIn() {
    SqlSession session = sqlSessionFactory.openSession();
    try {
        UserMapper userMapper = session.getMapper(UserMapper.class);
        List<Integer> ids = new ArrayList<>();
        ids.add(3);
        ids.add(6);
        ids.add(7);			
        List<User> users = userMapper.queryUserByidsForIn( ids );
        System.out.println(users);
    } finally {
        session.close();
    }
}

测试结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档