Mybatis SQL构建器类 - SQL类

下面是一些例子:

// Anonymous inner class
public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}// Builder / Fluent style
public String insertPersonSql() {String sql = new SQL().INSERT_INTO("PERSON").VALUES("ID, FIRST_NAME", "#{id}, #{firstName}").VALUES("LAST_NAME", "#{lastName}").toString();return sql;
}// With conditionals (note the final parameters, required for the anonymous inner class to access them)
public String selectPersonLike(final String id, final String firstName, final String lastName) {return new SQL() {{SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");FROM("PERSON P");if (id != null) {WHERE("P.ID like #{id}");}if (firstName != null) {WHERE("P.FIRST_NAME like #{firstName}");}if (lastName != null) {WHERE("P.LAST_NAME like #{lastName}");}ORDER_BY("P.LAST_NAME");}}.toString();
}public String deletePersonSql() {return new SQL() {{DELETE_FROM("PERSON");WHERE("ID = #{id}");}}.toString();
}public String insertPersonSql() {return new SQL() {{INSERT_INTO("PERSON");VALUES("ID, FIRST_NAME", "#{id}, #{firstName}");VALUES("LAST_NAME", "#{lastName}");}}.toString();
}public String updatePersonSql() {return new SQL() {{UPDATE("PERSON");SET("FIRST_NAME = #{firstName}");WHERE("ID = #{id}");}}.toString();
}
Method(方法)Description(描述)
  • SELECT(String)
  • SELECT(String...)
开始或追加一个`SELECT`子句。可以多次调用此方法,参数将追加到`SELECT`子句中。这些参数通常是逗号分隔的列和别名列表,但也可以是驱动程序接受的任何内容。
  • SELECT_DISTINCT(String)
  • SELECT_DISTINCT(String...)
开始或追加一个`SELECT`子句,并在生成的查询中添加`DISTINCT`关键字。可以多次调用此方法,参数将追加到`SELECT`子句中。这些参数通常是逗号分隔的列和别名列表,但也可以是驱动程序接受的任何内容。
  • FROM(String)
  • FROM(String...)
开始或追加一个`FROM`子句。可以多次调用此方法,参数将追加到`FROM`子句中。参数通常是表名和别名,或者是驱动程序接受的任何内容。
  • JOIN(String)
  • JOIN(String...)
  • INNER_JOIN(String)
  • INNER_JOIN(String...)
  • LEFT_OUTER_JOIN(String)
  • LEFT_OUTER_JOIN(String...)
  • RIGHT_OUTER_JOIN(String)
  • RIGHT_OUTER_JOIN(String...)
根据调用的方法,添加一个适当类型的新的`JOIN`子句。参数可以包括由列和连接条件组成的标准联接。
  • WHERE(String)
  • WHERE(String...)
追加一个新的`WHERE`子句条件,使用AND进行连接。可以多次调用此方法,每次都会将新的条件与AND进行连接。使用`OR()`可以用OR进行分隔。
OR()用OR将当前的`WHERE`子句条件进行拆分。可以多次调用,但连续多次调用会生成不可预测的SQL语句。
AND()用AND将当前的`WHERE`子句条件进行拆分。可以多次调用,但连续多次调用会生成不可预测的SQL语句。由于`WHERE`和`HAVING`都会自动使用AND进行连接,所以这个方法很少使用,实际上只是为了完整性而包含在内。
  • GROUP_BY(String)
  • GROUP_BY(String...)
追加一个新的`GROUP BY`子句元素,使用逗号进行连接。可以多次调用此方法,每次都会将新的条件与逗号进行连接。
  • HAVING(String)
  • HAVING(String...)
追加一个新的`HAVING`子句条件,使用AND进行连接。可以多次调用此方法,每次都会将新的条件与AND进行连接。使用`OR()`可以用OR进行分隔。
  • ORDER_BY(String)
  • ORDER_BY(String...)
追加一个新的`ORDER BY`子句元素,使用逗号进行连接。可以多次调用此方法,每次都会将新的条件与逗号进行连接。
  • LIMIT(String)
  • LIMIT(int)
追加一个 ​LIMIT​子句。该方法在与SELECT()、UPDATE()和DELETE()一起使用时有效。当使用SELECT()时,此方法设计为与OFFSET()一起使用。(自3.5.2版本起可用)
  • OFFSET(String)
  • OFFSET(long)
追加一个`OFFSET`子句。该方法在与SELECT()一起使用时有效。此方法设计为与LIMIT()一起使用。(自3.5.2版本起可用)
  • OFFSET_ROWS(String)
  • OFFSET_ROWS(long)
追加一个`OFFSET n ROWS`子句。该方法在与SELECT()一起使用时有效。此方法设计为与FETCH_FIRST_ROWS_ONLY()一起使用。(自3.5.2版本起可用)
  • FETCH_FIRST_ROWS_ONLY(String)
  • FETCH_FIRST_ROWS_ONLY(int)
追加一个`FETCH FIRST n ROWS ONLY`子句。该方法在与SELECT()一起使用时有效。此方法设计为与OFFSET_ROWS()一起使用。(自3.5.2版本起可用)
DELETE_FROM(String)开始一个删除语句,并指定要从中删除的表。通常应该跟随一个WHERE子句!
INSERT_INTO(String)开始一个插入语句并指定要插入的表。这之后应该跟随一个或多个VALUES()、INTO_COLUMNS()和INTO_VALUES()方法的调用。
  • SET(String)
  • SET(String...)
追加到更新语句的“set”列表中。
UPDATE(String)开始一个更新语句并指定要更新的表。这之后应该跟随一个或多个SET()方法的调用,通常还有一个WHERE()方法的调用。
VALUES(String, String)在插入语句中追加内容。第一个参数是要插入的列,第二个参数是对应的值。
INTO_COLUMNS(String...)追加列短语到插入语句。应该与INTO_VALUES()一起调用。
INTO_VALUES(String...)追加值短语到插入语句。应该与INTO_COLUMNS()一起调用。
ADD_ROW()为批量插入添加新行。(自3.5.2版本起可用)

需要注意的是,SQL类会将LIMIT、OFFSET、OFFSET n ROWS和FETCH FIRST n ROWS ONLY子句按照原样写入生成的语句中。换句话说,该库不会尝试对不直接支持这些子句的数据库进行规范化处理。因此,用户需要非常重视是否目标数据库支持这些子句。如果目标数据库不支持这些子句,那么使用这些支持很可能会创建出运行时错误的SQL语句。

从3.4.2版本开始,您可以使用可变长度参数,示例如下:

public String selectPersonSql() {return new SQL().SELECT("P.ID", "A.USERNAME", "A.PASSWORD", "P.FULL_NAME", "D.DEPARTMENT_NAME", "C.COMPANY_NAME").FROM("PERSON P", "ACCOUNT A").INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID", "COMPANY C on D.COMPANY_ID = C.ID").WHERE("P.ID = A.ID", "P.FULL_NAME like #{name}").ORDER_BY("P.ID", "P.FULL_NAME").toString();
}public String insertPersonSql() {return new SQL().INSERT_INTO("PERSON").INTO_COLUMNS("ID", "FULL_NAME").INTO_VALUES("#{id}", "#{fullName}").toString();
}public String updatePersonSql() {return new SQL().UPDATE("PERSON").SET("FULL_NAME = #{fullName}", "DATE_OF_BIRTH = #{dateOfBirth}").WHERE("ID = #{id}").toString();
}

从3.5.2版本开始,您可以按照以下方式创建用于批量插入的插入语句:

public String insertPersonsSql() {// INSERT INTO PERSON (ID, FULL_NAME)//     VALUES (#{mainPerson.id}, #{mainPerson.fullName}) , (#{subPerson.id}, #{subPerson.fullName})return new SQL().INSERT_INTO("PERSON").INTO_COLUMNS("ID", "FULL_NAME").INTO_VALUES("#{mainPerson.id}", "#{mainPerson.fullName}").ADD_ROW().INTO_VALUES("#{subPerson.id}", "#{subPerson.fullName}").toString();
}

从3.5.2版本开始,您可以按照以下方式创建用于限制搜索结果行数的选择语句:

public String selectPersonsWithOffsetLimitSql() {// SELECT id, name FROM PERSON//     LIMIT #{limit} OFFSET #{offset}return new SQL().SELECT("id", "name").FROM("PERSON").LIMIT("#{limit}").OFFSET("#{offset}").toString();
}public String selectPersonsWithFetchFirstSql() {// SELECT id, name FROM PERSON//     OFFSET #{offset} ROWS FETCH FIRST #{limit} ROWS ONLYreturn new SQL().SELECT("id", "name").FROM("PERSON").OFFSET_ROWS("#{offset}").FETCH_FIRST_ROWS_ONLY("#{limit}").toString();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用umi中的useRequest函数获取返回值中的data为空的问题

umi是一个react脚手架,最近有一个功能,需要在组件第一次渲染前请求一次,后面组件重新渲染不需要再次发送请求。要实现这种功能,我决定使用umi里面的一个hook函数,即useRequest。请求代码如下 const {data:categorys}u…

使用gitpages搭建博客

1 介绍 博客整体效果。在线预览我的博客:https://taot-chen.github.io 支持特性 简约风格博客Powered By Jekyll博客文章搜索自定义社交链接网站访客统计Google Analytics 网站分析Gitalk评论功能自定义关于about页面支持中文布局支持归档与标签 2 新建博客 git…

AI论文范文:AIGC中的图像转视频技术研究

声明: ⚠️本文由智元兔AI写作大师生成,仅供学习参考智元兔-官网|一站式AI服务平台|AI论文写作|免费论文扩写、翻译、降重神器 1 引言 1.1 AIGC技术背景介绍 1.2 图像转视频技术的重要性与应用场景 1.3 研究动机与目标 2 相关工作回顾 2.1 图像转视…

面试算法78:合并排序链表

题目 输入k个排序的链表,请将它们合并成一个排序的链表。 分析:利用最小堆选取值最小的节点 用k个指针分别指向这k个链表的头节点,每次从这k个节点中选取值最小的节点。然后将指向值最小的节点的指针向后移动一步,再比较k个指…

基于51单片机的智能车寻迹系统设计与实现

一、摘要 随着科技的不断发展,智能车在人们生活中的应用越来越广泛。智能车寻迹系统是智能车的一个重要组成部分,它能够使智能车在各种复杂环境中自动识别并沿着预定的轨迹行驶。本文主要介绍了一种基于单片机的智能车寻迹系统的设计与实现方法。该系统…

统信UOS及麒麟KYLINOS操作系统上设置GRUB密码

原文链接:给单用户模式上一层保险!!! hello,大家好啊!今天我要给大家介绍的是在统信UOS及麒麟KYLINOS操作系统上设置GRUB密码的方法。GRUB(GRand Unified Bootloader)是Linux系统中的…

利用F12和Fiddler抓包

网络基础 http 而http协议又分为下面的部分,点击具体条目后可以查看详细信息 http请求消息:请求行(请求方法),请求路径,请求头,请求体(载荷) http响应消息:响应行(响应状态码),响应头,响应体 请求行 即请求方法 get post put patch 响应行 即响应码,常见响应状态…

祖先是否安宁,直接关系到个人以及家运哦!

一直以来,中国古代流传下来的思想就认为,祖先安葬在好的风水福地,一定能给子孙后代带来吉祥如意。相反的,假如祖坟风水不好,则会影响到后人的运气,轻者诸事不顺、重者家庭破裂、噩运连连,所以&a…

【C++杂货铺】C++11新特性——lambda

文章目录 一、C98中的排序二、先来看看 lambda 表达式长什么样三、lambda表达式语法3.1 捕捉列表的使用细节 四、lambda 的底层原理五、结语 一、C98中的排序 在 C98 中,如果要对一个数据集合中的元素进行排序,可以使用 std::sort 方法,下面…

Nvblox ROS1 安装配置

安装并配置Nvblox ROS1 下载Nvblox ROS1 mkdir -p ~/nvblox_ros1_ws/src/ mkdir ~/data cd ~/nvblox_ros1_ws/src/ git clone https://github.com/ethz-asl/nvblox_ros1.git cd nvblox_ros1 git submodule update --init --recursive安装Docker for pkg in docker.io docke…

二叉树顺序结构与堆的概念及性质(c语言实现堆)

上次介绍了树,二叉树的基本概念结构及性质:二叉树数据结构:深入了解二叉树的概念、特性与结构 今天带来的是:二叉树顺序结构与堆的概念及性质,还会用c语言来实现堆 文章目录 1. 二叉树的顺序结构2.堆的概念和结构3.堆…

推荐几个开源HTTP服务接口快速生成工具

在现在流行微服务、前后端分离软件开发架构下,基于标准RESTful/JSON的HTTP接口已经成为主流。在实际业务中有很多需要快速开发调用数据服务接口的需求,但团队中缺乏专业的后端开发人员,比如: (1)数据库表已…

PHP开发日志 ━━ 基于PHP和JS的AES相互加密解密方法详解(CryptoJS) 适合CryptoJS4.0和PHP8.0

最近客户在做安全等保,需要后台登录密码采用加密方式,原来用个base64变形一下就算了,现在不行,一定要加密加key加盐~~ 前端使用Cypto-JS加密,传输给后端使用PHP解密,当然,前端虽然有key有盐&…

如何学习计算机编程?零基础入门,轻松成为编程达人!

在这个信息爆炸的时代,计算机编程已经成为一项炙手可热的技能。如果你也对编程充满兴趣,但又不知从何入手,那么本文将为你提供一条通往编程世界的捷径。掌握了这些技巧,相信你一定能够轻松成为编程达人! 一、选择合适…

lag-llama源码解读(Lag-Llama: Towards Foundation Models for Time Series Forecasting)

Lag-Llama: Towards Foundation Models for Time Series Forecasting 文章内容: 时间序列预测任务,单变量预测单变量,基于Llama大模型,在zero-shot场景下模型表现优异。创新点,引入滞后特征作为协变量来进行预测。 获得…

爬虫工作量由小到大的思维转变---<第三十五章 Scrapy 的scrapyd+Gerapy 部署爬虫项目>

前言: 项目框架没有问题大家布好了的话,接着我们就开始部署scrapy项目(没搭好架子的话,看我上文爬虫工作量由小到大的思维转变---<第三十四章 Scrapy 的部署scrapydGerapy>-CSDN博客) 正文: 1.创建主机: 首先gerapy的架子,就相当于部署服务器上的;所以…

Ubuntu 18.04搭建RISCV和QEMU环境

前言 因为公司项目代码需要在RISCV环境下测试,因为没有硬件实体,所以在Ubuntu 18.04上搭建了riscv-gnu-toolchain QEMU模拟器环境。 安装riscv-gnu-toolchain riscv-gnu-toolchain可以从GitHub上下载源码编译,地址为:https://…

大华主动注册协议介绍

一、大华主动注册协议介绍 前面写了一篇文章,介绍一些设备通过大华主动注册协议接入到AS-V1000的文章,很多问我关于大华主动注册协议的相关知识。 由于大华主动注册协议是一种私有协议,通常不对外公开详细的协议规范和技术细节。因此…

C++ Primer Plus----第十二章--类和动态内存分布

本章内容包括:对类成员使用动态内存分配;隐式和显式复制构造函数;隐式和显式重载赋值运算符;在构造函数中使用new所必须完成的工作;使用静态类成员;将定位new运算符用于对象;使用指向对象的指针…

ssm基于web的志愿者管理系统的设计与实现+vue论文

摘 要 使用旧方法对志愿者管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在志愿者管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的志愿者…