专栏名称: 牛哄哄的柯南
目录
相关文章推荐
今天看啥  ›  专栏  ›  牛哄哄的柯南

Mybatis的动态SQL语句

牛哄哄的柯南  · CSDN  ·  · 2021-02-12 22:15

项目目录

在这里插入图片描述

动态 SQL 之if标签

持久层 Dao 接口

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

持久层 Dao 接口

/**
 * 根据QueryVo中提供的id集合查询
 * @param vo
 * @return
 */
List<User> findUserInIds(QueryVo vo);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

测试代码

@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);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

Mybatis中简化编写的 SQL 片段

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

定义代码片段

<!--了解的内容,抽取重复的sql语句-->
<sql id="defaultUser">
    select * from user
</sql>
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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

在这里插入图片描述

加油!

共同努力!

Keafmd




原文地址:访问原文地址
快照地址: 访问文章快照