Java中使用MongoUtils對mongodb數據庫進行增、刪、查、改


本文主要介紹在java應用中如何使用MongoUtils工具類對 mongodb進行增、刪、查、改操作。

一、配置

1、將 common.jar庫引入到項目環境中: (源代碼:https://gitee.com/cnsugar/common,可直接下載lib目錄下的jar文件使用) 

  如果是maven項目,可以通過mvn install命令將common.jar加入到本地倉庫:

mvn install:install-file -Dfile=D:\lib\common-1.0.jar -DgroupId=com.cnsugar -DartifactId=common -Dversion=1.0 -Dpackaging=jar

然后在pom.xml中加入以下配置:

<dependency>
    <groupId>com.cnsugar</groupId>
    <artifactId>common</artifactId>
    <version>1.0</version>
</dependency>

  

  也可以直接將jar文件放到項目中,用下面的方式引入:

<dependency>
<groupId>com.cnsugar</groupId>
<artifactId>common</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/common-1.0.jar</systemPath>
</dependency>

 

2、用同樣的方式將 common-mongodb.jar庫引入到項目環境中: (源代碼:https://gitee.com/cnsugar/common-mongondb,可直接下載lib目錄下的jar文件使用) 

3、增加依賴包  

    <properties>
        <fastjson-version>1.2.23</fastjson-version>
        <spring.version>4.2.8.RELEASE</spring.version>
        <spring.mongodb-version>1.9.5.RELEASE</spring.mongodb-version>
        <mongo-version>3.3.0</mongo-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson-version}</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- mongo -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>${spring.mongodb-version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>${mongo-version}</version>
        </dependency>
    </dependencies>

 

 

4、增加spring配置文件

  mongodb-config.properties

#集群模式
#mongodb.hosts=10.10.10.239:20000,10.10.10.224:20000,10.10.10.238:20000

#單機模式 mongodb.host=192.168.241.34 mongodb.port=27017

#數據庫名稱 mongodb.dataname=DataGateway

 

 

  spring-context-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
          
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:mongodb-config.properties</value>
            </list>
        </property>
    </bean>
</beans>

 

  如果需要在項目中讀取其他配置文件中的內容,可以將org.springframework.beans.factory.config.PropertyPlaceholderConfigurer 換成 com.cnsugar.common.config.SystemConfig,可以直接使用SystemConfig中的靜態get方法讀取配置文件。

  

  spring-context-mongodb.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"
    xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd  
          http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd 
          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <mongo:mongo-client id="mongo" 
        host="${mongodb.host}"
        port="${mongodb.port}">
        <mongo:client-options connections-per-host="10"
            threads-allowed-to-block-for-connection-multiplier="5"
            connect-timeout="30000" 
            socket-timeout="60000" 
            write-concern="SAFE" />
    </mongo:mongo-client>
    <bean id="mongoSupport" class="com.cnsugar.common.mongodb.MongoSupport">
        <constructor-arg name="mongo" ref="mongo" />
        <constructor-arg name="dbname" value="${mongodb.dataname}" />
    </bean>
</beans>  
  mongo-client配置屬性說明:
    id: MongoClient的名稱,默認值:mongoClient
    port: 連到到MongoDB服務器的端口號,默認:27017
    host: 連接到MongoDB服務器的host,默認:localhost
    replica-set: 逗號分隔的的副本集集合,格式為host:port,host:port
    credentials: 用戶身份認證逗號分隔的配置,格式:username:password@database,如果傳遞的認證包含逗號,則使用單引號括起來
client-options配置屬性說明:
        description: 描述
        min-connections-per-host: 客戶端最小連接數
        connections-per-host: 客戶端最大連接數,超過了將會被阻塞,默認100
        threads-allowed-to-block-for-connection-multiplier: 可被阻塞的線程數因子,默認值為5,如果connectionsPerHost配置為10,那么最多能阻塞50個線程,超過50個之后就會收到一個異常
        max-wait-time: 阻塞線程獲取連接的最長等待時間,默認120000 ms
        max-connection-idle-time: 連接池連接最大空閑時間
        max-connection-life-time: 連接池連接的最大存活時間
        connect-timeout: 連接超時時間,默認值是0,就是不超時
        socket-timeout: socket超時時間,默認值是0,就是不超時
        socket-keep-alive: keep alive標志,默認false
      server-selection-timeout: 服務器查詢超時時間,它定義驅動在拋出異常之前等待服務器查詢成功,默認30s,單位milliseconds
        read-preference: MongoDB有5種ReadPreference模式:
            primary    主節點,默認模式,讀操作只在主節點,如果主節點不可用,報錯或者拋出異常。
            primaryPreferred   首選主節點,大多情況下讀操作在主節點,如果主節點不可用,如故障轉移,讀操作在從節點。
            secondary    從節點,讀操作只在從節點, 如果從節點不可用,報錯或者拋出異常。
            secondaryPreferred    首選從節點,大多情況下讀操作在從節點,特殊情況(如單主節點架構)讀操作在主節點。
            nearest    最鄰近節點,讀操作在最鄰近的成員,可能是主節點或者從節點。
        write-concern: WriteConcern的7種寫入安全機制拋出異常的級別:
            NONE: 沒有異常拋出
            NORMAL: 僅拋出網絡錯誤異常,沒有服務器錯誤異常,寫入到網絡就返回。
            SAFE: 拋出網絡錯誤異常、服務器錯誤異常;並等待服務器完成寫操作。
            MAJORITY: 拋出網絡錯誤異常、服務器錯誤異常;並多數主服務器完成寫操作。
            FSYNC_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;寫操作等待服務器將數據刷新到磁盤。
            JOURNAL_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;寫操作等待服務器提交到磁盤的日志文件。
            REPLICAS_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;等待至少2台服務器完成寫操作。
        heartbeat-frequency: 驅動用來確保集群中服務器狀態的心跳頻率
        min-heartbeat-frequency: 驅動重新檢查服務器狀態最少等待時間
        heartbeat-connect-timeout: 集群心跳連接的超時時間
        heartbeat-socket-timeout: 集群心跳連接的socket超時時間
        ssl: 驅動是否使用ssl進行連接,默認是false
        ssl-socket-factory-ref: 用來進行ssl連接的SSLSocketFactory,如果配置為none,則使用SSLSocketFactory.getDefault()
  

二、使用示例

   測試之前先新建一個實體類TestEntity,增加@Collection注解指明對應mongodb中test表。mongodb在新增數據時會自動生成一個主鍵_id,如果要以_id為條件進行操作需要轉成ObjectId對象才能使用,繼承MongoEntity可以調用getObjectId()自動處理。

  如果要控制字段的順序,可在字段上添加@JSONField注解,用ordinal屬性進行控制。如果表中的字段名與實體中的字段名不一致,可以添加name屬性進行設置(如下面的代碼,實體中testScore字段對應的數據庫中的名字為test_score)。

@Collection("test")
public class TestEntity extends MongoEntity {
    @JSONField(ordinal = 2)
    private String name;

    @JSONField(ordinal = 3)
    private int status; 

    @JSONField(name="test_score", ordinal = 4)
    private Float testScore;

private Date onTime = new Date(); @JSONField(serialize
= false) private String msgId;//不需要保存到數據庫中的字段,serialize設為false //setter、getter方法 }

 

  1、新增示例

  使用save方法進行新增數據,批量新增用saveAll方法。

  @org.junit.Test
    public void testSave() {
        //保存實體對象
        TestEntity entity = new TestEntity();
        entity.setName("sugar");
        entity.setStatus(2);
        entity.setTestScore(97.5f);
        MongoUtils.save(entity);

        //保存map對象,需要指定集合名稱
        Map<String, Object> map = new HashMap<>();
        map.put("name", "zhangshan");
        map.put("status", 2);
        map.put("test_score", 97.5f);
        MongoUtils.save(map, "test");

        //保存Document對象,與map類似,需要指定集合名稱
        Document doc = new Document();
        doc.put("name", "lisi");
        doc.put("status", 2);
        doc.put("test_score", 97.5f);
        MongoUtils.save(doc, "test");
    }

   使用Robomongo客戶端查看執行后的結果如下:

   

 

  2、更新

  調用update開頭的方法進行更新操作,更新條件使用Filters對象設置,更新內容使用Update對象設置;批量更新用updateAll方法。

  @org.junit.Test
    public void testUpdate() {
        //更新java對象,必須要指定id,如果字段值為null,不會更新舊的數據
        TestEntity entity = new TestEntity();
        entity.setId("5c343804fdfad4230852e1f5");
        entity.setName("sugar2");
        entity.setStatus(1);
        MongoUtils.update(entity);

        //自定義更新的集合名、條件、字段
        String collectionName = "test";
        Bson filter = Filters.eq("_id", new ObjectId("5c343804fdfad4230852e1f6"));
        Update update = new Update();
        update.set("name", "zhangshan2");
        update.inc("status", 1);//相當於status += 1
        MongoUtils.update(collectionName, filter, update);
    }

   更新后的結果如下圖:

  

  

  3、查詢

  調用find開頭的方法進行查詢,查詢條件使用Filters對象設置;分頁查詢用findPage。

    @org.junit.Test
    public void testQuery() {
        //查詢出實體列表
        List<TestEntity> ll = MongoUtils.findAll(TestEntity.class);
        System.out.println(ll);

        //查詢Document對象列表,需要指定集合名
        List<Document> list = MongoUtils.findAll("test");
        System.out.println(list);

        //用Filters生成條件查詢,查詢名字以2結尾的數據
        List<TestEntity> ll2 = MongoUtils.find(TestEntity.class, Filters.regex("name", ".*2"));
        System.out.println(ll2);

        //分頁查詢,查詢分數大於90的數據,查詢第1頁,每頁10條
        Page page = new Page(10, 1);
        page.setClazz(TestEntity.class);//指定列表中的對象類型
        page = MongoUtils.findPage(page, Filters.gt("test_score", 90));
        System.out.println(page.getList());
    }

 

 

  4、刪除

  調用delete開頭的方法進行刪除操作,條件使用Filters對象設置

  @org.junit.Test
    public void testDelete() {
        //根據ID刪除
        MongoUtils.deleteById("test", "587482defdfad41a9c94c9b6");

        //刪除一條數據
        MongoUtils.deleteOne("test", Filters.eq("_id", new ObjectId("587482defdfad41a9c94c9b6")));

        //批量刪除
        List<ObjectId> del = new ArrayList<ObjectId>();
        del.add(new ObjectId("587482defdfad41a9c94c9b6"));
        del.add(new ObjectId("58748350fdfad41a1c5fba14"));
        del.add(new ObjectId("5874930ffdfad40df031215a"));
        MongoUtils.deleteAll("test", Filters.in("_id", del));
    }

 

 

  5、數據聚合分析

  使用count或mapReduce進行數據聚合分析;

  @org.junit.Test
    public void testCount() {
        //統計test表數據總數
        long count = MongoUtils.count("test");

        //統計test表中status=2的數據總數
        long count2 = MongoUtils.count("test", Filters.eq("status", 2));
        
        //根據status進行分組統計
        List<Document> list = MongoUtils.count("test", new String[]{"status"});
        System.out.println(list);

        //自定義mapReduce函數進行數據分析,按天統計數據總數和status=1的總數
        StringBuilder mapFunction = new StringBuilder("function(){emit(");
        mapFunction.append("new Date(this.onTime).toLocaleDateString()");
        mapFunction.append(",{count:1, send:this.status==1?1:0}");
        mapFunction.append(");}");
        StringBuilder reduceFunction = new StringBuilder("function(key, values){");
        reduceFunction.append("var _total = 0, _send = 0;");
        reduceFunction.append("values.forEach(function(val){_total += val.count; _send += val.send;});");
        reduceFunction.append("return {count:_total, send:_send};");
        reduceFunction.append("}");
        List<Document> list2 = MongoUtils.mapReduce("test", mapFunction.toString(), reduceFunction.toString());
        System.out.println(list2);
    }

 

 

  更多使用方法請參考:http://doc.tinnar.cn/javadoc/common-mongodb/com/cnsugar/common/mongodb/MongoUtils.html

 


免責聲明!

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



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