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语句的全部内容。


相关文章
|
SQL Java 数据库连接
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
【YashanDB知识库】解决mybatis的mapper文件sql语句结尾加分号";"报错
|
8月前
|
SQL XML Java
通过MyBatis的XML配置实现灵活的动态SQL查询
总结而言,通过MyBatis的XML配置实现灵活的动态SQL查询,可以让开发者以声明式的方式构建SQL语句,既保证了SQL操作的灵活性,又简化了代码的复杂度。这种方式可以显著提高数据库操作的效率和代码的可维护性。
486 18
|
SQL Java 数据库连接
MyBatis动态SQL字符串空值判断,这个细节99%的程序员都踩过坑!
本文深入探讨了MyBatis动态SQL中字符串参数判空的常见问题。通过具体案例分析,对比了`name != null and name != &#39;&#39;`与`name != null and name != &#39; &#39;`两种写法的差异,指出后者可能引发逻辑混乱。为避免此类问题,建议在后端对参数进行预处理(如trim去空格),简化MyBatis判断逻辑,提升代码健壮性与可维护性。细节决定成败,严谨处理参数判空是写出高质量代码的关键。
1595 0
|
8月前
|
SQL Java 数据库连接
SSM相关问题-1--#{}和${}有什么区别吗?--Mybatis都有哪些动态sql?能简述一下动 态sql的执行原理吗?--Spring支持的几种bean的作用域 Scope
在MyBatis中,`#{}`是预处理占位符,可防止SQL注入,适用于大多数参数传递场景;而`${}`是直接字符串替换,不安全,仅用于动态表名、列名等特殊场景。二者在安全性、性能及使用场景上有显著区别。
324 0
|
11月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
1059 5
|
SQL Java 数据库连接
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
【YashanDB 知识库】解决 mybatis 的 mapper 文件 sql 语句结尾加分号";"报错
|
SQL 缓存 Java
框架源码私享笔记(02)Mybatis核心框架原理 | 一条SQL透析核心组件功能特性
本文详细解构了MyBatis的工作机制,包括解析配置、创建连接、执行SQL、结果封装和关闭连接等步骤。文章还介绍了MyBatis的五大核心功能特性:支持动态SQL、缓存机制(一级和二级缓存)、插件扩展、延迟加载和SQL注解,帮助读者深入了解其高效灵活的设计理念。
|
SQL XML Java
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
六、MyBatis特殊的SQL:模糊查询、动态设置表名、校验名称唯一性
448 0
|
SQL 存储 缓存
一文搞懂MySQL中一条SQL语句是如何执行的
一文搞懂MySQL中一条SQL语句是如何执行的
|
存储 SQL 缓存
【Mysql】执行sql语句后,mysql都做了什么?
【Mysql】执行sql语句后,mysql都做了什么?
【Mysql】执行sql语句后,mysql都做了什么?
下一篇
开通oss服务