SpringBoot:java實現Repository統一介面操作MongoDB
一. Spring如何操作MongoDB?
1.Spring data jpa for MongoDB
2.使用Google的Morphia框架操作MongoDB
3.使用MongoDB原生的驅動,類似JDBC的原生驅動
這裡針對第一種方式.
二.如何實現Repository統一介面
1.使用SpringBoot快速建立專案,pom.xml中引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId >
</dependency>
2.總配置檔案bootstrap.properties中配置MongoDB驅動
spring.datasource.mongo.url=mongodb://diseasediscuss:[email protected]{ip}:27017/diseasediscuss?authSource=diseasediscuss
spring.datasource.mongo.database=diseasediscuss
3.MongoDB配置類
package com.dachen.config;
import com.dachen .support.dao.BaseRepositoryImpl;
import com.dachen.util.IDGenerator;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation .Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
/**
* basePackages:設定Repository的掃描目錄
* mongoTemplateRef:mongo模板類引用,類似於JDBCTemplate
* repositoryBaseClass:設定預設的Repository實現類為BaseRepositoryImpl,代替SimpleMongoRepository
*/
@Configuration
@EnableMongoRepositories(
basePackages={"com.dachen.disease.model.po",
"com.dachen.disease.dao",
"com.dachen.question.dao"},
mongoTemplateRef="diseaseMongoTemplate",
repositoryBaseClass = BaseRepositoryImpl.class)
public class MongodbConfig {
@Autowired
private ConfigProperties configProperties;
@Value("${spring.datasource.mongo.url}")
private String mongoUri;
@Value("${spring.datasource.mongo.database}")
private String dbName;
@Bean(name="diseaseMongoTemplate")
public MongoTemplate diseaseMongoTemplate() throws Exception {
MappingMongoConverter converter = new MappingMongoConverter(
new DefaultDbRefResolver(mongodbFactory()),
new MongoMappingContext());
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
return new MongoTemplate(mongodbFactory(), converter);
}
@Bean
public MongoDbFactory mongodbFactory() throws Exception {
MongoClientURI mongoClientUri = new MongoClientURI(mongoUri);
return new SimpleMongoDbFactory(new MongoClient(mongoClientUri), dbName);
}
@Bean
public IDGenerator idGenerator(){
return new IDGenerator(configProperties.getWorkerId(),0);
}
}
3.Repository統一介面
package com.dachen.support.dao;
import com.dachen.util.PageVO;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.repository.NoRepositoryBean;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* Created by wanghong on 2017/9/21
*/
@NoRepositoryBean //避免spring掃描BaseRepository
public interface BaseRepository<T, ID extends Serializable> extends MongoRepository<T,ID> {
void batchSave(List<T> obj);
void batchDelete(List<ID> pks);
void update(ID id, Map<String, Object> updateFieldMap);
void update(Map<String,Object> queryParamMap, Map<String, Object> updateFieldMap);
PageVO<T> findPage(Integer pageIndex, Integer pageSize, Map<String, Integer> sortMap);
T findByIdAndType(Long id,Integer type);
PageVO<T> findPageWithParam(Map<String,Object> queryParamMap,String searchKey,Integer pageIndex, Integer pageSize, Map<String,Integer> sortMap);
}
4.Repository統一介面實現類
package com.dachen.support.dao;
import com.dachen.disease.model.enums.CommonEnum;
import com.dachen.util.PageVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
* @author wanghong
* @desc
* @date: 2017/9/21 10:40
* @Copyright (c) 2017, DaChen All Rights Reserved.
*/
public class BaseRepositoryImpl<T, ID extends Serializable> extends SimpleMongoRepository<T,ID> implements BaseRepository<T,ID> {
protected final MongoOperations mongoTemplate;
protected final MongoEntityInformation<T, ID> entityInformation;
private Class<T> clazz;
public BaseRepositoryImpl(MongoEntityInformation<T, ID> metadata, MongoOperations mongoOperations) {
super(metadata, mongoOperations);
this.mongoTemplate=mongoOperations;
this.entityInformation = metadata;
clazz = entityInformation.getJavaType();
}
@Override
public T findByIdAndType(Long id,Integer type){
Criteria criatira = new Criteria();
criatira.andOperator(Criteria.where("_id").is("id"), Criteria.where("type").is(type));
T t = mongoTemplate.findOne(new Query(criatira), clazz);
return t;
}
/**
* @param id 更新主鍵
* @param updateFieldMap key:需要更新的屬性 value:對應的屬性值
*/
@Override
public void update(ID id, Map<String, Object> updateFieldMap) {
if (updateFieldMap != null || !updateFieldMap.isEmpty()) {
Criteria criteria = new Criteria("_id").is(id);
Update update = new Update();
updateFieldMap.entrySet().forEach(entry -> update.set(entry.getKey(),entry.getValue()));
mongoTemplate.findAndModify(new Query(criteria), update, clazz);
}
}
/**
* @param queryParamMap 查詢引數
* @param updateFieldMap 更新引數
*/
@Override
public void update(Map<String,Object> queryParamMap, Map<String, Object> updateFieldMap) {
if (queryParamMap != null || !queryParamMap.isEmpty()){
List<Criteria> criteriaList = new ArrayList<>();
for (Map.Entry<String,Object> entry:queryParamMap.entrySet()){
criteriaList.add(Criteria.where(entry.getKey()).is(entry.getValue()));
}
int size = criteriaList.size();
Criteria[] criterias = new Criteria[size];
for (int i=0;i<size;i++){
criterias[i] = criteriaList.get(i);
}
Criteria criteria = new Criteria( ).andOperator(criterias);
if (updateFieldMap != null || !updateFieldMap.isEmpty()) {
Update update = new Update();
updateFieldMap.entrySet().forEach(entry -> update.set(entry.getKey(),entry.getValue()));
mongoTemplate.findAndModify(new Query(criteria), update, clazz);
}
}
}
@Override
public void batchSave(List<T> obj) {
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(obj)) {
//過濾掉集合中的空物件
obj = obj.stream().filter(o -> Objects.nonNull(o)).collect(Collectors.toList());
save(obj);
}
}
@Override
public void batchDelete(List<ID> pks) {
if (org.apache.commons.collections.CollectionUtils.isNotEmpty(pks)) {
Query query = new Query(Criteria.where("_id").in(pks));
mongoTemplate.findAllAndRemove(query,clazz);
}
}
/**
* 分頁查詢列表
* @param pageIndex
* @param pageSize
* @param sortMap 排序 key:排序欄位 value:升序0或降序1
* @return
*/
public PageVO<T> findPage(Integer pageIndex, Integer pageSize, Map<String,Integer> sortMap) {
List<Sort.Order> orders = new ArrayList<>();
Pageable pageable = null;
if (sortMap != null && !sortMap.isEmpty()){
sortMap.entrySet().forEach(entry -> orders.add(new Sort.Order(entry.getValue() == 0 ? Sort.Direction.ASC:Sort.Direction.DESC, entry.getKey())));
pageable = new PageRequest(pageIndex, pageSize, new Sort(orders));
}else {
pageable = new PageRequest(pageIndex, pageSize);
}
Page<T> page = findAll(pageable);
PageVO<T> pageVO = new PageVO<>(pageIndex, pageSize);
pageVO.setPageData(page.getContent());
pageVO.setTotal(page.getTotalElements());
return pageVO;
}
/**
* 帶關鍵字和條件的查詢分頁,只針對病例搜尋
* @param queryParamMap
* @param searchKey
* @param pageIndex
* @param pageSize
* @param sortMap
* @return
*/
public PageVO<T> findPageWithParam(Map<String,Object> queryParamMap,String searchKey,Integer pageIndex, Integer pageSize, Map<String,Integer> sortMap) {
if (queryParamMap == null || queryParamMap.isEmpty()) {
return findPage(pageIndex, pageSize, sortMap);
}
List<Criteria> criteriaList = new ArrayList<>();
for (Map.Entry<String,Object> entry:queryParamMap.entrySet()){
criteriaList.add(Criteria.where(entry.getKey()).is(entry.getValue()));
}
Criteria criteria1 = Criteria.where("status").is(CommonEnum.Status.NORMAL.getIndex());
criteriaList.add(criteria1);
if(StringUtils.isNotBlank(searchKey)){
Criteria criteriaPattern = new Criteria();
Pattern p1 = Pattern.compile(String.format(".*%1$s.*", searchKey), Pattern.CASE_INSENSITIVE);
criteriaPattern.orOperator( Criteria.where("userName").regex(p1), Criteria.where("title").regex(p1));
criteriaList.add(criteriaPattern);
}
Criteria[] criterias = new Criteria[criteriaList.size()];
criterias = criteriaList.toArray(criterias);
Criteria criteria = new Criteria( ).andOperator(criterias);
Query query = new Query(criteria);
if (sortMap != null && !sortMap.isEmpty()) {
List<Sort.Order> orders = new ArrayList<>();
sortMap.entrySet().forEach(entry -> orders.add(new Sort.Order(entry.getValue() == 0 ? Sort.Direction.ASC:Sort.Direction.DESC, entry.getKey())));
Sort sort = new Sort(orders);
query.with(sort);
}
long total = this.mongoTemplate.count(query, clazz);
query.skip(pageIndex*pageSize);
query.limit(pageSize);
List<T> data = this.mongoTemplate.find(query, clazz);
PageVO<T> pageVO = new PageVO<>();
pageVO.setPageIndex(pageIndex);
pageVO.setPageSize(pageSize);
pageVO.setTotal(total);
pageVO.setPageData(data);
return pageVO;
}
}
然後具體的業務DAO就可以繼承BaseRepository
package com.dachen.disease.dao;
import com.dachen.disease.model.po.Disease;
import com.dachen.support.dao.BaseRepository;
/**
* @author wanghong
* @desc
* @date: 2017/9/25 17:19
* @Copyright (c) 2017, DaChen All Rights Reserved.
*/
public interface DiseaseRepository extends BaseRepository<Disease,Long> {
/**
* 根據病例id查詢病例資訊
* @param id
* 病例id
* @param status
* 病例帖子狀態
*/
Disease findByIdAndStatus(Long id, Integer status);
}
相關推薦
SpringBoot:java實現Repository統一介面操作MongoDB
一. Spring如何操作MongoDB? 1.Spring data jpa for MongoDB 2.使用Google的Morphia框架操作MongoDB 3.使用MongoDB原生的驅動,類似JDBC的原生驅動 這裡針對第一種方式. 二.如何
java實現樹的一般操作
表示 rom class ado span .get poll() tno 2層 樹是數據結構中最基本的結構,今天的博客更新一下樹的基本操作: 樹的節點結構: package tree; /** * TreeNode: 普通的樹節點 *
zookeeper和java實現的統一配置管理和叢集節點管理簡單案例
1.首先談談對zookeeper的認識,以下簡稱zk zk做為服務存在,是以三個或者三個以上存在的。服務節點啟動不分先後,他會自動選取出leader和follower。 服務奇數個更有利於容錯,資料一致性可以谷歌下paxos演算法。 2.其次是我們自己開發
Java實現圖形化介面的計算器加法小程式
對於一個簡單的計算器加法小程式,它首先是由五個元件構成的,三個文字框,兩個用來輸入數字,一個用來輸出最後的結果,接下來是一個標籤,標籤的內容是加號,表示這裡計算的是加法,最後一個組建是一個按鈕,點選該按鈕時會輸出計算的結果.在這個小程式中,我們採用的佈局管理器時Flo
Java實現oracle資料批量操作
java事務處理 TestDemo:結合位於java.sql下面的介面 PreparedStatement和oracle事務實現批量刪除 常用方法: int [] executeBatch(): 將一批命令提交給資料庫來執行,如果全部命令執行成功,則返回更新計陣列成的陣列。 vo
java實現棧的簡單操作
public class stract { public static void main(String[] args) { MyStack stack = new MyStack(20); stack.push(10);
java實現安全證書相關操作
package test; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException
Java實現Web Api介面遠端呼叫
package com.watering.as.web.utils; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.URL; import java.net.
JAVA實現阿里雲介面完成簡訊驗證
一、maven依賴 <!--用於阿里雲簡訊驗證的--> <!-- https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-core --> &n
Java 實現 HDFS 檔案基本操作
1. pom <hadoop.version>2.7.3</hadoop.version> <dependency> <groupId>org.apache.hadoop</grou
Java實現對cookie的操作(增刪改查)
/** * 讀取所有cookie * 注意二、從客戶端讀取Cookie時,包括maxAge在內的其他屬性都是不可讀的,也不會被提交。瀏覽器提交Cookie時只會提交name與value屬性。maxAge屬性只被瀏覽器用來判斷Cookie是
java實現自動化測試介面訪問(一)
一、前置準備: 二、程式碼實現 1. 使用PostMan輸入訪問的介面,取得需要的欄位,items,和items中repository的欄位id,和full_name(可以自己獲取想要的欄位)
java實現模擬滑鼠鍵盤操作
用java寫指令碼,首先需要用到Robot類 ,也就是機器人類。先new一個Robot物件然後呼叫裡面的方法 ,keyPress方法是按下鍵盤上的某個鍵,比如下面程式碼裡面寫的keyPress(KeyEvevt.VK_Y); 括號裡面VK後面的字母就是要按下的鍵,然後按下了
JAVA實現圖的基本操作——生成鄰接表結構的圖、輸出鄰接矩陣、深度優先遍歷
1、定義的圖的資料結構,對於有向圖和無向圖是通用的。 2、在資料結構中定義了遍歷標誌,方便深度優先遍歷的實現。 3、遇到最大的bug就是: //weight=edgs[i].charAt(2); //這裡特別容易出處,每次獲取int數值的時候都要特別注意。 //wei
Java 實現對mongodb and or 和and or聯合查詢操作
AND:publicvoid testAnd(){ //agender='female' AND age > 27 DBObject queryCondition = new BasicDBObject(); que
Java 實現介面的字串連線操作
實現如下介面 詳細過程 一、建立一個類繼承窗體類並實現監聽介面 二、屬性: 5個標籤,串1,串2,+,=,結果
在SpringBoot下用java操作MongoDB資料庫的增刪改查
首先我們需要建立一個SpringBoot工程,在IDEA中有快捷的建立方式。new -> project -> Spring Initializr 根據需要一路next下去即可第二步,給application.properties新增MongoDB配置#Mongo
用java實現對MongoDB的基本操作(增刪改查)
準備工作:要想用java實現對MongoDB的增刪改查,首先需要下載mongo的java驅動,mongo-java-driver-3.2.2, 下載地址:https://oss.sonatype.org/content/repositories/releases/org/m
【MongoDB】-Java實現對mongodb的And、Or、In操作
1)And(同時滿足多個條件時用And) public void testAnd(){ DBObject queryCondition = new BasicDBObject();
Java實現對MongoDB的AND、OR和IN操作
在MongoDB的官方文件中關於Java操作的介紹,只給出了很簡單的幾個例子。這些例子雖然可以滿足一定的需求,但是還並不是太完全。下面是我根據網頁中的提示寫的幾個例子。 1