3.1 预设 SQL (Key-SQL)
概念
预设 SQL 是将 SQL 语句预先定义好,通过唯一的 key 来调用。
优势:
- SQL 集中管理,便于维护
- 支持动态条件,灵活组装
- 可在数据库中在线编辑,无需重启
- 支持 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