這是mybatis系列第4篇。沒(méi)看前文的建議先去【Java冢狐】公眾號(hào)中查看前文,方便理解和掌握 別名為什么需要使用別名?在xml文件中有很多需要類完整的類名的地方,十分的冗長(zhǎng),為了減輕我們的工作量和復(fù)雜度mybatis支持我們給某個(gè)類起一個(gè)別名,然后通過(guò)別名可以訪問(wèn)到指定的類型。 別名的用法使用別名之前需要先在mybatis中注冊(cè)別名,而注冊(cè)別名有3種方式。 方式1使用typeAlias元素進(jìn)行注冊(cè)如下:
typeAliases元素中可以包含多個(gè)typeAlias子元素,每個(gè)typeAlias可以給一個(gè)類型注冊(cè)別名,有2個(gè)屬性需要指定:
方式2通過(guò)packege元素批量注冊(cè)上面我們通過(guò)typeAlias元素可以注冊(cè)一個(gè)別名,如果我們有很多類需要注冊(cè),需要寫很多typeAlias配置。 mybatis為我們提供了批量注冊(cè)別名的方式,通過(guò)package元素,如下:
這個(gè)也是在typeAliases元素下面,不過(guò)這次使用的是package元素,package有個(gè)name屬性,可以指定一個(gè)包名,mybatis會(huì)加載這個(gè)包以及子包中所有的類型,給這些類型都注冊(cè)別名,別名名稱默認(rèn)會(huì)采用類名小寫的方式,如UserModel的別名為usermodel 方式3package結(jié)合@Alias批量注冊(cè)并指定別名方式2中通過(guò)package可以批量注冊(cè)別名,但是容易出現(xiàn)多個(gè)類名相同的類。 所以在package方式批量注冊(cè)別名的時(shí)候,我們可以給類中添加一個(gè)@Alias注解來(lái)給這個(gè)類指定別名:
當(dāng)mybatis掃描類的時(shí)候,發(fā)現(xiàn)類上有Alias注解,會(huì)取這個(gè)注解的value作為別名,如果沒(méi)有這個(gè)注解,會(huì)將類名小寫作為別名,如同方式2。
別名的原理mybatis允許我們給某種類型注冊(cè)一個(gè)別名,別名和類型之間會(huì)建立映射關(guān)系,這個(gè)映射關(guān)系存儲(chǔ)在一個(gè)map對(duì)象中,key為別名的名稱,value為具體的類型,當(dāng)我們通過(guò)一個(gè)名稱訪問(wèn)某種類型的時(shí)候,mybatis根據(jù)類型的名稱,先在別名和類型映射的map中按照key進(jìn)行查找,如果找到了直接返回對(duì)應(yīng)的類型,如果沒(méi)找到,會(huì)將這個(gè)名稱當(dāng)做完整的類名去解析成Class對(duì)象,如果這2步解析都無(wú)法識(shí)別這種類型,就會(huì)報(bào)錯(cuò)。 別名使用建議別名的方式可以簡(jiǎn)化類型的寫法,原本很長(zhǎng)一串的UserModel對(duì)象,現(xiàn)在只用寫個(gè)user就行了,用起來(lái)十分的方便和簡(jiǎn)潔。但是從維護(hù)上面來(lái)講,不是很方便。 所以建議自定義的類盡量別使用別名,而對(duì)mybatis中內(nèi)置的一些別名我們需要知道。 屬性配置文件詳解連接數(shù)據(jù)庫(kù)的配置,我們是直接寫在mybatis全局配置文件中的,但是上線以后可能需要進(jìn)行一些改動(dòng)切換數(shù)據(jù)庫(kù),并不是十分的優(yōu)化,所以我們通常將一些需要運(yùn)維修改的配置信息(如:db配置、郵件配置、redis配置等等各種配置)放在一個(gè)properties配文件中,然后上線時(shí),只需要運(yùn)維去修改這個(gè)配置文件就可以了,根本不用他們?nèi)バ薷暮痛a相關(guān)的文件。 mybatis也支持我們通過(guò)外部properties文件來(lái)配置一些屬性信息。 mybatis配置屬性信息有3種方式。 方式1:property元素中定義屬性屬性定義mybatis全局配置文件中通過(guò)properties元素來(lái)定義屬性信息,如下:
上面通過(guò)property元素的方式進(jìn)行配置屬性信息:
如:
使用${屬性名稱}引用屬性的值屬性已經(jīng)定義好了,我們可以通過(guò)${屬性名稱}引用定義好的屬性的值,如:
方式2:resource引入配置文件方式1中,我們的配置文件還是寫在全局配置文件中,mybatis支持從外部引入配置文件,可以把配置文件寫在其他外部文件中,然后進(jìn)行引入。 引入classes路徑中的配置文件
properties元素有個(gè)resource屬性,值為配置文件相對(duì)于classes的路徑,配置文件我們一般放在src/main/resource目錄,這個(gè)目錄的文件編譯之后會(huì)放在classes路徑中。 方式3:url的方式引入遠(yuǎn)程配置文件mybatis還提供了引入遠(yuǎn)程配置文件的方式,如下:
這次還是使用properties元素,不過(guò)使用的是url屬性,如:
屬性配置文件使用建議上面我們說(shuō)了3中方式,第2中方式是比較常見(jiàn)的做法,建議大家可以使用第二種方式來(lái)引入外部資源配置文件。
mybatis中引入mapper的3種方式mapper xml文件是非常重要的,我們寫的sql基本上都在里面,使用mybatis開(kāi)發(fā)項(xiàng)目的時(shí)候,和mybatis相關(guān)的大部分代碼就是寫sql,基本上都是和mapper xml打交道。 編寫好的mapper xml需要讓mybatis知道,我們?cè)趺醋宮ybatis知道呢? 可以通過(guò)mybatis全局配置文件進(jìn)行引入,主要有3種方式。 方式1:使用mapper resouce屬性注冊(cè)mapper xml文件目前我們所涉及到的各種例子都是采用的這種方式,使用下面的方法進(jìn)行引入:
注意事項(xiàng)
方式2:使用mapper class屬性注冊(cè)Mapper接口引入Mapper接口mybatis全局配置文件中引入mapper接口,如下:
這種情況下,mybais會(huì)去加載class對(duì)應(yīng)的接口,然后還會(huì)去加載和這個(gè)接口同一個(gè)目錄的同名的xml文件。 如:
上面這種寫法,mybatis會(huì)自動(dòng)去注冊(cè)UserMapper接口,還會(huì)去查找下面的文件:
大家以后開(kāi)發(fā)項(xiàng)目的時(shí)候估計(jì)也會(huì)看到這種寫法,Mapper接口和Mapper xml文件放在同一個(gè)包中。 方式3:使用package元素批量注冊(cè)Mapper接口批量注冊(cè)Mapper接口上面說(shuō)2種方式都是一個(gè)個(gè)注冊(cè)mapper的,如果我們寫了很多mapper,是否能夠批量注冊(cè)呢? mybatis提供了掃描包批量注冊(cè)的方式,需要在mybatis全局配置文件中加入下面配置:
mybatis會(huì)掃描package元素中name屬性指定的包及子包中的所有接口,將其當(dāng)做Mapper 接口進(jìn)行注冊(cè),所以一般我們會(huì)創(chuàng)建一個(gè)mapper包,里面放Mapper接口和同名的Mapper xml文件。 使用注意方式3會(huì)掃描指定包中所有的接口,把這些接口作為Mapper接口進(jìn)行注冊(cè),掃描到的類型只要是接口就會(huì)被注冊(cè),所以指定的包中通常我們只放Mapper接口,避免存放一些不相干的類或者接口。 關(guān)于配置和源碼本次講解到的一些配置都是在mybatis全局配置文件中進(jìn)行配置的,這些元素配置是有先后順序的,具體元素是在下面的dtd文件中定義的:
建議大家去看一下這個(gè)dtd配置文件。 總結(jié)
最后
——我是冢狐,和你一樣熱愛(ài)編程。
|
|