基于Mustache实现sql拼接
一、前言
Mustache语法是一种模板语法,它可以帮我们拼接我们想要的东西。入职新公司,而项目里的sql语句就是用Mustache语法来拼接的,网上关于这个的教程、资料比较少,所以自己也记录一下笔记,本篇笔记的内容主要是讲Mustache语法在web开发中的持久层用来拼接sql的应用,若想学习更多关于Mustache相关只是请参考:Mustache的GitHub地址。
二、Mustache语法
Mustache 的模板语法很简单,就那么几个:
- {{keyName}}
- {{#keyName}} {{/keyName}}
- {{^keyName}} {{/keyName}}
- {{.}}
- {{<partials}}
- {{{keyName}}}
- {{!comments}}
此处具体使用可以参考博客:Mustache 入门教程
三、Mustache拼接sql
持久层框架使用的是JPA,类申明如下,后文接口均在此类中:
/**
* 模块定义操作持久层
*
* @author csh
* @date 2019/10/9
*/
public interface ModuleRepository extends PagodaJpaRepository<Module, Long>, JpaSpecificationExecutor<Module> {}
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<Module> queryDetailById(@Param("itemId") Long itemId);
这里使用“:”是为了防止sql注入
3.2 多个参数拼接
多个参数封装的实体类:
/**
* 模块信息查询入参
*
* @author csh
* @date 2019/10/12
*/
@Data
public 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<Module> 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<InterfaceInfoDTO> findInterfaceByModuleId(@Param("moduleIdList") List<Long> 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}}
基于Mustache实现sql拼接的更多相关文章
- SQL拼接方法
smark Beetle可靠.高性能的.Net Socket Tcp通讯组件 另类SQL拼接方法 在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的 ...
- 另类SQL拼接方法
在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的地方就是不能对SQL进行参数化处理.下面介绍一种就算基于String +的方式也可以进行SQL参数 ...
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
基于Oracle的SQL优化(社区万众期待数据库优化扛鼎巨著) 崔华 编 ISBN 978-7-121-21758-6 2014年1月出版 定价:128.00元 856页 16开 编辑推荐 本土O ...
- 基于iSCSI的SQL Server 2012群集测试(四)--模拟群集故障转移
6.模拟群集故障转移 6.1 模拟手动故障转移(1+1) 模拟手动故障转移的目的有以下几点: 测试群集是否能正常故障转移 测试修改端口是否能同步到备节点 测试禁用full-text和Browser服务 ...
- COALESCE在SQL拼接中的大用途
SQL拼接可以使得代码比较灵活,不会那么死板,对于维护也比较方便. 下面是简单的SQL拼接,同时也包含了隐式游标的概念吧,可以遍历表中的每一个字段 -------------------------- ...
- SQL拼接备份数据库
在SQLserver使用脚本备份数据库的时候需要注意的问题是: 1.指向的文件名必须是有读写权限. 2.在使用批量数据库备份时候需要根据自己需求选择性备份. -- ================== ...
- Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务
第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...
- 数据库 基于索引的SQL语句优化之降龙十八掌(转)
一篇挺不错的关于SQL语句优化的文章,因不知原始出处,故未作引用说明! 1 前言 客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急 ...
- 基于oracle的sql优化
[基于oracle的sql优化] 基于oracle的sql优化 [博主]高瑞林 [博客地址]http://www.cnblogs.com/grl214 一.编写初衷描述 在应有系统开发初期,由于数据库 ...
随机推荐
- springboot 整合ehcache缓存
1.CacheManager Spring Boot默认集成CacheManager,如下包所示: 可以看出springboot自动配置了 JcacheCacheConfiguration. EhCa ...
- Mycat 关键特性
关键特性 支持SQL92标准 支持MySQL.Oracle.DB2.SQL Server.PostgreSQL等DB的常见SQL语法 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理. ...
- selenium实现百度图片爬取
因为是百度图片是瀑布流ajax异步上传的数据,所以这里用到抓包工具来抓取链接(fiddler) 好了直接上代码, from selenium import webdriver from seleniu ...
- Spring Boot 整合视图层技术
这一节我们主要学习如何整合视图层技术: Jsp Freemarker Thymeleaf 在之前的案例中,我们都是通过 @RestController 来处理请求,所以返回的内容为json对象.那么如 ...
- httpd2.2
httpd -t:检查httpd配置文件/etc/httpd/conf/httpd.conf的语法错误 请求报文语法 <method> <request-URL> <ve ...
- OKR群:为什么说每个程序员都应该有自己的个人OKR
个人OKR OKR,即Object and Key Result,是IT大厂最近争相推广的目标管理工具,例如腾讯.百度和头条(字节跳动). 其实,OKR并不是仅仅只适用于公司和部门内部,我们个人也可以 ...
- CSS3自定义浏览器滚动条样式
一个完整滚动条右以下部分组成: ::-webkit-scrollbar 滚动条整体部分,常用属性:width,height,background,border: ::-webkit-scrollbar ...
- Redis优雅实现分布式锁
文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 在实际项目开发中经常会遇到这样一个业务场景:如果同一台机器有多个线程抢夺同一个共享资源,同一个线程多次执行会出 ...
- Akka实现WordCount(Scala)
Akka实现WordCount(Scala): 架构图: 项目结构: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- IDEA 学习笔记之 Maven项目开发
Maven项目开发: 配置Maven: 新建Maven项目: 选择webapp: 和eclipse一样,设置: 修改maven配置,添加一个新属性,可以加快项目创建速度: 完成: 新建java和tes ...