說(shuō)說(shuō)springboot與大叔lind.ddd的淵源
mongodb在lind.ddd中被二次封裝過(guò)(大叔的.net和.net core),將它當(dāng)成是一種倉(cāng)儲(chǔ)來(lái)使用,對(duì)于開(kāi)發(fā)人員來(lái)說(shuō)只公開(kāi)curd幾個(gè)標(biāo)準(zhǔn)的接口即可,而在springboot框架里,它與大叔lind有些類似之處,同樣是被二次封裝了,開(kāi)發(fā)人員只需要關(guān)注自己的業(yè)務(wù)即可,而標(biāo)準(zhǔn)的curd操作完成由springboot幫助我們來(lái)實(shí)現(xiàn),一般地,我們會(huì)設(shè)計(jì)一個(gè)與實(shí)體對(duì)象的接口倉(cāng)儲(chǔ),讓它去繼承mongo的標(biāo)準(zhǔn)接口,然后在springboot的依賴注入框架里把標(biāo)準(zhǔn)的實(shí)現(xiàn)注入進(jìn)來(lái),這一切都是框架幫助我們實(shí)現(xiàn)的!
在項(xiàng)目中實(shí)現(xiàn)mongodb
如果項(xiàng)目需要使用mongodb去持久化數(shù)據(jù),一般可以經(jīng)過(guò)下面幾個(gè)步驟來(lái)實(shí)現(xiàn):
1 添加包依賴build.gradle
1
|
compile( 'org.springframework.boot:spring-boot-starter-data-mongodb' ) |
如果有單元測(cè)試項(xiàng)目,可以使用內(nèi)嵌的mongodb,這樣它不需要與外部資源進(jìn)行通信,工作原理:從遠(yuǎn)程下載mongodb包,啟動(dòng)它,測(cè)試完成后刪除生成的集合
1
|
testcompile( 'de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.0.3' ) |
2 添加默認(rèn)的配置項(xiàng)application.yml
1
2
3
4
5
6
|
spring: data: mongodb: uri: mongodb: //192.168.99.100:27017/test password: guest username: guest |
3 添加mongodb集合對(duì)應(yīng)的實(shí)體類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/** * 地址. */ @data @noargsconstructor @allargsconstructor public class address { /** * 編號(hào). */ @id private string id; /** * 省. */ private string province; /** * 市. */ private string city; /** * 區(qū). */ private string district; /** * 狀態(tài). */ private status status; } |
4 添加實(shí)體所對(duì)應(yīng)的倉(cāng)庫(kù)類,它需要繼承extends標(biāo)準(zhǔn)的mongodb倉(cāng)儲(chǔ),同時(shí)mongodb倉(cāng)儲(chǔ)支持自動(dòng)定約定的方法,開(kāi)發(fā)人員可以通過(guò)@query注釋來(lái)確定返回的字段列表,這對(duì)于大數(shù)據(jù)文檔是很必要的,如果默認(rèn)的接口不能滿足我們的要求,我們需要定義個(gè)性化的接口,并去實(shí)現(xiàn)它,下面的例子中,我們的addressextrepository就是一個(gè)個(gè)性化接口,我們對(duì)外的接口addressrepository 需要繼承它,注意,大叔認(rèn)為這樣破獲了面向?qū)ο蟮拈_(kāi)閉原則,元芳,你怎么看!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * 對(duì)外提供的地址倉(cāng)儲(chǔ)接口,繼承所有地址相關(guān)的接口. */ public interface addressrepository extends addressextrepository, mongorepository<address, string> { /** * 根據(jù)省,拿地址列表. * * @param province * @return */ @query (fields = "{'province': 0}" ) list<address> findaddressesbyprovince(string province); /** * 根據(jù)省和省,拿地址列表. * * @param province * @param city * @return */ @query () //fields表示包含的字段 list<address> findaddressesbyprovinceandcityanddistrict(string province, string city, string district); } |
個(gè)性化倉(cāng)儲(chǔ)實(shí)現(xiàn),使用mongotemplate對(duì)象與mongodb數(shù)據(jù)庫(kù)進(jìn)行交互!
1
2
3
4
5
6
7
8
9
10
11
12
|
/** * 特殊規(guī)則的倉(cāng)儲(chǔ)實(shí)現(xiàn). */ public class addressextrepositoryimpl implements addressextrepository { @autowired mongotemplate mongotemplate; @override public address findbyprovinceandcity(string province, string city) { query query = new query(criteria.where( "province" ).is(province).and( "city" ).is(city)); return mongotemplate.findone(query, address. class , "address" ); } } |
5 controller中直接通過(guò)@autowired注解來(lái)訪問(wèn)倉(cāng)儲(chǔ)和業(yè)務(wù)對(duì)象即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@restcontroller public class mongocontroller { // 倉(cāng)儲(chǔ). @autowired private addressrepository repository; // 用戶業(yè)務(wù). @autowired private userservice userservice; /** * 得到地址列表. * * @return */ @requestmapping ( "/address/{province}" ) public address getaddress( @pathvariable ( "province" ) string province) { system.out.println( "1,province=" + province); return userservice.getaddress(province); } } |
總結(jié)
以上所述是小編給大家介紹的springboot mongodb的集成與使用實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!
原文鏈接:https://www.cnblogs.com/lori/archive/2018/04/18/8875701.html