1. 程式人生 > >SpringBoot:java實現Repository統一介面操作MongoDB

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