MongoDB–Spring Data MongoDB詳細操作(增刪改查)


github:https://github.com/Ccww-lx/Sp...

 在NoSQL盛行的時代,App很大可能會涉及到MongoDB數據庫的使用,而也必須學會在Spring boot使用Spring Data連接MongoDB進行數據增刪改查操作,如下為詳細的操作手冊。

依賴

直接導入spring-data-mongodb包或者使用Spring Boot starter

<dependencies> <!-- other dependency elements omitted --> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.2.0.RELEASE</version> </dependency> </dependencies> <!--spring 框架使用最新的 --> <spring.framework.version>5.2.0.RELEASE</spring.framework.version> <!--用一即可--> <!--使用Spring Boot starter--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 

屬性文件application.properties


#mongodb連接地址,集群用“;”隔開 spring.mongo.mongoDatabaseAddress=10.110.112.165:27092;10.110.112.166:27092 #mongo數據名 spring.mongo.dbname=mongodb #mongo用戶 spring.mongo.username=mongodbopr #mongo密碼 spring.mongo.password=123456 #mongo最大連接數 spring.mongo.connectionsPerHost=50 

mongoDB 配置

注冊Mongo實例配置:

@Configuration public class MongodbConfig { public static final String COMMA = ";"; public static final String COLON = ":"; @Value("${spring.mongo.mongoDatabaseAddress}") private String mongoDatabaseAddress; @Value("${spring.mongo.username}") private String username; @Value("${spring.mongo.dbname}") private String dbname; @Value("${spring.mongo.password}") private String password; @Value("${spring.mongo.connectionsPerHost}") private String connectionsPerHost; /** * 獲取mongodb的地址 * * @return */ private List<ServerAddress> getMongoDbAddress() { List<ServerAddress> serverAddrList = new ArrayList<ServerAddress>(); //如果有多個服務器的話 if (this.mongoDatabaseAddress.indexOf(COMMA) > 0) { String[] addressArrays = mongoDatabaseAddress.split(COMMA); String[] hostPort; for (String address : addressArrays) { hostPort = address.split(COLON); ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1])); serverAddrList.add(serverAdress); } } else { String[] hostPort = mongoDatabaseAddress.split(COLON); ServerAddress serverAdress = new ServerAddress(hostPort[0], Integer.valueOf(hostPort[1])); serverAddrList.add(serverAdress); } return serverAddrList; } /** * 設置連接參數 */ private MongoClientOptions getMongoClientOptions() { MongoClientOptions.Builder builder = MongoClientOptions.builder(); // todo 添加其他參數配置 //最大連接數 builder.connectionsPerHost(Integer.valueOf(connectionsPerHost)); MongoClientOptions options = builder.readPreference(ReadPreference.nearest()).build(); return options; } /** * * @return */ @Bean public MongoClient mongoClient() { //使用數據庫名、用戶名密碼登錄 MongoCredential credential = MongoCredential.createCredential(username, dbname, password.toCharArray()); //創建Mongo客戶端 return new MongoClient(getMongoDbAddress(), credential, getMongoClientOptions()); } /** * 注冊mongodb操作類 * @param mongoClient * @return */ @Bean @ConditionalOnClass(MongoClient.class) public MongoTemplate mongoTemplate(MongoClient mongoClient) { MongoTemplate mongoTemplate = new MongoTemplate(new SimpleMongoDbFactory(mongoClient, dbname)); return mongoTemplate; } } 

mongoDB操作

使用MongoTemplate類進行增刪改查

@Service
public class MongodbService { @Autowired private MongoTemplate mongoTemplate; /** * 新增文檔 * * @param userDTO * @return */ public UserDTO insert(UserDTO userDTO) { //insert方法並不提供級聯類的保存,所以級聯類需要先自己先保存 return mongoTemplate.insert(userDTO); } public UserDTO save(UserDTO userDTO) { Sort sort = new Sort(Sort.Direction.DESC, "name"); userDTO = mongoTemplate.findOne(Query.query(Criteria.where("")).with(sort), UserDTO.class); return mongoTemplate.save(userDTO); } /** * 刪除文檔 * NOTE:remove方法不支持級聯刪除所以要單獨刪除子數據 * @param name */ public void remove(String name) { //根據名字查詢數據並刪除 UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)), UserDTO.class); //remove方法不支持級聯刪除所以要單獨刪除子數據 List<AddressDTO> addressList = userDTO.getAddressList(); for (AddressDTO addressDTO : addressList) { mongoTemplate.remove(addressDTO); } //刪除主數據 mongoTemplate.remove(userDTO); } /** * 更新文檔 * @param userDTO */ public void update(UserDTO userDTO) { mongoTemplate.updateFirst(Query.query(Criteria.where("name").is(userDTO.getName())), Update.update("age", userDTO.getAge()), UserDTO.class); } /** * 查詢文檔 * @param name */ public void find(String name) { Sort sort = new Sort(Sort.Direction.DESC, "name"); List<UserDTO> userDTOS = mongoTemplate.find(Query.query(Criteria.where("name").is(name)), UserDTO.class); //基於sort排序使用findOne查詢最新一條記錄 UserDTO userDTO = mongoTemplate.findOne(Query.query(Criteria.where("name").is(name)).with(sort), UserDTO.class); //模糊查詢 List<UserDTO> userDTOList = mongoTemplate.find(Query.query(Criteria.where("name").is(name).regex(name)).with(sort), UserDTO.class); //分頁查詢 Pageable pageable = PageRequest.of(3, 20, sort); List<UserDTO> userDTOPageableList = mongoTemplate.find(Query.query(Criteria.where("name").is(name)).with(pageable), UserDTO.class); //總數 long conut = mongoTemplate.count(Query.query(Criteria.where("name").is(name)), UserDTO.class); Page<UserDTO> page = new PageImpl(userDTOPageableList, pageable, conut); } } 

NOTE:
  在開發中,如果從任何MongoDB操作返回的com.mongodb.WriteResult包含錯誤,則可以方便地記錄或引發異常。 通常,在開發過程中很容易忘記執行此操作,然后最終得到一個看似運行成功的App,但實際上該數據庫操作發生異常,沒執行成功。 可以將MongoTemplateWriteResultChecking屬性設置為以下值之一:

  • EXCEPTION:引發Exception
  • NONE:不執行任何操作,默認值

  對於更高級的情況,可以將每個操作設置不同的WriteConcern值(用於刪除,更新,插入和保存操作),則可以在MongoTemplate上配置WriteConcernResolver的策略接口。 由於MongoTemplate用於持久化POJO,因此WriteConcernResolver允許您創建一個策略,該策略可以將特定的POJO類映射到WriteConcern值。

WriteConcernResolver接口:

public interface WriteConcernResolver { WriteConcern resolve(MongoAction action); } 

自定義WriteConcernResolver接口,實現不同WriteConcern策略:

private class MyAppWriteConcernResolver implements WriteConcernResolver { public WriteConcern resolve(MongoAction action) { if (action.getEntityClass().getSimpleName().contains("UserDTO")) { return WriteConcern.NONE; } else if (action.getEntityClass().getSimpleName().contains("Metadata")) { return WriteConcern.JOURNAL_SAFE; } return action.getDefaultWriteConcern(); } } 

 常用的類以及方法解析

5.1 MongoClient、ServerAddress、MongoCredential以及MongoClientOptions

  基於ServerAddress單機或者Replica Set在使用MongoClient連接mongodb數據庫注冊mongo實例,在注冊示例中可能要使得MongoCredential賬號密碼驗證以及使用MongoClientOptions配置mongodb其他的參數。

MongoClient常用的構造器方法:

public MongoClient(String host){} public MongoClient(MongoClientURI uri){} public MongoClient(String host, MongoClientOptions options) {} public MongoClient(ServerAddress addr, MongoCredential credential, MongoClientOptions options){} public MongoClient(List<ServerAddress> seeds, MongoCredential credential, MongoClientOptions options){} 

5.2 MongoTemplate

使用MongoTemplate結合SortCriteriaQueryUpdate以及分頁Pageable類靈活地進行對mongodb數據庫進行增刪改查。

query方法:

//根據查詢條件查詢 public <T> List<T> find(Query query, Class<T> entityClass){} //根據查詢條件查詢返回一條記錄 public <T> <T>findOne(Query query, Class<T> entityClass){} //查詢該collection所有記錄 public <T> List<T> findAll(Class<T> entityClass){} 

insert方法:

//新增一條記錄 public <T> T insert(T objectToSave){} //在collectionName中新增一條記錄 public <T> T insert(T objectToSave, String collectionName) {} // public <T> T save(T objectToSave){} 

remove方法:

//根據Object刪除 public DeleteResult remove(Object object) {} //根據查詢條件進行刪除 public DeleteResult remove(Query query, Class<?> entityClass){}

update方法:


 // public UpdateResult upsert(Query query, Update update, Class<?> entityClass) {} //更新查詢出來的第一條記錄 public UpdateResult updateFirst(Query query, Update update, String collectionName) {} 

5.3 Sort

Sort查詢排序類。Sort類常用方法:

//構造方法創建一個排序。direction為排序方向的枚舉類型,properties為排序字段數組 Sort(Sort.Direction direction, String... properties) //多個排序條件鏈接 and(Sort sort) //返回升序排列對象 ascending() //返回降序排列對象 descending() 

5.4 Criteria

Criteria查詢條件類,類似於SQL的where,常用方法:

//聲明定義查詢條件,且為靜態方法 where(String key) //與操作 and(String key) //正則表達式,即可為模糊查詢 regex(String re) //包含 in(Object... o) //大於 gt(Object o) //大於等於 gte(Object o) //等於 is(Object o) //小於 lt(Object o) //小於等於 lte(Object o) //非 not() //創建與操作 andOperator(Criteria... criteria) 

5.5 Query

Query查詢對象,具有查詢的全部信息,其中包括篩選條件、排序、返回數量等。常用的方法:

//定義查詢對象,靜態方法 query(CriteriaDefinition criteriaDefinition) //在本次查詢添加一個CriteriaDefinition查詢條件 addCriteria(CriteriaDefinition criteriaDefinition) //添加一個Sort排序對象 with(Sort sort) //添加一個Pageable分頁對象、通常情況下,分頁和排序一起使用。 with(Pageable pageable) 

詳細接口信息可查看【MogoDB API官方文檔】

常用注解

 

注解 解析
@Id 用於標記id字段,沒有標記此字段的實體也會自動生成id字段,但是我們無法通過實體來獲取id。id建議使用ObjectId類型來創建
@Document 用於標記此實體類是mongodb集合映射類
@DBRef 用於指定與其他集合的級聯關系,但是需要注意的是並不會自動創建級聯集合
@Indexed 用於標記為某一字段創建索引
@CompoundIndex 用於創建復合索引
@TextIndexed: 用於標記為某一字段創建全文索引
@Language 指定documen語言
@Transient: 被該注解標注的,將不會被錄入到數據庫中。只作為普通的javaBean屬性
@Field: 用於指定某一個字段映射到數據庫中的名稱


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM