Mybatis的动态SQL语句

举报
dfsafdfas 发表于 2021/02/13 15:40:56 2021/02/13
【摘要】 项目目录动态 SQL 之if标签持久层 Dao 接口/** * 根据传入的参数条件 * @param user 查询的条件,有可能有用户名 ,性别,或都没有 * @return */List<User> finduserCondition(User user);123456持久层 Dao 映射配置<!--根据条件查询--><select id="finduserCondition" resu...

项目目录

在这里插入图片描述

动态 SQL 之if标签

持久层 Dao 接口

/**
 * 根据传入的参数条件
 * @param user 查询的条件,有可能有用户名 ,性别,或都没有
 * @return
 */
List<User> finduserCondition(User user);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

持久层 Dao 映射配置

<!--根据条件查询-->
<select id="finduserCondition" resultMap="userMap" parameterType="user">
    select * from user where 1=1
    <if test="userName != null">
        and username = #{userName}
    </if>
    <if test="userSex != null">
        and sex = #{userSex}
    </if>
</select>
  • 10

测试代码

/**
 * 根据条件查询 if标签
 * @throws Exception
 */
@Test
public void testfinduserCondition() throws Exception {

    User u = new User();
    u.setUserName("老王");
    u.setUserSex("男");
    //5.使用代理对象执行方法
    List<User> users = userDao.finduserCondition(u);
    for (User user : users) {
        System.out.println(user);
    }

}

17

测试结果:
在这里插入图片描述

动态 SQL 之where标签

为了简化上面 where 1=1 的条件拼装,我们可以采用<where>标签来简化开发。

持久层 Dao 映射配置

<select id="finduserCondition" resultMap="userMap" parameterType="user">
    select * from user
    <where>
        <if test="userName != null">
            and username = #{userName}
        </if>
        <if test="userSex != null">
            and sex = #{userSex}
        </if>
    </where>
</select>
  • 11

效果和上面的if标签一样

动态 SQL 之foreach标签

需求

传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND (id =10 OR id =19 OR id=36)
SELECT * FROM USERS WHERE username LIKE ‘%王%’ AND id IN (10,19,36)

这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。

在 QueryVo 中加入一个 List 集合用于封装参数

QueryVo:

package com.keafmd.domain;

import java.util.List;

/**
 * Keafmd
 *
 * @ClassName: QueryVo
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-02-08 21:08
 */
public class QueryVo {
    private  User user;
    private List<Integer> ids;

    public List<Integer> getIds() {
        return ids;
    }

    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}
  • 32

持久层 Dao 接口

/**
 * 根据QueryVo中提供的id集合查询
 * @param vo
 * @return
 */
List<User> findUserInIds(QueryVo vo);
  • 6

持久层 Dao 映射配置

<!--根据QueryVo中的id集合实现查询查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
    <include refid="defaultUser"></include>
    <where>
        <if test="ids!=null and ids.size()>0">
            <foreach collection="ids" open = "and id in (" close=")" item="uid" separator=",">
                #{uid}
            </foreach>

        </if>
    </where>
</select>

测试代码

@Test
public void testfindUserInIds() throws Exception {

    QueryVo vo = new QueryVo();
    List<Integer> list = new ArrayList<Integer>();
    list.add(41);
    list.add(42);
    list.add(50);
    vo.setIds(list);

    //5.使用代理对象执行方法
    List<User> users = userDao.findUserInIds(vo);
    for (User user : users) {
        System.out.println(user);
    }

}
  • 217

测试结果:
在这里插入图片描述

Mybatis中简化编写的 SQL 片段

Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
这样可以简化我们每次都需要在sql语句中写的select * from user

定义代码片段

<!--了解的内容,抽取重复的sql语句-->
<sql id="defaultUser">
    select * from user
</sql>
  • 4

注意细节:在抽取重复的sql语句尽量不要写分号;,因为可能还会和后面的sql语句进行拼接,有分号就会导致报错。

引用代码片段

<!--配置查询所有-->
<select id="findAll" resultMap="userMap">
    <include refid="defaultUser"></include>
</select>

<!--根据QueryVo中的id集合实现查询查询用户列表-->
<select id="findUserInIds" resultMap="userMap" parameterType="queryvo">
     <include refid="defaultUser"></include>
     <where>
         <if test="ids!=null and ids.size()>0">
             <foreach collection="ids" open = "and id in (" close=")" item="uid" separator=",">
                 #{uid}
             </foreach>

         </if>
     </where>
</select>

以上就是Mybatis的动态SQL语句的全部内容。

看完如果对你有帮助,感谢点赞支持!
如果你是电脑端的话,看到右下角的 “一键三连” 了吗,没错点它[哈哈]

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。