• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

agile-sql: 动态sql解析器 设计初衷是为JPA规范下持久层框架提供类似于MyBatis一样的 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

agile-sql

开源软件地址:

https://gitee.com/agile-framework/agile-sql

开源软件介绍:

agile-sql : 动态sql解析器

设计初衷是为JPA规范下持久层框架提供类似于MyBatis一样的动态sql处理能力,该组件在Alibaba Druid的SQL语法解析能力基础上,增加了根据调用参数动态判断剔除语法段能力,工具中对sql的语法处理均以MySQL语法为基准,如果需要转换为其他数据库可以全局替换为druid中其他数据库语法解析。

它有什么作用

  • 占位符解析提供${}动态占位,不对该参数进行注入监测 提供{}普通占位,对该参数进行注入监测

  • 占位符默认值解析冒号分隔,当占位符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依赖

<!--声明中央仓库--><repositories>    <repository>        <id>cent</id>        <url>https://repo1.maven.org/maven2/</url>    </repository></repositories>        <!--声明依赖--><dependency><groupId>cloud.agileframework</groupId><artifactId>agile-sql</artifactId><version>2.1.0.M5</version></dependency>

步骤 3: 程序中调用SqlUtil(例)

参数集:parserSQL第二个参数作为参数集,程序将从参数集中取出sql占位符中声明的key值对应的参数,并将其替换到sql语句中,占位符使用大括号形式,例{key},占位符可以是最终值的一部分,如模糊查询条件占位columnA like '%{key}%'。程序并除in条件语句外,不会为任何参数添加单引号处理,是否添加单引号可以于调用动态SQL处理前自行添加。

public class YourClass {    public void test() {        //声明参数集,参数集也可以是pojo对象,并支持对象嵌套,多层参数时使用点分隔形式声明占位符        Map<String, Object> 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<Object> c;        public List<Object> getC() {            return c;        }        public void setC(List<Object> c) {            this.c = c;        }    }}

结果日志

SELECT aColumn, bColumnFROM your_tableWHERE c = 12	AND d IN ('c1', 'c2')	OR g IN ('in1', 'in2')

步骤 4: count语句

使用方法同SqlUtil.parserSQL相同,方法为SqlUtil.parserCountSQL,其返回结果为count查询语句

public class Test{    public void test(){        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);    }}

结果日志

select count(1) from (SELECT aColumn, bColumnFROM your_tableWHERE c = 12	AND d IN ('c1', 'c2')	OR g IN ('in1', 'in2')) _select_table

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap