Mybatis的动态SQL语句

简介: Mybatis的动态SQL语句

项目目录

1.png


动态 SQL 之if标签


持久层 Dao 接口


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

持久层 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>

测试代码

/**
 * 根据条件查询 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);
    }
}

测试结果:

2.png


动态 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>

效果和上面的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;
    }
}

持久层 Dao 接口

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

持久层 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);
    }
}

测试结果:

3.png


Mybatis中简化编写的 SQL 片段


Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。

这样可以简化我们每次都需要在sql语句中写的select * from user。


定义代码片段


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

注意细节:在抽取重复的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语句的全部内容。


相关文章
|
4天前
|
SQL XML Java
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
mybatis 调用修改SQL时 出现了一个问题 没有修改成功也没有报错
13 0
|
1月前
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
Mybatis+mysql动态分页查询数据案例——测试类HouseDaoMybatisImplTest)
21 1
|
1月前
|
Java 关系型数据库 数据库连接
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
Mybatis+MySQL动态分页查询数据经典案例(含代码以及测试)
28 1
|
1月前
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
Mybatis+mysql动态分页查询数据案例——条件类(HouseCondition)
15 1
|
1月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
23 1
|
1月前
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
Mybatis+mysql动态分页查询数据案例——房屋信息的实现类(HouseDaoMybatisImpl)
22 2
|
1月前
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
Mybatis+mysql动态分页查询数据案例——工具类(MybatisUtil.java)
15 1
|
18天前
|
Java 关系型数据库 MySQL
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
【mybatis-plus】自定义多数据源,动态切换数据源事务失效问题
|
1月前
|
Java 数据库连接 mybatis
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
Mybatis+mysql动态分页查询数据案例——Mybatis的配置文件(mybatis-config.xml)
20 1
|
1月前
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
Mybatis+mysql动态分页查询数据案例——配置映射文件(HouseDaoMapper.xml)
15 1