1. 程式人生 > >springboot~Mongodb的整合與使用

springboot~Mongodb的整合與使用

說說springboot與大叔lind.ddd的淵源

Mongodb在Lind.DDD中被二次封裝過(大叔的.net和.net core),將它當成是一種倉儲來使用,對於開發人員來說只公開curd幾個標準的介面即可,而在springboot框架裡,它與大叔lind有些類似之處,同樣是被二次封裝了,開發人員只需要關注自己的業務即可,而標準的curd操作完成由springboot幫助我們來實現,一般地,我們會設計一個與實體物件的介面倉儲,讓它去繼承mongo的標準介面,然後在springboot的依賴注入框架裡把標準的實現注入進來,這一切都是框架幫助我們實現的!

在專案中實現mongodb

如果專案需要使用mongodb去持久化資料,一般可以經過下面幾個步驟來實現:

1 新增包依賴build.gradle

compile('org.springframework.boot:spring-boot-starter-data-mongodb')

如果有單元測試專案,可以使用內嵌的mongodb,這樣它不需要與外部資源進行通訊,工作原理:從遠端下載mongodb包,啟動它,測試完成後刪除生成的集合

testCompile('de.flapdoodle.embed:de.flapdoodle.embed.mongo:2.0.3')

2 新增預設的配置項application.yml

spring:
  data:
    mongodb:
      uri: mongodb:
//192.168.99.100:27017/Test password: guest username: guest

3 新增mongodb集合對應的實體類

/**
 * 地址.
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {

  /**
   * 編號.
   */
  @Id
  private String id;
  /**
   * 省.
   */
  private String province;
  /**
   * 市.
   
*/ private String city; /** * 區. */ private String district; /** * 狀態. */ private Status status; }

4 新增實體所對應的倉庫類,它需要繼承extends標準的mongodb倉儲,同時Mongodb倉儲支援自動定約定的方法,開發人員可以通過@Query註釋來確定返回的欄位列表,這對於大資料文件是很必要的,如果預設的介面不能滿足我們的要求,我們需要定義個性

化的介面,並去實現它,下面的例子中,我們的AddressExtRepository就是一個個性化介面,我們對外的介面AddressRepository 需要繼承它,注意,大叔認為這樣破獲了面向物件的開閉原則,元芳,你怎麼看!

/**
 * 對外提供的地址倉儲介面,繼承所有地址相關的介面.
 */
public interface AddressRepository extends
AddressExtRepository,
MongoRepository<Address, String> { /** * 根據省,拿地址列表. * * @param province * @return */ @Query(fields = "{'province': 0}") List<Address> findAddressesByProvince(String province); /** * 根據省和省,拿地址列表. * * @param province * @param city * @return */ @Query()//fields表示包含的欄位 List<Address> findAddressesByProvinceAndCityAndDistrict(String province, String city, String district); }

個性化倉儲實現,使用MongoTemplate物件與mongodb資料庫進行互動!

/**
 * 特殊規則的倉儲實現.
 */
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註解來訪問倉儲和業務物件即可

@RestController
public class MongoController {
  // 倉儲.
  @Autowired
  private AddressRepository repository;

  // 使用者業務.
  @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);
  }
}

感謝各位的閱讀!

對知識的探索我們還在繼續!