1、前言
我們知道 mybatis 中的動態sql語句是基於 OGNL 表達式的。
額外補充一點:mybatis 中的 #{} 和 ${} ,可直接跳過。
#{}表示一個占位符號,#{}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,#{}中可以寫成value或其它名稱。
#{}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。
${}表示一個拼接符號,會引用sql注入,所以不建議使用${}。
${}接收輸入參數,類型可以是簡單類型,pojo、hashmap。
如果接收簡單類型,${}中只能寫成value。
${}接收pojo對象值,通過OGNL讀取對象中的屬性值,通過屬性.屬性.屬性...的方式獲取對象屬性值。
來看看今天的重點對象,minidao,那么它里邊的語法又是什么呢?
2、怎么寫
怎么寫之前先來看一下官方的描述:
Jeecg針對springjdbc+freemarker做了封裝,出了這么一個輕量級持久層,可以讓Hiberate擁有mybatis一樣SQL靈活能力,同時支持事務統一、SQL標簽能力。
這樣是不是已經很明確了呢,freemarker 語法,那么 freemaker 是什么呢?
freemaker 是前端引擎,只負責展示,沒有復雜邏輯,而它的語法是 FTL 指令,類似於 HTML 標簽。
來看看 minidao 中怎么用吧。
2.1 if 判斷
<#if status?exists && status?length gt 0> and t.status= :status </#if>
2.2 if elese
<#if status?exists && status?length gt 0> and t.status= :status <#else> and 1=1 </#if>
2.3 list 進行遍歷
<#list items as item> ${item.userName} </#list>
更加詳細的參考:
http://qy85.iteye.com/blog/1612093
3、需要注意
既然我們知道了, minidao 中,封裝了 freemaker 便簽,那么同樣我們也知道,在 freemaker ftl中,參數是通過 ${},而我們在系統發現,很多都是這樣用的 :參數,那么這又是怎么一回事?
4、sql 參數使用方式
4.1 占位符方式-【:字段名】
這種方式是我們在系統中最常見的了,來看看他的與缺點。
優點: 防止sql注入;sql執行計划只解析一次;字段值根據類型自動轉換,不需要手工處理
缺點: 只能傳參數原生態值;參數為List情況循環體不適用
官方示例:
SELECT * FROM employee where 1=1 <#if employee.age ?exists> and age = :employee.age </#if> <#if employee.name ?exists> and name = :employee.name </#if> <#if employee.empno ?exists> and empno = :employee.empno </#if>
4.2 模版語言方式 -【${字段名}】
你要的 ftl 方式的來了。
缺點: Sql直接拼裝,有SQL注入風險;參數值需根據類型手工轉換;
優點: 可以對參數值進行腳本處理;參數為List對象,循環體對象必須用該方式;(用戶體驗沒有變化,直接將${}改為: 即可)
特點: 持多參數,支持參數多層,參數為list必須采用模板語言方式
官方示例:
SELECT * FROM employee where 1=1 <#if employee.age ?exists> and age = '${employee.age}' </#if> <#if employee.name ?exists> and name = '${employee.name}' </#if>
<#if employee.empno ?exists> and empno = '${employee.empno}' </#if>
上邊之所以提到 mybatis #{} 和 ${} ,其實是為了體現 :字段名 和 ${}
總之,推薦使用占位符的形式。
18年專科畢業后,期間一度迷茫,最近我創建了一個公眾號用來記錄自己的成長。
