1. 程式人生 > >Spring DAO(6): 整合 MongoDB(spring-data-mongo)

Spring DAO(6): 整合 MongoDB(spring-data-mongo)

MongoDB 入門專欄

Spring 整合 MongoDB

如果在 Java 專案中直接使用 MongoDB 提供的驅動,需要進行大量的 Document 物件和 POJO 之間的轉換,其中很大部分需要手工編寫程式碼,這個過程很繁瑣,Spring 子專案 Spring Data MongoDB 提供了一種 Spring 風格的 MongoTemplate ,能夠比較優雅地進行 Mongodb Document 和 POJO 之間的自動轉換;在專案中引入 Spring Data Mongo ,需要引入依賴包:org.springframework.data:spring-data-mongodb關於 MongoTemplate 
MongoTemplate 成員方法 find(),update(),remove(),insert(),aggregate() 等分別對應 mongodb 的 CRUD,資料聚合方法,對於 mongodb 各種操作符(查詢操作符,更新操作符),spring-data-mongo 提供了 Query 物件,Update 物件分別支援查詢、更新物件,這些物件使用封裝的鏈式函式方法來支援這些操作符,比如一下:
// mongodb 查詢語句 db.blog.find({"author":"assad"})
// 使用 BasicQuery 支援支援原生 mongo query 語句
Query query =
new BasicQuery("{author:'assad'}");
List<Blog> blogs = db.blog.find(query, Blog.class, "blog");
//使用 Query 提供的操作符封裝
Query query = query(where("author").is("assad"));
List<Blog> blogs = db.blog.find(query, Blog.class, "blog");
這些封裝的操作符函式和原生操作符之間的對應關係,詳見:

簡單示例

mongodb 中待操作的文件結構如下,testdb.user:
{
        "_id"
: ObjectId("5a8d7536cc8d632363f514f7"),
        "name" : "assad",
        "password" : "2333",
        "city" : "guangzhou",
        "birthday" : ISODate("1994-12-31T00:00:00Z")
}
{
        "_id" : ObjectId("5a8d7556cc8d632363f514f8"),
        "name" : "tim",
        "password" : "212312",
        "city" : "guangzhou",
        "birthday" : ISODate("1994-08-03T00:00:00Z")
}
{
        "_id" : ObjectId("5a8d756fcc8d632363f514f9"),
        "name" : "vancy",
        "password" : "y3781",
        "city" : "shanghai",
        "birthday" : ISODate("1992-08-03T00:00:00Z")
}
....
演示專案使用 gradle 構建,build.gradle 指令碼中依賴相關的部分如下:
dependencies {
    //spring core 依賴
    compile "org.springframework:spring-beans:4.3.11.RELEASE"
    compile "org.springframework:spring-core:4.3.11.RELEASE"
    compile "org.springframework:spring-context:4.3.11.RELEASE"
    compile "org.springframework:spring-context-support:4.3.11.RELEASE"
    //spring-data-mongodb 依賴
    compile 'org.springframework.data:spring-data-mongodb:2.0.4.RELEASE'
    //spring test 依賴
    compile "org.springframework:spring-test:4.3.11.RELEASE"
    testCompile "junit:junit:4.12"
    compile 'org.slf4j:slf4j-nop:1.7.25'
    compile "org.apache.logging.log4j:log4j-core:2.9.0"
    compile "org.apache.logging.log4j:log4j-api:2.9.0"
}
編寫 POJO,site.assad.domain.User
package site.assad.domain;
public class User{
    private String id;
    private String name;
    private String password;
    private String city;
    private Date birthday;
    // getter & setter
}
編寫 mongo jdbc 連線屬性檔案,jdbc.properties
# mongodb 連線配置
mongo.dbname=testdb
mongo.host=127.0.0.1
mongo.port=27017
mongo.user=assad
mongo.password=mongo1994
# 每個執行緒最大連線數
mongo.connectionsPerHost=10
# 執行緒佇列數,與以上引數相乘得到執行緒對列最大值
mongo.threadsAllowToBlockForConnectionMultiplier=5
# 執行緒連線超時(單位:毫秒)
mongo.connectionTimeout=1500
# 阻塞執行緒最大等待時間(單位:毫秒)
mongo.maxWaitTime=2000
# socket 保持活動
mongo.socketKeepAlive=true
# socket 超時時間(單位:毫秒)
mongo.socketTimeout=2000
在 Spring 上下文配置檔案中狀態 MongoTemplate,applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans ....>
    <!--掃描 bean-->
    <context:component-scan base-package="site.assad.dao" />
    <!--配置屬性佔位符空間-->
    <context:property-placeholder location="classpath:jdbc.properties" />
    <!--配置 MongoClient-->
    <mongo:mongo-client id="mongoClient"
                        host="${mongo.host}"
                        port="${mongo.port}"
                        credentials="${mongo.user}:${mongo.password}@${mongo.dbname}">
        <mongo:client-options write-concern="SAFE"
                              connections-per-host="${mongo.connectionsPerHost}"
                              threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowToBlockForConnectionMultiplier}"
                              connect-timeout="${mongo.connectionTimeout}"
                              max-wait-time="${mongo.maxWaitTime}"
                              socket-keep-alive="${mongo.socketKeepAlive}"
                              socket-timeout="${mongo.socketTimeout}" />
    </mongo:mongo-client>
    <!--配置 MongoDbFactory -->
    <mongo:db-factory id="mongoDbFactory" dbname="${mongo.dbname}" mongo-ref="mongoClient" />
    <!--配置 mongoTemplate -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
    </bean>
</beans>
編寫 Dao 層 site.assad.dao.UserDao
package site.assad.dao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.data.mongodb.core.MongoTemplate;
import site.assad.domain.User;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
import static org.springframework.data.mongodb.core.query.Update.update;
@Repository
public class UserDao {
    @Autowired
    private MongoTemplate mongoTemplate;
    /*演示 select 操作*/
    // db.user.findOne( {_id:ObjectId('${id}')} ):使用 BasicQuery
    public User getUserById (final String id){
        Query query = new BasicQuery(String.format("{ _id:ObjectId('%s') }",id));
        User user = mongoTemplate.findOne(query,User.class,"user");
        return user;
    }
    //db.user.findOne( {_id:ObjectId('${id}')} ) : 使用 Query.query()
    public User getUserById2(final String id){
        Query query = Query.query(where("id").is(id));
        User user = mongoTemplate.findOne(query,User.class,"user");
        // User user = mongoTemplate.findOne(query(where("id").is(id)),User.class);
        return user;
    }
    //db.user.find( {city:'${city}'} )
    public List<User> getUserByCity(final String city){
        Query query = query(where("city").is(city));
        List<User> users = mongoTemplate.find(query,User.class,"user");
        return users;
    }
    //db.user.find( {name:{$regex:/^'${beginPattern}'/i}} )
    public List<User> getUserByNameBeginWith(final String beginPattern){
        Query query = query(where("name").regex(String.format("^%s",beginPattern),"i"));
        List<User> users = mongoTemplate.find(query,User.class,"user");
        return users;
    }
    //db.user.find( {city:'${city}',birthday:{$lte:'$birthFloor'} } )
    public List<User> getUserByCityAndAge(final String city,final int age) throws ParseException {
        int yearFloor = Calendar.getInstance().get(Calendar.YEAR) - age;
        Date birthFloor = new SimpleDateFormat("yyyy").parse(yearFloor+"");
        Query query = query(where("city").is(city)
                .and("birthday").lte(birthFloor));
        List<User> users = mongoTemplate.find(query,User.class,"user");
        return users;
    }
    /*演示 insert 操作*/
    public void addUser(final User user){
        mongoTemplate.insert(user,"user");
    }
    /*演示 update 操作*/
    public long updateUserById(final User user){
        Query query = query(where("id").is(user.getId()));
        Update update = new Update();
        if(user.getName() != null )
            update.set("name",user.getName());
        if(user.getCity() != null)
            update.set("city",user.getCity());
        if(user.getPassword() != null)
            update.set("password",user.getPassword());
        if(user.getBirthday() != null)
            update.set("birthday",user.getBirthday());
        UpdateResult result = mongoTemplate.updateFirst(query,update,User.class,"user");
        return result.getModifiedCount();
    }
    /*演示 delete 操作*/
    public long removeUserById(final String id){
        DeleteResult result = mongoTemplate.remove(query(where("id").is(id)),"user");
        return result.getDeletedCount();
    }
}
部分 UserDao 的測試程式碼,site.assad.dao.UserDaoTest
package site.assad.dao;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class UserDaoTest {
    @Autowired
    private UserDao userDao ;
    @Test
    public void testFindUserById(){
        User user1 = userDao.getUserById("5a8d756fcc8d632363f514f9");
        User user2 = userDao.getUserById2("5a8d756fcc8d632363f514f9");
        System.out.println(user1);
        System.out.println(user2);
    }
    @Test
    public void testFindUserByCity(){
        List<User> users = userDao.getUserByCity("guangzhou");
        users.forEach(System.out::println);
    }
    @Test
    public void testFindUserByNameBeginPattern(){
        List<User> users = userDao.getUserByNameBeginWith("a");
        users.forEach(System.out::println);
    }
    @Test
    public void testGetUserByCityAndAge() throws ParseException {
        List<User> users = userDao.getUserByCityAndAge("guangzhou",20);
        users.forEach(System.out::println);
    }
    @Test
    public void testAddUser() throws ParseException {
        User user = new User();
        user.setName("Oral");
        user.setPassword("21231");
        user.setCity("shanghai");
        user.setBirthday(new SimpleDateFormat("yyyy-MM-dd").parse("1995-1-12"));
        userDao.addUser(user);
    }
    @Test
    public void testUpdateUserById(){
        User user = userDao.getUserById("5a8d756fcc8d632363f514f9");
        user.setPassword("63asu891");
        userDao.updateUserById(user);
    }
    @Test
    public void testRemoveUserById(){
        userDao.removeUserById("5a8d922e07c90847145df9af");
    }
}

相關推薦

Spring DAO(6): 整合 MongoDBspring-data-mongo

MongoDB 入門專欄Spring 整合 MongoDB如果在 Java 專案中直接使用 MongoDB 提供的驅動,需要進行大量的 Document 物件和 POJO 之間的轉換,其中很大部分需要手工編寫程式碼,這個過程很繁瑣,Spring 子專案 Spring Data

MongoDB進階Spring整合MongoDBSpring Data MongoDB

        最近比較忙,忙的都沒空理csdn了,今天我繼續邁著魔鬼般的步伐,摩擦摩擦……總結下最近學到的MongoDB的知識。 1.認識Spring Data MongoDB         之前還的確不知道Spring連整合Nosql的東西都實現了,還以為自己又要

Spring註解方式整合Kafkaspring-kafka的使用

import java.util.HashMap; import java.util.Map; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common

Spring Boot 2 快速教程:WebFlux 整合 Mongodb

摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 這是泥瓦匠的第104篇原創 文章工程:* JDK 1.8* Maven 3.5.2* Spring Boot 2.1.3.RELEASE* 工程名:springboot

SSM框架——詳細整合教程Spring+SpringMVC+MyBatis轉載http://blog.csdn.net/zhshulin/article/details/23912615

rop 用戶名 file .org 我們 XML model lib targe 這兩天需要用到MyBatis的代碼自動生成的功能,由於MyBatis屬於一種半自動的ORM框架,所以主要的工作就是配置Mapping映射文件,但是由於手寫映射文件很容易出錯,所以可利用MyBa

SSM框架——詳細整合教程Spring+SpringMVC+MyBatis

r.js lai action body south 日誌輸出 aop pes 完整 使用SSM(Spring、SpringMVC和Mybatis)已經有三個多月了,項目在技術上已經沒有什麽難點了,基於現有的技術就可以實現想要的功能,當然肯定有很多可以改進的地方。之前沒有

Spring集成Redis方案spring-data-redis基於Jedis的單機模式待實踐

packaging 基於 .cn @override time Coding 很好 -o -i 繼上一篇文章http://www.cnblogs.com/EasonJim/p/7625738.html中提到的幾款客戶端,它們基本都能和Spring集成。 下面介紹的是基於S

SSM三大框架整合配置Spring+SpringMVC+MyBatis

lean source reat ati quest req 繼續 時間 per web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2

【小家Spring】藉助Springfox整合SwaggerAPI介面神器和SpringBoot

背景 隨著網際網路技術的發展,現在的網站架構基本都由原來的後端渲染,變成了:前端渲染、先後端分離的形態,而且前端技術和後端技術在各自的道路上越走越遠。 前端和後端的唯一聯絡,變成了API介面;API文件變成了前後端開發人員聯絡的紐帶,變得越來越重要,swagger就是一款讓你更好

SSM框架整合方案Spring+SpringMVC+Mybatis

一、將application進行縱向切分,每一個配置檔案只配置與之相關的Bean   除此之外,專案中通常還有log4j.properties、SqlMapConfig.xml、db.properties檔案 二、 各檔案配置方案詳解 (1)日誌元件log4j的配置檔案:

spring+redis的整合,使用spring-data-redis來整合

1、參考:https://www.cnblogs.com/qlqwjy/p/8562703.html  2、首先建立一個maven專案。然後加入依賴的jar包就行了。我加入的jar包很多,反正加入了也沒啥壞的影響。 1 <project xmlns="http://maven.a

Spring Boot 整合 Druid 配置屬性列表

Druid是JAVA中最常用的資料庫連線池 pom.xml <!-- alibaba的druid資料庫連線池 --> <dependency> <groupId>com.alibaba</group

Eclipse Maven建web專案 與SSM三大框架整合教程Spring+SpringMVC+MyBatis

Eclipse Maven建web專案 地址:http://dead-knight.iteye.com/blog/1841675 1.建立Maven專案: 點選“File”選單,或者通過工具欄的“New”建立Project,如下圖所示: 選擇Ma

Spring boot 整合 ssmspringspring MVC、Mybatis

Spring boot 簡介:     1.內建了tomcat, 主語內部整合 ssm打包是一個war包 web工程,boot是jar包,就是一個主函式執行。     2.配置簡化       boot是一種主流的微服務的實現。     3.boot的使用:建議前

Spring+SpringMVC+Mybatis整合系列Maven安裝與配置

最近有專案要做,想著還是來寫一篇SSM搭建的文件吧!此搭建文件僅供參考! Spring+SpringMVC+Mybatis簡稱SSM,首先說明一下,由於搭建SSM的篇幅略長,如果放到一篇博文中,可能會給讀者感覺閱讀起來很吃力。其實,寫博文也需要解耦,長篇大論並

SSH的整合總結Spring為主

    <!-- 配置資料來源 -->     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">         <!-- 初始化連線數量;

Spring整合JMSJava Message Service

1.1     JMS簡介        JMS的全稱是Java Message Service,即Java訊息服務。它主要用於在生產者和消費者之間進行訊息傳遞,生產者負責產生訊息,而消費者負責接收訊息。把它應用到實際的業務需求中的話我們可以在特定的時候利用生產者生成一訊息

spring+hibernate+struts2整合方案1

Struts2和Spring的整合: 1. 新增jar包(注意包衝突), 另外需要注意一定要加入struts2-spring-plugin.jar包 2. 新增各自的支援檔案(struts.xml和applicationContext.xml) 3. 配置web.xml  

Spring+SpringMVC+Mybatis整合系列Eclipse新建Maven web專案

這是SSM搭建的第二篇,關於eclipse整合Maven環境搭建部分已經在上一篇中 Spring+SpringMVC+Mybatis整合系列(一)Maven安裝與配置講解完畢,下面主要講解如何使用Eclipse新建Maven專案,以及建立完後的一個BUG處理方法

整合SSMSpring+SpringMVC+Mybatis所有到的jar包和筆記

1.匯入Spring、Mybatis、log4j等相關jar包 整合SSM框架需要配置如下檔案: web.xml applicationContext.xml(配置Spring) springmvc-servlet.xml(配置SpringMVC) log4j