一、前言

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}}

最新文章

  1. MySQL的几个概念:主键,外键,索引,唯一索引
  2. 带参数的CLR存储过程
  3. 零基础十分钟学会用git在coding.net上传(pull)和push
  4. AMQP与RabbitMQ简介
  5. A potentially dangerous Request.Form value was detected from the client
  6. memory leak at strcore.cpp
  7. 公共控件Listview
  8. 阿里云大数据三次技术突围:Greenplum、Hadoop和“飞天”
  9. Navicat(连接) -1高级设置
  10. ASP.NET下跨应用共享Session和使用Redis进行Session托管简介
  11. Java [Leetcode 102]Binary Tree Level Order Traversal
  12. 学习Mongodb(一)
  13. 排颜色问题——数组 leetcode lintcode
  14. 52. 模版和设计元素——Lotus Notes的代码重用
  15. [转载]织梦CMS首页调用分类信息栏目及列表方法
  16. SQL随记(四)
  17. Cocos Creator(圆形遮罩头像)动态增加遮盖层 mask 并设为圆形生效
  18. ASP.NET 工作流:支持长时间运行操作的 Web 应用程序
  19. [Arch] 03. Practice UML in project
  20. 洛谷P4027 [NOI2007]货币兑换(dp 斜率优化 cdq 二分)

热门文章

  1. 使用maven开发javaweb项目
  2. 获取配置文件中key=value
  3. MongoDB 学习笔记之 索引选项和重建索引
  4. Cocos Creator 3D 打砖块教程(二) | 子弹发射与摄像机平滑移动
  5. spring配置文件默认名称及位置,ContextLoaderListener监听器作用
  6. 使用FastReport报表工具生成报表PDF文档
  7. 部署主从dns
  8. Redis 复制过程详解
  9. 2.1实现简单基础的vector
  10. Web前端安全之iframe