目录
一, 前言
二, Mustache 语法
三, Mustache 拼接 sql
一, 前言
Mustache 语法是一种模板语法, 它可以帮我们拼接我们想要的东西. 入职新公司, 而项目里的 sql 语句就是用 Mustache 语法来拼接的, 网上关于这个的教程, 资料比较少, 所以自己也记录一下笔记, 本篇笔记的内容主要是讲 Mustache 语法在 web 开发中的持久层用来拼接 sql 的应用, 若想学习更多关于 Mustache 相关只是请参考: Mustache 的 GitHub 地址 https://github.com/mustache/mustache/ .
二, 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 中是字符串就加, 如果是整形则不必加斜杠.
来源: https://www.cnblogs.com/csh24/p/11798590.html