一、前言

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);

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);
01-08 21:00