MyBatis深入解读动态SQL的实现

目录
  • if和where
  • trim
  • Choose
  • Set
  • foreach

mybatis最强大的功能之一便是它的动态sql能力

借用官方文档的一段话 : 如果您以前有使用JDBC或者类似框架的 经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在 columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。

那么如果没有这种功能到底有多痛苦呢 ? 我们来举例说明

这是一张表 , 试想如果我们通过 name 和 age来查询表信息时 , sql语句中肯定会存在 where和and字句 , 但是如果 name或者age 有一个为null或者都为null , 那么此时的 where 和and就会被孤立,那么这样肯定会出现很多问题 , 所以mybatis的动态sql功能帮助我们完美解决

MyBatis 中用于实现动态 SQL 的元素主要有:

If   where   trim   set  choose(when, otherwise)   foreach

if和where

<select id="selectAllEmployee1" resultMap="employeeMap2" parameterType="Employee">
   SELECT e.id,e.name ename,e.age,d.name dname FROM employee e
      LEFT JOIN dept d ON e.deptId = d.id
<where>
    <if test="name!=null &amp; name!=''">
         e.name =#{name}
    </if>
    <if test="age!=null &amp; age!=''">
         and e.age =#{age}
    </if>
</where>
</select>

使用这种标签 , 动态sql可以根据 条件来自动帮我们完善sql

SqlSession sqlSession= MybatisUtil.getSqlSession();
EmployeeDao mapper=sqlSession.getMapper(EmployeeDao.class);
//创建一个对象,set值
Employee employee = new Employee();
employee.setName("");
employee.setAge(null);
List<Employee> employees = mapper.selectAllEmployee1(employee);
System.out.println(employees);
sqlSession.commit();
sqlSession.close();

第一次我们都设置null值, 表中数据完全被查询

第二次我们只查询年龄

employee.setName("");
employee.setAge(20);

查询到两条年龄为20的数据 , 这就是mybatis动态sql的强大之处

trim

上述的 where 与 if 我们也可以使用 trim 来代替where

<select id="selectAllEmployee1" resultMap="employeeMap2" parameterType="Employee">
     SELECT e.id,e.name ename,e.age,d.name dname FROM employee e
     LEFT JOIN dept d ON e.deptId = d.id
     <trim prefix="where" prefixOverrides="or|and">
        <if test="name!=null &amp; name!=''">
            e.name =#{name}
        </if>
        <if test="age!=null &amp; age!=''">
            and e.age =#{age}
        </if>
     </trim>
</select>

这里有两个属性 prefix , prefixOverrides

prefix : 代表前缀 , 如果if 中有成立的条件, 就会在sql前面拼入where字句

prefixOverrides :  根据if 条件自动判断是否去除 or | and字句

相应的也有suffix与suffixOverrides , 代表对尾部的判断

Choose

choose代表多路选择(多选一)

<select id="selectAllEmployee1" resultMap="employeeMap2" parameterType="Employee">
        SELECT e.id,e.name ename,e.age,d.name dname FROM employee e
        LEFT JOIN dept d ON e.deptId = d.id
        <trim prefix="where" prefixOverrides="or|and">
            <choose>
                <when test="name!=null &amp; name!=''">
                    and e.name =#{name}
                </when>
                <when test="age!=null">
                    and e.age =#{age}
                </when>
                <otherwise>
                    and e.name ='李雷'
                </otherwise>
            </choose>
        </trim>
    </select>

当<when>中的条件成立时, 走when中的语句,都不成立走<otherwise>

Set

set 可以根据条件自动添加set字句,动态更新列,也可以来剔除追加到条件末尾的任何不相关的逗号

<update id="updateEmployee">
        update employee
        <set>
            <if test="name!=null &amp; name!=''">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
        </set>
        where id=#{id}
    </update>

foreach

<foreach> 主要用在构建 in 条件中,它可以在 SQL 语句中进行迭代一个集合。foreach元素的属性主要有 item,index,collection,open,separator,close。 item 表示集合中每一个元素进行迭代时的别名,index 指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open 表示该语句以什么开始, separator 表示在每次进行迭代之间以什么符号作为分隔符,close 表示以什么结束,在使用 foreach 的时候最关键的也是最容易出错的就是 collection 属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的。

– 如果传入的是单参数且参数类型是一个 List 的时候,collection 属 性值为 list

– 如果传入的是单参数且参数类型是一个 array 数组的时候, collection 的属性值为array

//创建一个list集合
List<Integer> list = new ArrayList<>();
list.add(19);
list.add(20);
List<Employee> employees = mapper.selectAllEmployee2(list);

接口方法如下 :

  List<Employee> selectAllEmployee2(List<Integer> list);

对应动态sql如下 :

<select id="selectAllEmployee2" resultMap="employeeMap2" parameterType="Employee">
        SELECT e.id,e.name ename,e.age,d.name dname FROM employee e
        LEFT JOIN dept d ON e.deptId = d.id where age in
        <foreach collection="list" item="age" open="(" separator="," close=")">
             #{age}
        </foreach>
    </select>

这里我们传入的是一个集合, 所以参数选择 list , 通过foreach我们可以动态的根据集合里的值来查询

关于动态sql就介绍到这,感谢阅读 !

到此这篇关于MyBatis深入解读动态SQL的实现的文章就介绍到这了,更多相关MyBatis动态SQL内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MyBatis动态SQL如何实现前端指定返回字段

    目录 动态SQL实现前端指定返回字段 问题描述 解决方案 MyBatis如何返回部分字段 .xml文件中resultMap的type改为 第二种很笨的方法 动态SQL实现前端指定返回字段 问题描述 在使用ClickHouse时,遇到需要根据业务需求,动态返回指定字段,从而充分利用ClickHouse列式存储的优势. 解决方案 可用MyBatis的动态SQL进行数据返回:故可在业务层将指定返回的列传入数据层,利用foreach标签进行遍历返回数据. 代码实现 1.请求参数 @Data public

  • MyBatis 超详细讲解动态SQL的实现

    目录 情景: 概述: SQL元素: <if>: <choose>: <where>: <trim>: <set>: <foreach>: <bind>: 情景: 我们在使用JDBC或者其他类似的框架开发进行数据库开发时,通常要根据需求动手组装SQL,不用想都觉得是件很痛苦的事情了,而Mybatis框架提供的对SQL语句动态组装的功能,能很好地解决这个麻烦. 概述: 动态SQL是MyBatis框架的一个强大特性,MyBati

  • 关于Mybatis动态sql中test的坑点总结

    目录 总结Mybatis动态sql中test的坑 判断相等的注意点 判断字符是否相等 动态sql标签的小陷阱 下面先举个正常的例子 总结Mybatis动态sql中test的坑 在mybatis中要实现动态sql,重要方式就是使用test,通过其中表达式返回的true.false来达到动态sql的拼接.随着业务的复杂,test中的判断将会越来越复杂,所以熟悉test中细节处理对动态sql来说尤为重要. 判断相等的注意点 == 少打一个= 现在我们有一个Integer类型的参数typeId,需要当t

  • mybatis的动态SQL以及连接池详解

    目录 mybatis动态SQL及连接池 mybatis中的范围查询,in 连接池 动态sql与多表的连接查询 动态sql 多表的连接查询 小结 mybatis动态SQL及连接池 mybatis根据传入参数的不同来查询. <select id="findByCondition" parameterType="com.domain.User" resultType="com.domain.User">         select * f

  • MyBatis连接池的深入和动态SQL详解

    目录 一,Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.2 Mybatis 的事务控制 1.2.1 JDBC 中事务的回顾 1.2.2 Mybatis 中事务提交方式 1.2.3 Mybatis 自动提交事务的设置 二.Mybatis 的动态 SQL 语句 2.1 动态 SQL 之标签 2.1.1 持久层 Dao 接口 2.1.2 持久层 Dao 映射配置 2.1.3 测试 2.2

  • 一篇文章带你了解mybatis的动态SQL

    目录 1.动态SQL:if 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,otherwise) 语句 5.动态SQL:trim 语句 6.动态SQL: SQL 片段 7.动态SQL: foreach 语句 8.总结 1.动态SQL:if 语句 根据 username 和 sex 来查询数据.如果username为空,那么将只根据sex来查询:反之只根据username来查询 首先不使用 动态SQL 来书写 <select id="selectUserBy

  • MyBatis 详细讲解动态 SQL的使用

    目录 MyBatis 框架动态 SQL 环境准备 动态 SQL 之 if 动态 SQL 之 where 动态 SQL 之 foreach 动态 SQL 之代码片段 MyBatis 框架动态 SQL 动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接 SQL 语句.这里的条件判断使用的表达式为 OGNL 表达式.常用的动态 SQL 标签有<if>.<where>.<choose/>.<foreach>等. MyBatis 的动态 S

  • MyBatis深入解读动态SQL的实现

    目录 if和where trim Choose Set foreach mybatis最强大的功能之一便是它的动态sql能力 借用官方文档的一段话 : 如果您以前有使用JDBC或者类似框架的 经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在 columns列后面省略一个逗号等.动态语句能够完全解决掉这些痛苦. 那么如果没有这种功能到底有多痛苦呢 ? 我们来举例说明 这是一张表 , 试想如果我们通过 name 和 age来查询表信息时 , sql语句中肯定会存在

  • MyBatis实践之动态SQL及关联查询

    序言 MyBatis,大家都知道,半自动的ORM框架,原来叫ibatis,后来好像是10年apache软件基金组织把它托管给了goole code,就重新命名了MyBatis,功能相对以前更强大了.它相对全自动的持久层框架Hibernate,更加灵活,更轻量级,这点我还是深有体会的. MyBatis的一个强大特性之一就是动态SQL能力了,能省去我们很多串联判断拼接SQL的痛苦,根据项目而定,在一定的场合下使用,能大大减少程序的代码量和复杂程度,不过还是不是过度太过复杂的使用,以免不利于后期的维护

  • Mybatis中的动态SQL语句解析

    这篇文章主要介绍了Mybatis中的动态SQL语句解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Mybatis中配置SQL有两种方式,一种是利用xml 方式进行配置,一种是利用注解进行配置. Mybatis使用注解配置SQL,但是由于配置功能受限,而且对于复杂的SQL而言可读性很差,所以很少使用. Mybatis常用xml配置的方式,使用xml的几个简单的元素,便能完成动态SQL的功能,大量的判断都可以在mybaties的映射xml里面配

  • Mybatis配置文件之动态SQL配置备忘录

    动态参数拼接的查询语句 –传入参数类型为自定义数据类型 <select id="queryMessageList" parameterType="com.imooc.bean.Message" resultMap="MessageResult"> select ID,COMMAND,DESCRIPTION,CONTENT from MESSAGE where 1=1 <if test="command !=null &

  • MyBatis 详细讲解动态 SQL的使用

    目录 MyBatis 框架动态 SQL 环境准备 动态 SQL 之 if 动态 SQL 之 where 动态 SQL 之 foreach 动态 SQL 之代码片段 MyBatis 框架动态 SQL 动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接 SQL 语句.这里的条件判断使用的表达式为 OGNL 表达式.常用的动态 SQL 标签有<if>.<where>.<choose/>.<foreach>等. MyBatis 的动态 S

  • Mybatis详解动态SQL以及单表多表查询的应用

    目录 单表查询操作 参数占位符#{}和${} SQL 注入 like模糊查询 多表查询操作 一对一多表查询 一对多多表查询 动态SQL使用 if标签 trim标签 where标签 set标签 foreach标签 单表查询操作 参数占位符#{}和${} #{}:相当于JDBC里面替换占位符的操作方式(#{}->“”).相当于预编译处理(预编译处理可以防止SQL注入问题) ${}:相当于直接替换(desc这种关键字),但这种不能预防SQL注入 select * from userinfo where

  • 详解Java的MyBatis框架中动态SQL的基本用法

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql.下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的select

  • mybatis教程之动态sql语句_动力节点Java学院整理

    有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息.使用Oracle的序列.mysql的函数生成Id.这时我们可以使用动态sql. 下文均采用mysql语法和函数(例如字符串链接函数CONCAT). selectKey 标签 在insert语句中,在Oracle经常使用序列.在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键.使用myBatis的selec

  • MyBatis解决Update动态SQL逗号的问题

    目录 Update动态SQL逗号问题 解决办法 Mapper(Update)逗号位置 Update动态SQL逗号问题 最做项目遇到以下情况,MyBatis中需要动态拼接Update,由于之前忙着赶项目,就直接照着下面的这样写,结果发现系统出现了异常,原来这样写如果 id=null就会出错 UPDATE     TABLE          SET           <if test="id!=null">         id= #{id,jdbcType=INTEGER

随机推荐