模塊:spring-boot-base-mongodb
在NoSQL
盛行的時代,App很大可能會涉及到MongoDB數據庫的使用,而也必須學會在Spring boot
使用Spring Data
鏈接MongoDB
進行數據增刪改查操做,以下爲詳細的操做手冊。java
直接導入spring-data-mongodb
包或者使用Spring Boot starter
git
<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>
複製代碼
#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
複製代碼
註冊Mongo
實例配置:github
@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;
}
}
複製代碼
使用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,但實際上該數據庫操做發生異常,沒執行成功。 能夠將MongoTemplate
的WriteResultChecking
屬性設置爲如下值之一:spring
EXCEPTION
:引起Exception
NONE
:不執行任何操做,默認值 對於更高級的狀況,能夠將每一個操做設置不一樣的WriteConcern
值(用於刪除,更新,插入和保存操做),則能夠在MongoTemplate
上配置WriteConcernResolver
的策略接口。 因爲MongoTemplate
用於持久化POJO
,所以WriteConcernResolver
容許您建立一個策略,該策略能夠將特定的POJO
類映射到WriteConcern
值。mongodb
WriteConcernResolver
接口:數據庫
public interface WriteConcernResolver {
WriteConcern resolve(MongoAction action);
}
複製代碼
自定義WriteConcernResolver
接口,實現不一樣WriteConcern
策略:api
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();
}
}
複製代碼
基於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){}
複製代碼
使用MongoTemplate
結合Sort
、Criteria
、Query
、Update
以及分頁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) {}
複製代碼
Sort
查詢排序類。Sort
類經常使用方法:
//構造方法建立一個排序。direction爲排序方向的枚舉類型,properties爲排序字段數組
Sort(Sort.Direction direction, String... properties)
//多個排序條件連接
and(Sort sort)
//返回升序排列對象
ascending()
//返回降序排列對象
descending()
複製代碼
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)
複製代碼
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: | 用於指定某一個字段映射到數據庫中的名稱 |