Mybatis常见查询操作——SQL语句的拼接

叁歲伎倆 2023-09-26 10:47 203阅读 0赞

1、什么是动态SQL?

官网描述:
  MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。
  虽然在以前使用动态 SQL 并非一件易事,但正是 MyBatis 提供了可以被用在任意 SQL 映射语句中的强大的动态 SQL 语言得以改进这种情形。
   动态 SQL 元素和 JSTL 或基于类似 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多元素需要花时间了解。MyBatis 3 大大精简了元素种类,现在只需学习原来一半的元素便可。MyBatis 采用功能强大的基于 OGNL 的表达式来淘汰其它大部分元素。

简单理解:

  动态SQL就是能根据不同的查询条件,生成不同的SQL语句。

2、动态SQL主要包含哪些方面的知识呢?

对于我们初级程序员来说,只要掌握了if、choose、trim、where、when、set、foreach、otherwise等常见的标签,我们就基本能解决80%的sql问题。下面我们就通过案例说明婴喜爱这些标签该如何使用。

(1)if 标签

if 标签的使用一般是要配合test使用的。
常见的应用环境,一般是修改或者是查询条件的拼接,但是如果是查询条件的拼接的话,一定是要和where标签进行配合使用的。
(a)mapper层:

  1. //根据if标签来进行查询条件的拼装
  2. User2 queryByIf(HashMap map);

(b)xml配置

  1. <select id="queryByIf" resultType="com.swagger.swaggerdemo1.Pojo.User2">
  2. select * from user2
  3. <where>
  4. <if test="id != null">
  5. id = #{
  6. id}
  7. </if>
  8. <if test="name != null">
  9. and name = #{
  10. name}
  11. </if>
  12. </where>
  13. </select>

(c)测试

  1. @Test
  2. public void queryByIf(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. map.put("id",1);
  5. map.put("name","小明");
  6. User2 user2 = userMapper.queryByIf(map);
  7. System.out.println(user2);
  8. }

在这里插入图片描述

注意注意:

在这里插入图片描述

  因此,如果查询参数只有一个可以忽略where标签,但是如果查询参数超过一个,那么就必须借助于where标签来进行判断,然后不要忘记加and。

(2)set标签

其实set标签与where标签出奇的一致,因为他俩的用法逻辑是一模一样的,但是,重点是他俩的格式不一样,where标签是用and标签进行连接的,set则是通过逗号来接性连接的。而且查询语句和更新语句的返回值是不一样的,在写mapper层的时候需要注意一下。

(a) mapper层:

  1. //利用set标签进行更新操作
  2. Integer updateBySet(HashMap map);

(b)xml层

  1. <update id="updateBySet">
  2. update user2
  3. <set>
  4. <if test="tid != null">
  5. tid = #{
  6. tid},
  7. </if>
  8. <if test="name != null">
  9. name = #{
  10. name}
  11. </if>
  12. </set>
  13. <where>
  14. <if test="id != null">
  15. id = #{
  16. id}
  17. </if>
  18. </where>
  19. </update>

(c)测试:

  1. @Test
  2. public void updateBySet(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. map.put("id",1);
  5. map.put("name","小改");
  6. Integer integer = userMapper.updateBySet(map);
  7. System.out.println(integer);
  8. }

在这里插入图片描述

修改之前:

在这里插入图片描述

修改之后:

在这里插入图片描述
再次提醒注意:
在这里插入图片描述

(3)SQL片段重复利用

有时候可能某个 sql 语句我们用的特别多,为了增加代码的重用性,简化代码,我们需要将这些代码抽取出来,然后使用时直接调用。
在这之中只要是依靠 sql 标签和 include 标签来实现。其实说起来感觉云里雾里,举个例子就啥都明白了。
(a)mapper层:

  1. //利用公共代码块进行查询操作
  2. User2 queryByCommonSQL(HashMap map);

(b)xml配置:

  1. <sql id="CommonSQL">
  2. select * from user2
  3. </sql>
  4. <select id="queryByCommonSQL" resultType="com.swagger.swaggerdemo1.Pojo.User2">
  5. <include refid="CommonSQL"></include>
  6. <where>
  7. <if test="id != null">
  8. id = #{
  9. id}
  10. </if>
  11. <if test="name != null">
  12. and name = #{
  13. name}
  14. </if>
  15. </where>
  16. </select>

(c)测试层:

  1. @Test
  2. public void queryByCommonSQL(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. map.put("id",1);
  5. map.put("name","小改");
  6. User2 user2 = userMapper.queryByCommonSQL(map);
  7. System.out.println(user2);
  8. }

在这里插入图片描述

(4)foreach遍历

在这里插入图片描述

(a)mapper层:

  1. //利用foreach进行循环查询
  2. List<User2> queryByForeach(@Param("ids") List list);

(b)xml层:

  1. <select id="queryByForeach" resultType="com.swagger.swaggerdemo1.Pojo.User2">
  2. select * from user2
  3. <where>
  4. <foreach collection="ids" item="id" open="and (" close=")" separator="or">
  5. id = #{
  6. id}
  7. </foreach>
  8. </where>
  9. </select>

(c)测试:

  1. @Test
  2. public void queryByForeach(){
  3. ArrayList<Integer> list = new ArrayList<>();
  4. list.add(1);
  5. list.add(2);
  6. List<User2> user2 = userMapper.queryByForeach(list);
  7. user2.forEach(System.out :: println);
  8. }

在这里插入图片描述

补充:
foreach标签中的collection参数的理解:

在这里其实把collection理解为集合类型,或者向我上边举的例子一样,通过@param指定集合名字也可以,当我们将collection理解为集合类型的时候,我们就不需要借助于@param参数了。在这里给大家举两个例子,一个是传递参数类型为数组类型,另外传递参数为集合类型。

—————————————————————————————————批量删除:———————————————————————————————————-
(a)mapper层:

  1. public int BatchDelete(Integer[] ids);

(b)xml层:

  1. <delete id="BatchDelete">
  2. delete from tbl_user02 where id in
  3. <foreach collection="array" item="id" open="(" close=")" separator=",">
  4. #{
  5. id}
  6. </foreach>
  7. </delete>

(c)测试层:

  1. Integer[] ids = {
  2. 1,3,5};
  3. int row = userDao.BatchDelete(ids);

—————————————————————————————————批量添加:———————————————————————————————————-

(a)mapper层:

  1. public int batchAdd(List<User> users);

(b)xml层:

  1. <!--注意 因为循环添加的为一个对象 所以下面添加的值就必须是users.name ...-->
  2. <insert id="batchAdd">
  3. insert into tbl_user02(name,pwd,email) values
  4. <foreach collection="list" item="users" separator=",">
  5. (#{
  6. users.name},#{
  7. users.pwd},#{
  8. users.email})
  9. </foreach>
  10. </insert>

(c)测试层:

  1. List<User> list = new ArrayList<User>();
  2. list.add(new User("张三","123","zs@qq.com"));
  3. list.add(new User("李四","123","ls@qq.com"));
  4. list.add(new User("王五","123","ww@qq.com"));
  5. int row = userDao.batchAdd(list);

(5)choose标签

choose 标签作用是通过条件判断来拼接 SQL 语句,类似于 Java 中的 switch 语句,从上到下,当有匹配的条件时,跳出 choose 语句;如果所有条件都不成立则执行 otherwise 标签中的内容。

在使用choose标签的时候要配合when标签、otherwise标签。

使用细节:当有条件成立时,就不会继续执行了。

(a)mapper层:

  1. //利用choose进行查询
  2. List<User2> queryByChoose(HashMap map);

(b)xml层:

  1. <select id="queryByChoose" resultType="com.swagger.swaggerdemo1.Pojo.User2">
  2. select * from user2
  3. <where>
  4. <choose>
  5. <when test="id != null">
  6. id = #{
  7. id}
  8. </when>
  9. <when test="name != null">
  10. and name = #{
  11. name}
  12. </when>
  13. <when test="tid != null">
  14. and tid = #{
  15. tid}
  16. </when>
  17. <otherwise>
  18. and 1 = 1
  19. </otherwise>
  20. </choose>
  21. </where>
  22. </select>

(c)测试:这里我进行了三次测试,帮助大家理解choose标签的当有条件成立时,就不会继续执行了。

第一次测试:

  1. @Test
  2. public void queryByChoose(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. map.put("id",1);
  5. map.put("name","小改");
  6. List<User2> user2 = userMapper.queryByChoose(map);
  7. user2.forEach(System.out :: println);
  8. }

在这里插入图片描述

第二次测试:

  1. @Test
  2. public void queryByChoose(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. // map.put("id",1);
  5. map.put("name","小改");
  6. List<User2> user2 = userMapper.queryByChoose(map);
  7. user2.forEach(System.out :: println);
  8. }

在这里插入图片描述

第三次测试

  1. @Test
  2. public void queryByChoose(){
  3. HashMap<String, Object> map = new HashMap<>();
  4. // map.put("id",1);
  5. // map.put("name","小改");
  6. List<User2> user2 = userMapper.queryByChoose(map);
  7. user2.forEach(System.out :: println);
  8. }

在这里插入图片描述

如果你能把我三篇Mybatis基础博客看完,并且能自己建立几张数据表进行练习一下啊,我认为你应该能写出70%的sql,你已经满足一个初级程序员的条件了,恭喜恭喜!!!

第一篇:Mybatis常见查询总结,仅限于初级程序员阅读

https://blog.csdn.net/weixin\_43388691/article/details/127211492?spm=1001.2014.3001.5501

第二篇:Mybatis常见查询操作——mybatis parameterType 传入多个参数

https://blog.csdn.net/weixin\_43388691/article/details/127230219?spm=1001.2014.3001.5501

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,203人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SQL查询操作语句

    近来在写SQL,发现能写一些复杂的SQL可以很大的提高工作的效率。今天趁着有时间整理一下,方便以后用到的时候查询: 1、对特定的条件加和操作 select sum(

    相关 Mybatis动态拼接sql

    Mybatis动态拼接sql 需求:查询某张表时条件不确定,可能有一个,可能有多个,也可能没有条件 <!-- 动态sql --> <select id="