Mybatis从小白到小黑(六)Mybatis动态Sql详解

简介: 动态sql简单来讲就是我们能通过条件的设置生成不同的sql,在Mybatis中主要学习四种表达式即可:

微信搜索《Java鱼仔》,你离大厂更近了


(一)概述


mybatis官方中文网站对动态Sql的教程:mybatis.org/mybatis-3/z…


动态sql简单来讲就是我们能通过条件的设置生成不同的sql,在Mybatis中主要学习四种表达式即可:


  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach


(二)If


动态sql中最常见的场景是根据条件查询,比如现在我要实现一个查询语句,当不传任何参数时查询所有用户,当传了id或者name时根据条件进行查询,我就可以这样写:



<selectid="SelectUserByMap"parameterType="map"resultType="map">    select * from user where 1=1
<iftest="id != null">        and id=#{id}
</if><iftest="name != null">        and name=#{name}
</if></select>

通过下面的方式进行查询

Map<String,String>map=newHashMap<String, String>();
map.put("id","1");
map.put("name","javayz");
List<User>users=mapper.SelectUserByMap(map);

当map中什么都不传时,sql语句变为:

select*from user where1=1

当传了id或name时,分别执行对应的语句。


你可能会奇怪我为什么要写一个1=1,这里后面会讲到。


(三)choose、when、otherwise


choose的使用很像Java中的switch语法,当满足第一个when条件时,就不去看后续的条件,如果条件都不满足,则执行otherwise:


<selectid="SelectUserByChoose"parameterType="map"resultType="com.javayz.pojo.User">    select * from user where 1=1
<choose><whentest="id != null">            and id=#{id}
</when><whentest="name != null">            and name=#{name}
</when><otherwise>            and 1=1
</otherwise></choose></select>

(四)trim、where、set


还记得我前面的语法中都写了where 1=1吗,至于为什么这样写,目的在于让语法能顺利执行,以if语句为例:如果不写1=1,语法就会变成下面这样

<selectid="SelectUserByMap"parameterType="map"resultType="map">    select * from user where
<iftest="id != null">        id=#{id}
</if><iftest="name != null">        and name=#{name}
</if></select>

这个时候如果满足了第一个if条件,那不会有问题,但是如果只满足第二个条件,语句就会变成:

select*from user whereand name=?

语法直接报错。


Mybatis提供了一种标签来代替1=1的写法,where标签只会在子元素返回任何内容的情况下才插入 “WHERE” 子句。而且,若子句的开头为 “AND” 或 “OR”,where 元素也会将它们去除。


因此上面的内容我可以改成:

<selectid="SelectUserByMap"parameterType="map"resultType="map">    select * from user
<where><iftest="id != null">            and id=#{id}
</if><iftest="name != null">            and name=#{name}
</if></where></select>

Set的实现和where类似,我们在更新时会用到set

<updateid="UpdateUser"parameterType="map">    update user
<set><iftest="name != null">name =#{name},</if></set>    where id = #{id}
</update>

使用where时会用自动去替换掉and或者or,而使用set时会动态地在行首插入 SET 关键字,并会删掉额外的逗号。


使用trim可以用于去除拼接sql时的and、or关键字或者逗号等等。


之前我们使用where标签去除了最开始的and关键字,用trim也同样可以实现:


<selectid="SelectUserByMap"parameterType="map"resultType="map">    select * from user
<trimprefix="where"prefixOverrides="and"><iftest="id != null">            and id=#{id}
</if><iftest="name != null">            and name=#{name}
</if></trim></select>

去除set末尾的逗号也可以使用trim

<trimprefix="SET"suffixOverrides=",">  ...
</trim>

(五)foreach


foreach在需要对集合进行遍历的场景中使用很广泛,尤其是在in语句中,下面我们来实现下面这条sql语句:


select*from user where id in(1,2,3,4)
<selectid="selectUserByForeach"parameterType="map"resultType="User">        select * from user where id in
<foreachcollection="ids"item="id"index="index"open="("separator=","close=")">                #{id}
</foreach></select>

(六)总结


至此,我们就把mybatis的动态sql学习完毕了,总体来讲动态Sql的使用并不算复杂,关键还是多练,孰能生巧。

相关文章
|
4月前
|
SQL Java 测试技术
3、Mybatis-Plus 自定义sql语句
这篇文章介绍了如何在Mybatis-Plus框架中使用自定义SQL语句进行数据库操作。内容包括文档结构、编写mapper文件、mapper.xml文件的解释说明、在mapper接口中定义方法、在mapper.xml文件中实现接口方法的SQL语句,以及如何在单元测试中测试自定义的SQL语句,并展示了测试结果。
3、Mybatis-Plus 自定义sql语句
|
1月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
21天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
2月前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
46 10
|
3月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
文章讲述了在使用Mybatis时遇到的资源文件找不到的问题,并提供了通过修改Maven配置来解决资源文件编译到target目录下的方法。
Mybatis系列之 Error parsing SQL Mapper Configuration. Could not find resource com/zyz/mybatis/mapper/
|
3月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
64 1
|
4月前
|
SQL Java 数据库连接
Mybatis系列之 动态SQL
文章详细介绍了Mybatis中的动态SQL用法,包括`<if>`、`<choose>`、`<when>`、`<otherwise>`、`<trim>`和`<foreach>`等元素的应用,并通过实际代码示例展示了如何根据不同条件动态生成SQL语句。
|
4月前
|
SQL 关系型数据库 MySQL
解决:Mybatis-plus向数据库插入数据的时候 报You have an error in your SQL syntax
该博客文章讨论了在使用Mybatis-Plus向数据库插入数据时遇到的一个常见问题:SQL语法错误。作者发现错误是由于数据库字段中使用了MySQL的关键字,导致SQL语句执行失败。解决方法是将这些关键字替换为其他字段名称,以避免语法错误。文章通过截图展示了具体的操作步骤。
|
4月前
|
SQL Java 关系型数据库
SpringBoot 系列之 MyBatis输出SQL日志
这篇文章介绍了如何在SpringBoot项目中通过MyBatis配置输出SQL日志,具体方法是在`application.yml`或`application.properties`中设置MyBatis的日志实现为`org.apache.ibatis.logging.stdout.StdOutImpl`来直接在控制台打印SQL日志。
SpringBoot 系列之 MyBatis输出SQL日志