博客
关于我
基于Mustache实现sql拼接
阅读量:408 次
发布时间:2019-03-06

本文共 2633 字,大约阅读时间需要 8 分钟。

目录

一、前言

Mustache语法是一种模板语法,它可以帮我们拼接我们想要的东西。入职新公司,而项目里的sql语句就是用Mustache语法来拼接的,网上关于这个的教程、资料比较少,所以自己也记录一下笔记,本篇笔记的内容主要是讲Mustache语法在web开发中的持久层用来拼接sql的应用,若想学习更多关于Mustache相关只是请参考:。

二、Mustache语法

Mustache 的模板语法很简单,就那么几个:

  • {{keyName}}
  • {{#keyName}} {{/keyName}}
  • {{^keyName}} {{/keyName}}
  • {{.}}
  • {{<partials}}
  • {{{keyName}}}
  • {{!comments}}

此处具体使用可以参考博客:

三、Mustache拼接sql

持久层框架使用的是JPA,类申明如下,后文接口均在此类中:

/** * 模块定义操作持久层 * * @author csh * @date 2019/10/9 */public interface ModuleRepository extends PagodaJpaRepository
, JpaSpecificationExecutor
{}

3.1 单个参数拼接

/**     * 根据项目主键查询模块详细信息     *     * @param itemId 项目主键     * @return 模块详细信息     */    @SqlTemplate(            name = "queryDetailById",            sql = "SELECT id,item_id,module_code,module_name,path,remark,creator_name,creator_code,created_at,modifier_name,modifier_code,last_modified_at " +                    " FROM module WHERE item_id = :itemId AND del = 0"    )    List
queryDetailById(@Param("itemId") Long itemId);

这里使用“:”是为了防止sql注入


3.2 多个参数拼接

多个参数封装的实体类:

/** * 模块信息查询入参 * * @author csh * @date 2019/10/12 */@Datapublic class QueryModuleInput implements Serializable {    /**     * 项目中文名称     */    @NotNull    private Long itemId;    /**     * 模块名称     */    @NotNull    @NotBlank    private String moduleName;}

接受查询参数的接口:

/**     * 根据项目名、模块名进行复杂查询     *     * @param moduleInput 项目名、模块名入参     * @return 返回查询出来的列表     */    @SqlTemplate(            name = "complexQuery",            sql = "SELECT id,item_id,module_code,module_name,path,remark,creator_name,creator_code,created_at,modifier_name,modifier_code,last_modified_at " +                    "FROM module WHERE del = 0 {{#itemId}} AND item_id = :itemId {{/itemId}} {{#moduleName}} AND module_name = :moduleName {{/moduleName}}"    )    List
listByNames(QueryModuleInput moduleInput);
注意:如果{{#keyName}} {{/keyName}}中的 keyName 值为 null, undefined, false;则不渲染输出任何内容。

3.3 IN语法的拼接

/**     * 根据模块查询接口     *     * @param moduleIdList     * @return     */    @SqlTemplate(            name = "findInterfaceByModuleId",            sql = "select * from interface where 1=1" +                    "{{#moduleIdList_exists}} and module_id in ({{#moduleIdList}}{{^-first}}, {{/-first}}{{this}}{{/moduleIdList}}){{/moduleIdList_exists}}"    )    List
findInterfaceByModuleId(@Param("moduleIdList") List
moduleIdList);
注意:其中
{{^-first}}, {{/-first}}是用来拼接“,”的;
\'{{this}}\'中的斜杠视情况而加,如果list中是字符串就加,如果是整形则不必加斜杠。

3.4 LIKE语法的拼接

// 调用concat函数来拼接{{#seqno}} and h.seqno like concat('%',:seqno,'%'){{/seqno}}// 直接拼接{{#con_cycle}} AND var.con_cycle like '{{con_cycle}}%'{{/con_cycle}}

转载地址:http://trgkz.baihongyu.com/

你可能感兴趣的文章
看完你就明白的锁系列之锁的状态
查看>>
看完这篇操作系统,和面试官扯皮就没问题了
查看>>
我的价值观
查看>>
一文详解 Java 并发模型
查看>>
值类型与引用类型(中)
查看>>
MSSQL 2005 数据库变成可疑状态
查看>>
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
查看>>
秋色园引发CPU百分百命案的事件分析与总结
查看>>
安装jdk并配置环境变量
查看>>
稀疏数组
查看>>
js的严格模式
查看>>
idea的安装和无限期试用
查看>>
Oracle VM VirtualBox安装PVE虚拟机
查看>>
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
查看>>
Android MediaPlayer setDataSource failed
查看>>
[Vue 牛刀小试]:第十二章 - 使用 Vue Router 实现 Vue 中的前端路由控制
查看>>
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
查看>>
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
查看>>
大前端的自动化工厂(1)——Yeoman
查看>>
数据仓库建模方法论
查看>>