說說springboot與大叔lind.ddd的淵源
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)藤縣,十載網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
MongoDB在Lind.DDD中被二次封裝過(大叔的.net和.net core),將它當(dāng)成是一種倉儲(chǔ)來使用,對于開發(fā)人員來說只公開curd幾個(gè)標(biāo)準(zhǔn)的接口即可,而在springboot框架里,它與大叔lind有些類似之處,同樣是被二次封裝了,開發(fā)人員只需要關(guān)注自己的業(yè)務(wù)即可,而標(biāo)準(zhǔn)的curd操作完成由springboot幫助我們來實(shí)現(xiàn),一般地,我們會(huì)設(shè)計(jì)一個(gè)與實(shí)體對象的接口倉儲(chǔ),讓它去繼承mongo的標(biāo)準(zhǔn)接口,然后在springboot的依賴注入框架里把標(biāo)準(zhǔn)的實(shí)現(xiàn)注入進(jìn)來,這一切都是框架幫助我們實(shí)現(xiàn)的!
在項(xiàng)目中實(shí)現(xiàn)mongodb
如果項(xiàng)目需要使用mongodb去持久化數(shù)據(jù),一般可以經(jīng)過下面幾個(gè)步驟來實(shí)現(xiàn):
1 添加包依賴build.gradle
compile('org.springframework.boot:spring-boot-starter-data-mongodb')
如果有單元測試項(xiàng)目,可以使用內(nèi)嵌的mongodb,這樣它不需要與外部資源進(jìn)行通信,工作原理:從遠(yuǎn)程下載mongodb包,啟動(dòng)它,測試完成后刪除生成的集合
testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.0.3')
2 添加默認(rèn)的配置項(xiàng)application.yml
spring: data: mongodb: uri: mongodb://192.168.99.100:27017/Test password: guest username: guest
3 添加mongodb集合對應(yīng)的實(shí)體類
/** * 地址. */ @Data @NoArgsConstructor @AllArgsConstructor public class Address { /** * 編號. */ @Id private String id; /** * 省. */ private String province; /** * 市. */ private String city; /** * 區(qū). */ private String district; /** * 狀態(tài). */ private Status status; }
4 添加實(shí)體所對應(yīng)的倉庫類,它需要繼承extends標(biāo)準(zhǔn)的mongodb倉儲(chǔ),同時(shí)Mongodb倉儲(chǔ)支持自動(dòng)定約定的方法,開發(fā)人員可以通過@Query注釋來確定返回的字段列表,這對于大數(shù)據(jù)文檔是很必要的,如果默認(rèn)的接口不能滿足我們的要求,我們需要定義個(gè)性化的接口,并去實(shí)現(xiàn)它,下面的例子中,我們的AddressExtRepository就是一個(gè)個(gè)性化接口,我們對外的接口AddressRepository 需要繼承它,注意,大叔認(rèn)為這樣破獲了面向?qū)ο蟮拈_閉原則,元芳,你怎么看!
/** * 對外提供的地址倉儲(chǔ)接口,繼承所有地址相關(guān)的接口. */ public interface AddressRepository extends AddressExtRepository, MongoRepository { /** * 根據(jù)省,拿地址列表. * * @param province * @return */ @Query(fields = "{'province': 0}") List findAddressesByProvince(String province); /** * 根據(jù)省和省,拿地址列表. * * @param province * @param city * @return */ @Query()//fields表示包含的字段 List findAddressesByProvinceAndCityAndDistrict(String province, String city, String district); }
個(gè)性化倉儲(chǔ)實(shí)現(xiàn),使用MongoTemplate對象與mongodb數(shù)據(jù)庫進(jìn)行交互!
/** * 特殊規(guī)則的倉儲(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中直接通過@Autowired注解來訪問倉儲(chǔ)和業(yè)務(wù)對象即可
@RestController public class MongoController { // 倉儲(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í)例詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對創(chuàng)新互聯(lián)網(wǎng)站的支持!