隔了兩周,首先回顧一下,在Mybatis中的SqlMapper配置文件中引入的幾個(gè)擴(kuò)展機(jī)制:
1.引入SQL配置函數(shù),簡(jiǎn)化配置、屏蔽DB底層差異性
2.引入自定義命名空間,允許自定義語(yǔ)句級(jí)元素、腳本級(jí)元素
3.引入表達(dá)式配置,擴(kuò)充SqlMapper配置的表達(dá)能力
前面兩條已經(jīng)舉過(guò)例子,現(xiàn)在來(lái)看看怎么使用表達(dá)式配置。說(shuō)到表達(dá)式語(yǔ)言,最為富麗堂皇的自然就是OGNL,但這也正是Mybatis內(nèi)部訪問(wèn)數(shù)據(jù)的固有方式,所以也輪不到我們?cè)谶@里來(lái)擴(kuò)充了(事實(shí)上Mybatis的參數(shù)設(shè)置并不能使用完全的OGNL)。那么,除了OGNL,還有哪些表達(dá)式語(yǔ)言呢?別忘了,我們的前提是Spring環(huán)境,自然,SpEL表達(dá)式也就走入我們的視野,因此這篇文章就重點(diǎn)記錄在SqlMapper中使用SpEL表達(dá)式。
四、在Mybatis中的SqlMapper使用SpEL表達(dá)式
1.SpEL工具類
SpEL就是Spring提供的EL表達(dá)式,雖然到Spring3才開(kāi)始推出,但已經(jīng)是Spring的一個(gè)基礎(chǔ)核心模塊了,地位已經(jīng)差不多等同于IoC和AOP了。SpEL和OGNL類似,也有表達(dá)式、上下文環(huán)境、root對(duì)象等概念,但和OGNL不同的是,SpEL還提供了訪問(wèn)Spring中bean的能力——這是非常強(qiáng)悍的,試問(wèn)一個(gè)Spring應(yīng)用有多少類不是Spring管理的呢?具體的SpEL語(yǔ)法細(xì)節(jié)可以參考Spring的官方文檔。
SpEL目前主要應(yīng)用于Spring的配置,使用起來(lái)非常方便,但是在Java類中使用則比較繁瑣,稍微實(shí)用一點(diǎn)的例子都需要?jiǎng)?chuàng)建解析器實(shí)例、創(chuàng)建執(zhí)行環(huán)境、解析表達(dá)式、對(duì)表達(dá)式求值等步驟,如果需要訪問(wèn)Spring的Bean,還要設(shè)置BeanFactoryResolver等,因此,為了簡(jiǎn)化SpEL在Java中的應(yīng)用,我編寫(xiě)了一個(gè)SpEL的幫助類:
這個(gè)工具類分成四個(gè)部分:
- 實(shí)現(xiàn)ApplicationContextAware接口,注入ApplicationContext(BeanFactory)對(duì)象
-
表達(dá)式求值方法
- 對(duì)表達(dá)式簡(jiǎn)單求值(還可指定返回的目標(biāo)類型)
- 指定root對(duì)象,對(duì)表達(dá)式求值(還可指定返回的目標(biāo)類型)
- 指定root對(duì)象和其它變量,對(duì)表達(dá)式求值(還可指定返回的目標(biāo)類型)
-
表達(dá)式設(shè)置方法
- 設(shè)置表達(dá)式的值
- 指定root對(duì)象,設(shè)置表達(dá)式的值
- 指定root對(duì)象和其它變量,設(shè)置表達(dá)式的值
-
變量管理方法
- 添加變量
- 移除變量