Java-Mybatis动态SQL整理

SQL映射文件的几个顶级元素:

  • cache – 该命名空间的缓存配置
  • cache-ref – 引用其他命名空间的缓存配置
  • resultMap – 描述如何从数据库结果集中加载对象
  • sql – 可被其他语句引用的可重用语句块
  • insert – 增
  • update – 改
  • delete – 删
  • select – 查

select属性

属性 描述

标识符,与Mapper中对应方法的方法名一致

传入这条语句的参数的类全限定名或别名

返回结果的类全限定名或别名,如果返回的是集合,应设置为集合包含的类型而不是集合本身的类型。resultType和resultMap之间只能使用一个

对外部resultMap的命名引用,结果映射是Mybatis的最强大的特性

sql

sql元素可以用来定义可重用的SQL代码片段,以便在其他语句中使用。参数可以静态地(加载的时候)确定下来并且可以在不同的include元素中定义不同的参数值

常用在include元素的refid属性或内部语句中使用属性值


    ${preifx}Table

    FROM

    SELECT
        field1,field2,field3

ResultMap


1)改造实体类:

2)编写resultMap:

    ...

        ...

3)调用实例:

    SELECT
    o.id,
    o.user_id,
    o.number,
    o.createtime,
    o.note,
    u.username,
    u.address
    FROM
    order o
    LEFT JOIN user u ON o.user_id = u.id


1)改造实体类:
    添加订单集合属性,如:List< Order > orders

2)编写resultMap:

3)调用实例:

    SELECT
    u.id,
    u.username,
    u.birthday,
    u.sex,
    u.address,
    o.id oid,
    o.number,
    o.createtime,
    o.note
    FROM
    user u
    LEFT JOIN order o ON u.id = o.user_id

主要介绍Mybatis提供的几种用于实现动态SQL的标签的基本使用方式:

  • if
  • choose、when、otherwise
  • trim、where、set
  • foreach

if 语句提供了可选的查找文本功能

若 if 中条件成立,则执行 if 标签中的语句,拼接至SQL语句中

若 if 中条件不成立,则忽略,举个栗子:


    SELECT * FROM BLOG
    WHERE state = 'ACTIVE'

        AND title like #{title}

        AND author_name like #{author.name}

choose、when、otherwise

Mybatis提供的choose元素,类似Java的switch语句,可从多个条件中选择一个使用

举个栗子:传入了”title”就按”title”查找,传入了”author”就按”author”查找的情形。

若两者都没有传入,就返回标记为featured=1的BLOG(若多个条件满足则遵循就近原则)


    SELECT * FROM BLOG
    WHERE state = 'ACTIVE'

            AND title like #{title}

            AND author_name like #{author.name}

            AND featured = 1

trim、where、set

如何将上例中的”state=’ACTIVE'”条件设置为动态条件,即WHERE标签


    SELECT * FROM BLOG
    WHERE

        state = #{state}

        AND title like #{title}

        AND author_name like #{author.name}

按上面所写,如果没有匹配的条件,SQL会变成:

SELECT * FROM BLOG
WHERE

导致查询失败。如果匹配的只是第二/三个条件,SQL会变成:

SELECT * FROM BLOG
WHERE
AND title like 'title'

从上例可看出 WHERE 语句后的第一个条件想要实现动态SQL不能简单使用条件元素来解决,对此可以使用Mybatis提供的where元素


    SELECT * FROM BLOG

        state = #{state}

        AND title like #{title}

        AND author_name like #{author.name}

where元素只会在子元素返回任何内容的情况下才插入”WHERE”子句。并且若子句的开头为”AND”或”OR”,where元素也会将它们去除

用于动态更新语句的类似解决方案叫set。set元素可以用于动态包含需要更新的列,忽略其他不更新的列,比如:


    UPDATE Author

        username=#{username},

        password=#{password},

        email=#{email},

        bio=#{bio}

    where id = #{id}

如果选择的元素与你期望的不大一样,可以通过自定义trim元素来制定元素的功能,比如:

where标签:


    ...

set标签:


    ...

prefix:前缀

prefixOverrides:前缀覆盖,忽略通过管道符分隔的文本序列

suffixOverrides:后缀覆盖,覆盖了后缀值的设置

foreach

动态SQL的另一个常见使用场景是对集合进行遍历(尤其是在构建IN条件语句的时候)


    SELECT *
    FROM POST P
    WHERE ID in

        #{item}

可以将任何可迭代对象(List, Set)、Map或数组对象作为集合参数传递给foreach。当使用可迭代对象或者数组时,index是当前迭代的序号,item的值是本次迭代获取到的元素。使用Map对象时,index是key,item是value

Original: https://www.cnblogs.com/torima/p/15151210.html
Author: Tttori
Title: Java-Mybatis动态SQL整理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/588961/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • web项目访问引用jar内部的静态资源

    一、实现原理 在Servlet3协议规范中,包含在JAR文件 /META-INFO/resources/路径下的资源可以直接访问。 二、举例说明 如下图所示,是我新建的一个Spri…

    Java 2023年6月15日
    083
  • 复试-英语自我介绍-模板参考

    英语自我介绍模板,我没用到……分享给网友。 Good morning, my distinguished professors. It’s my…

    Java 2023年6月5日
    084
  • PHP生成图形验证码

    在建站过程中,很多时候都会需要用户验证验证码等操作,比如:注册、登录、发表评论、获取资源等等,一方面可以验证当前用户的行为是否是爬虫、机器人等情况,给网站数据统计产生影响;另一方面…

    Java 2023年6月10日
    076
  • 理解Java BlockingQueue

    数据结构与算法是天生一对。 BlockingQueue叫做阻塞队列,在Java线程池相关的实现中有广泛的使用。 BlockingQueue实现的功能如下: 当队列为空时,往队列中读…

    Java 2023年5月29日
    080
  • Golang实现二维数组的排序

    一、通常的实现方法 实现sort.Interface接口中的3个方法:Len方法、Less方法以及Swap方法,即可通过调用sort包中的Sort方法实现结构体数组的排序。(二维数…

    Java 2023年6月13日
    068
  • Spring Boot 通过RestTemplat返回pdf转图片

    Springboot 通过 RestTemplat 返回 pdf转图片 开发环境: java 8 spring boot 2.x 前后端分离 需求:前端发送pdf文件路径来,后端获…

    Java 2023年6月5日
    060
  • .net 使用Docker开发

    .NET多年以前已经开始支持Docker,但由于国内.net现状,生产过程中几乎用不到docker支持,趁着有点时间捣鼓下~。 先期工作 1、首先安装 Docker Desktop…

    Java 2023年6月9日
    042
  • JAXB 使用记录

    参考资料 什么是 JAXB ? 开源中国: JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表…

    Java 2023年6月9日
    083
  • eslint关闭配置–vue-webpack

    javascript;gutter:true;devServer: { overlay: { warnings: false, errors: false } }, lintOnS…

    Java 2023年5月29日
    071
  • FaaS 基于多租户技术 SaaS平台设计

    多租户技术(英语:multi-tenancy technology)或称多重租赁 技术,是一种软件架构 技术,它是在探讨与实现如何于 多用户的环境下共用相同的系统或程序组件,并且仍…

    Java 2023年5月29日
    082
  • Spring bean的作用域

    The scope of this bean: typically "singleton" (one shared instance, which will b…

    Java 2023年5月30日
    068
  • Arrays.asList()你真的知道怎么用吗?

    发现问题 前几天在看别人的项目的时候,发现一个问题,简单复现一下这个问题 // 注意这是一个Integer对象的数组哦 Integer[] arr = new Integer[]{…

    Java 2023年6月16日
    067
  • 【万字图文-原创】 | 学会Java中的线程池,这一篇也许就够了!

    碎碎念 关于JDK源码相关的文章这已经是第四篇了,原创不易,粉丝从几十人到昨天的 666人,真的很感谢之前帮我转发文章的一些朋友们。 从16年开始写技术文章,到现在博客园已经发表了…

    Java 2023年5月29日
    087
  • 利用JVM钩子函数优雅关闭线程池

    核心API: shutDown shutDownNow awaitTermination 利用JVM钩子函数,在虚拟机关闭时调用相关方法即”优雅关闭线程池”…

    Java 2023年6月6日
    090
  • Spring boot 定时器

    Timer:是java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务,使用这种方式可以让程序按照某一个频度执行,但不能在指定时…

    Java 2023年5月30日
    072
  • MySQL之SQL语句优化

    即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行。 移除不必要的括号 select * from x where ((a = 5)); 上面…

    Java 2023年6月16日
    055
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球