一、前言
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}}