# agile-sql
**Repository Path**: agile-framework/agile-sql
## Basic Information
- **Project Name**: agile-sql
- **Description**: 动态sql解析器
设计初衷是为JPA规范下持久层框架提供类似于MyBatis一样的动态sql处理能力,该组件在Alibaba Druid的SQL语法解析能力基础上,增加了根据调用参数动态 判断剔除语法段能力
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 16
- **Forks**: 7
- **Created**: 2020-04-14
- **Last Updated**: 2025-02-08
## Categories & Tags
**Categories**: database-dev
**Tags**: None
## README
# agile-sql : 动态sql解析器
设计初衷是为JPA规范下持久层框架提供类似于MyBatis一样的动态sql处理能力,该组件在Alibaba Druid的SQL语法解析能力基础上,增加了根据调用参数动态
判断剔除语法段能力,工具中对sql的语法处理均以MySQL语法为基准,如果需要转换为其他数据库可以全局替换为druid中其他数据库语法解析。
----
[](https://img.shields.io/badge/druid-LATEST-green)
[](https://img.shields.io/badge/build-maven-green)
## 它有什么作用
* **占位符解析**
提供`${}`动态占位,不对该参数进行注入监测 提供`{}`普通占位,对该参数进行注入监测
* **占位符默认值解析**
冒号分隔,当占位符key获取不到时,以defaultValue部分语句作为新语句进行替换 提供`${key:defaultValue}`
提供`{key:defaultValue}`
* **SQL注入分析**
提供生成hibernate风格参数占位,用于hibernate预编译,有效避免sql注入 当参数集中包含注入风险参数时,抛出sql解析异常,防范SQL注入
* **动态剔除语法段**
根据参数集与sql占位符的匹配,当参数为空时,动态剔除对应的语法段,如where条件,select字段等等,并确保最终生成语句可准确执行
* **生成count语句**
提供sql动态解析同时,根据查询语句生成有效的count查询语句,一般用于分页功能,提供总条数计数能力
* **in语句**
支持将集合参数分解成in语句条件,实现类似mybatis的循环语句
-------
## 快速入门
开始你的第一个项目是非常容易的。
#### 步骤 1: 下载包
您可以从[最新稳定版本]下载包(https://github.com/mydeathtrial/agile-sql/releases). 该包已上传至maven中央仓库,可在pom中直接声明引用
以版本agile-sql-2.1.0.M5.jar为例。
#### 步骤 2: 添加maven依赖
```xml
cent
https://repo1.maven.org/maven2/
cloud.agileframework
agile-sql
2.1.0.M5
```
#### 步骤 3: 程序中调用SqlUtil(例)
参数集:parserSQL第二个参数作为参数集,程序将从参数集中取出sql占位符中声明的key值对应的参数,并将其替换到sql语句中,占位符使用大括号形式,例`{key}`
,占位符可以是最终值的一部分,如
模糊查询条件占位`columnA like '%{key}%'`。程序并除in条件语句外,不会为任何参数添加单引号处理,是否添加单引号可以于调用动态SQL处理前自行添加。
```java
public class YourClass {
public void test() {
//声明参数集,参数集也可以是pojo对象,并支持对象嵌套,多层参数时使用点分隔形式声明占位符
Map param = Maps.newHashMap();
param.put("a", "aColumn");
param.put("b", "b");
param.put("c", 12);
param.put("d", new String[]{"c1", "c2"});
//举例使用嵌套对象
Demo g = new Demo();
g.setC(Lists.newArrayList("in1", "in2"));
param.put("g", g);
String sql = SqlUtil.parserSQL("select {a},bColumn from your_table " +
"where c = {c} and d in {d} and e = {e} and f in {f} or g in {g}",param);
logger.debug(sql);
}
private static class Demo {
private List