当前位置: 首页 > news >正文

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();
}

相关文章:

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…...

海云安亮相2023北京国际金融安全论坛,助力金融企业数字化转型降本增效

近日,2023北京国际金融安全论坛暨金融科技标准认证生态大会在北京金融安全产业园成功举办。深圳海云安网络安全技术有限公司(以下简称“海云安”)受邀参展亮相此次大会。海云安作为国内领先的金融科技服务商,展示了开发安全系列产…...

nodeJS搭建免费代理IP池爬取贴吧图片实战

之前用python写过爬虫,这次想试试nodeJS爬虫爬取贴吧图片,话不多说代码如下,爬取制定吧的前十页所有帖子里的图片 爬取贴吧图片脚本 你得提前创建一个images文件夹 const axios require("axios"); const cheerio require("…...

基于图搜索的自动驾驶规划算法 - BFS,Dijstra,A*

本文将讲解BFS,Dijstra,A*,动态规划的算法原理,不正之处望读者指正,希望有兴趣的读者能在评论区提出一些这些算法的面试考点,共同学习,一起进步 0 图论基础 图有三种:无向图、有向…...

Spring系列学习四、Spring数据访问

Spring数据访问 一、Spring中的JDBC模板介绍1、新建SpringBoot应用2、引入依赖:3、配置数据库连接,注入dbcTemplate对象,执行查询:4,测试验证: 二、整合MyBatis Plus1,在你的项目中添加MyBatis …...

HBase 创建不分裂的表 ( 禁止 Table Split )

注意:由于 HBase 版本众多,配置表的语法在不同版本上会有差异,本文介绍的配置方法是在 1.4.9 版本上测试的,使用 HBase 2.0 的版本需要核实并修改相关配置方法! 有时候,出于特殊需要,我们希望对…...

docker入门概念详解

本篇文章对docker的一些基础概念和周边概念进行了详细解释。帮助你可以很好的理解docker是用来干什么的,docker是怎么工作的。其中有docker所运用到的技术解释,docker的不同发展版本,dokcer的架构,docker的生态等等详解。希望本片…...

C++程序设计实践报告【格式】

C程序设计实践报告 原XX工业学院 C程序设计实践报告 题目: 专业: 学号: 姓名: 年 月 日 目录 一、绪…...

浅谈数据仓库运营

一、背景 企业每天都会产生大量的数据,随着时间增长,数据会呈现几何增长,尤其在系统基建基础好的公司。好的数据仓库需要提前规划和好的运营,才能支持企业的发展,为企业提供数据分析基础。 二、目标 提高数据仓库存储…...

系列六、Consul

一、Consul 1.1、概述 Consul是一套开源的分布式服务发现和配置管理系统,由HashiCorp公司用Go语言开发。他提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个功能都可以单独使用,也可以一起使用以构建全方位的服务网格&…...

Java集合/泛型篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、ArrayList和linkedList的区别二、HashMap和HashTable的区别三、Collection包结构,与Collections的区别四、泛型常用特点前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站…...

集合使用注意事项

集合使用注意事项总结 集合判空 判断所有集合内部的元素是否为空,使用 isEmpty() 方法,而不是 size()0 的方式 这是因为 isEmpty() 方法的可读性更好,并且时间复杂度为 O(1)。 集合转 Map 在使用 java.util.stream.Collectors 类的 toMap()…...

什么是 JavaScript 中的 WeakMap

在 JavaScript 中,WeakMap 是一种特殊的 Map 数据结构,它允许将对象作为键,而且键值对是弱引用的关系。 与 Map 不同的是,WeakMap 的键只能是对象,不能是其他类型的值。同时,当键对象没有任何引用时&#…...

nodejs+vue+ElementUi农产品团购销售系统zto2c

目标是为了完成小区团购平台的设计和实现,在疫情当下的环境,方便小区业主购入生活所需,减小居民的生活压力 采用B/S模式架构系统,开发简单,只需要连接网络即可登录本系统,不需要安装任何客户端。开发工具采…...

nacos入门篇001-安装与启动

1、下载zip包 我这里下载的是版本2.2.0 Nacos 快速开始 2、修改配置文件 2.1集群模式修改成单例模式 vi startup.sh 2.2 修改数据库配置信息 3、初始化数据库 3.1 创建db名称:db_nacos 3.2 执行mysql-schema.sql 3.3 执行完截图: 4、运行脚本启动 …...

WordPress主题大前端DUX v8.3源码下载

DUX主题8.3版本更新内容: 新增:Cloudflare Turnstile 免费验证功能 新增:子菜单页面模版,支持多级页面 新增:手机端文章内表格自动出现横向滚动条,可集体或单独设置滚动宽度 新增:标签云页面模版…...

RabbitMQ之快速入门、上手

前言 学习一样新技术、新框架,最重要的是学习其思想、原理。即原理性思维。 如果是因为工作原因,需要快速上手RabbitMQ,本篇或许适合你。 核心概念 Connection:publisher/consumer 和 broker 之间的 TCP 连接Channel…...

GBASE南大通用-GBase 8s数据库日志模式及切换

一、 GBase 8s数据库共有以下 4 种日志模式:无日志模式、缓冲日志模式、无缓冲日志模式、ANSI 模式。详细介绍如下: 1、无日志模式(Non logging): 采用无日志模式时,所有 DML 操作都不会被记录到日志中&…...

侵入式和非侵入式微服务框架的比较

微服务框架可以分为侵入式和非侵入式两种。侵入式框架需要对现有代码进行改造,而非侵入式框架则无需改造现有代码。 侵入式框架 侵入式框架将微服务治理功能嵌入到应用程序中,需要修改应用程序的代码。这种框架的优点是可以提供更强大的功能&#xff0…...

Go语言程序设计-第5章--函数

Go语言程序设计-第5章–函数 5.1 函数声明 每个函数声明都包含一个名字、一个形参列表、一个可选的返回列表以及函数体: func name(parameter-list) (result-list) {body }func add(x int, y int) int { return x y} func sub(x, y int) (z int) {z x - y; return} func f…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

反射获取方法和属性

Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

uniapp中使用aixos 报错

问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...