跳到主要内容

3.1 预设 SQL (Key-SQL)

概念

预设 SQL 是将 SQL 语句预先定义好,通过唯一的 key 来调用。

优势:

  1. SQL 集中管理,便于维护
  2. 支持动态条件,灵活组装
  3. 可在数据库中在线编辑,无需重启
  4. 支持 SQL 嵌套复用

配置方式

方式一:XML 配置文件

# application.yml
dlz:
db:
sqllist: [app/*] # 预设 SQL 文件路径

resources/sql/app/ 下创建 SQL 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<sqlList>
<!-- 基础查询 -->
<sql sqlId="key.user.findActive"><![CDATA[
SELECT * FROM user WHERE 1=1
[AND status = #{status}]
[AND name LIKE #{name}]
]]></sql>

<!-- SQL 嵌套 -->
<sql sqlId="key.condition.age"><![CDATA[
age > #{minAge} [AND age < #{maxAge}]
]]></sql>

<sql sqlId="key.user.findByAge"><![CDATA[
SELECT * FROM user WHERE 1=1
[AND #{key.condition.age}]
]]></sql>
</sqlList>

方式二:数据库配置

SysSql sysSql = new SysSql();
sysSql.setSqlKey("user.findActive");
sysSql.setSqlValue("SELECT * FROM user WHERE 1=1 [and status = #{status}]");
DB.Pojo.insert(sysSql);

使用方式

// 基础查询
List<User> users = DB.Sql.select("key.user.findActive")
.addPara("status", 1)
.addPara("name", "张")
.queryList(User.class);

// 分页查询
Page<User> page = DB.Sql.select("key.user.findActive")
.addPara("status", 1)
.setPage(Page.build(1, 10))
.page(User.class);

// 数据库中的预设 SQL
DB.Sql.select("key.test.user.find")
.addPara("status", 1)
.queryList();

空值处理

方括号 [...] 内的条件:参数为空时自动忽略。

// status 有值,name 和 minAge 为空
DB.Sql.select("key.user.findActive")
.addPara("status", 1) // 有值,生效
.addPara("name", null) // 空值,忽略
.addPara("minAge", null) // 空值,忽略
.queryList(User.class);

// 生成 SQL:SELECT * FROM user WHERE 1=1 AND status = 1

规则

  • XML 配置 sqlId 不需要加 "key." 前缀
  • Java 调用时必须加 "key." 前缀
  • 支持 SQL 嵌套:#{key.xxx} 引用其他预设 SQL