Spring和Mongodb非關(guān)系型數(shù)據(jù)庫(kù)整合詳解

Spring和Mongodb非關(guān)系型數(shù)據(jù)庫(kù)整合詳解

一、概述

MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫(kù)。由 C++ 語(yǔ)言編寫。旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。

MongoDB 是一個(gè)介于關(guān)系數(shù)據(jù)庫(kù)和非關(guān)系數(shù)據(jù)庫(kù)之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫(kù)當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫(kù)的。

關(guān)系型數(shù)據(jù)庫(kù)最典型的數(shù)據(jù)結(jié)構(gòu)是表,由二維表及其之間的聯(lián)系所組成的一個(gè)數(shù)據(jù)組織

優(yōu)點(diǎn):

  • 1、易于維護(hù):都是使用表結(jié)構(gòu),格式一致;
  • 2、使用方便:SQL語(yǔ)言通用,可用于復(fù)雜查詢;
  • 3、復(fù)雜操作:支持SQL,可用于一個(gè)表以及多個(gè)表之間非常復(fù)雜的查詢。

缺點(diǎn):

  • 1、讀寫性能比較差,尤其是海量數(shù)據(jù)的高效率讀寫;
  • 2、固定的表結(jié)構(gòu),靈活度稍欠;
  • 3、高并發(fā)讀寫需求,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)來(lái)說(shuō),硬盤I/O是一個(gè)很大的瓶頸。

非關(guān)系型數(shù)據(jù)庫(kù)嚴(yán)格上不是一種數(shù)據(jù)庫(kù),應(yīng)該是一種數(shù)據(jù)結(jié)構(gòu)化存儲(chǔ)方法的集合,可以是文檔或者鍵值對(duì)等。

優(yōu)點(diǎn):

  • 1、格式靈活:存儲(chǔ)數(shù)據(jù)的格式可以是key,value形式、文檔形式、圖片形式等等,文檔形式、圖片形式等等,使用靈活,應(yīng)用場(chǎng)景廣泛,而關(guān)系型數(shù)據(jù)庫(kù)則只支持基礎(chǔ)類型。
  • 2、速度快:nosql可以使用硬盤或者隨機(jī)存儲(chǔ)器作為載體,而關(guān)系型數(shù)據(jù)庫(kù)只能使用硬盤;
  • 3、高擴(kuò)展性;
  • 4、成本低:nosql數(shù)據(jù)庫(kù)部署簡(jiǎn)單,基本都是開(kāi)源軟件。

缺點(diǎn):

  • 1、不提供sql支持,學(xué)習(xí)和使用成本較高;
  • 2、無(wú)事務(wù)處理;
  • 3、數(shù)據(jù)結(jié)構(gòu)相對(duì)復(fù)雜,復(fù)雜查詢方面稍欠。

首發(fā)地址:
品茗IT-同步發(fā)布

品茗IT 提供在線支持:

一鍵快速構(gòu)建Spring項(xiàng)目工具

一鍵快速構(gòu)建SpringBoot項(xiàng)目工具

一鍵快速構(gòu)建SpringCloud項(xiàng)目工具

一站式Springboot項(xiàng)目生成

Mysql一鍵生成Mybatis注解Mapper

如果大家正在尋找一個(gè)java的學(xué)習(xí)環(huán)境,或者在開(kāi)發(fā)中遇到困難,可以加入我們的java學(xué)習(xí)圈,點(diǎn)擊即可加入,共同學(xué)習(xí),節(jié)約學(xué)習(xí)時(shí)間,減少很多在學(xué)習(xí)中遇到的難題。

二、環(huán)境配置

本文假設(shè)你已經(jīng)引入Spring必備的一切了,已經(jīng)是個(gè)Spring項(xiàng)目了,如果不會(huì)搭建,可以打開(kāi)這篇文章看一看《Spring和Spring Mvc 5整合詳解》

2.1 maven依賴

使用Mongodb需要引入spring-data-mongodb。

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.pomit</groupId>
        <artifactId>SpringWork</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>Mongodb</artifactId>
    <packaging>jar</packaging>
    <name>Mongodb</name>
    <url>http://maven.apache.org</url>
    <properties>
        <!-- redis 版本 -->
        <mongodb.version>2.1.8.RELEASE</mongodb.version>

    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>${mongodb.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
        </dependency>

        <!--log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
        </dependency>

        <!-- log4j-web -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>Mongodb</finalName>
    </build>
</project>


父模塊可以在https://www.pomit.cn/spring/SpringWork/pom.xml獲取。

2.2 Spring配置

需要配置mongodb地址登信息、mongoTemplate和mongo:repositories 。

<?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">

    <bean id="annotationPropertyConfigurerMongodb"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="order" value="1" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="locations">
            <list>
                <value>classpath:mongodb.properties</value>
            </list>
        </property>
    </bean>

    <mongo:mongo-client host="${mongodb.host}" port="${mongodb.port}">
        <mongo:client-options connections-per-host="8"
            threads-allowed-to-block-for-connection-multiplier="4"
            connect-timeout="1000" max-wait-time="1500" socket-keep-alive="true"
            socket-timeout="1500" />
    </mongo:mongo-client>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongoClient" />
        <constructor-arg name="databaseName" value="${mongodb.dbName}" />
    </bean>
    
    <mongo:repositories base-package="cn.pomit.springwork.mongodb.dao" />
</beans>

mongodb.properties中存放mongodb的地址端口信息和數(shù)據(jù)庫(kù)名稱。

mongodb.properties:

mongodb.host=localhost
mongodb.port=27017
mongodb.dbName=pomit

三、使用MongoRepository訪問(wèn)數(shù)據(jù)層

3.1 Dao數(shù)據(jù)訪問(wèn)

我們直接使用Spring-data-mongodb, 一切都會(huì)變的特別簡(jiǎn)單。Spring-data-mongodb支持快速查詢。

UserAddationDao:

package cn.pomit.springwork.mongodb.dao;

import org.springframework.data.mongodb.repository.MongoRepository;

import cn.pomit.springwork.mongodb.model.User;

public interface UserAddationDao extends MongoRepository<User, Long> {
    User findByName(String name);
}


這個(gè)寫法和Spring-data-jpa基本上一樣,應(yīng)該說(shuō)Spring-data系列的寫法都是類同的。

**注意,User實(shí)體需要加上@Document注解指明mongodb中的collection。

3.2 業(yè)務(wù)邏輯

我們可以新建一個(gè)service來(lái)使用上面的MongoRepository。

UserAddationService :

package cn.pomit.springwork.mongodb.service;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.pomit.springwork.mongodb.dao.UserAddationDao;
import cn.pomit.springwork.mongodb.model.User;

/**
 * 第二種方式
 * 
 * @author fufei
 *
 */
@Service
public class UserAddationService {
    private static final Logger logger = LoggerFactory.getLogger(UserAddationService.class);
    @Autowired
    private UserAddationDao userAddationDao;

    /**
     * 保存對(duì)象
     *
     * @param book
     * @return
     */
    public String save(User user) {
        logger.info("--------------------->[MongoDB save start]");
        user.setRegisterTime(new Date());
        userAddationDao.save(user);
        return "添加成功";
    }

    /**
     * 查詢所有
     *
     * @return
     */
    public List<User> findAll() {
        logger.info("--------------------->[MongoDB find start]");
        return userAddationDao.findAll();
    }

    /***
     * 根據(jù)id查詢
     * 
     * @param id
     * @return
     */
    public User getUserById(Long id) {
        logger.info("--------------------->[MongoDB find start]");
        return userAddationDao.findById(id).orElse(null);
    }

    /**
     * 根據(jù)名稱查詢
     *
     * @param name
     * @return
     */
    public User getUserByName(String name) {
        logger.info("--------------------->[MongoDB find start]");
        return userAddationDao.findByName(name);
    }

    /**
     * 更新對(duì)象
     *
     * @param book
     * @return
     */
    public String update(User user) {
        logger.info("--------------------->[MongoDB update start]");
        userAddationDao.save(user);
        return "success";
    }

    /***
     * 刪除對(duì)象
     * 
     * @param book
     * @return
     */
    public String deleteUser(User user) {
        logger.info("--------------------->[MongoDB delete start]");
        userAddationDao.delete(user);
        return "success";
    }
}

3.3 測(cè)試Web

package cn.pomit.springwork.mongodb.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.pomit.springwork.mongodb.model.User;
import cn.pomit.springwork.mongodb.service.UserAddationService;

@RestController
@RequestMapping("/mongo2")
public class MongodbAddationRest {
    @Autowired
    UserAddationService userService;

    @PostMapping("/save")
    public String saveObj(@RequestBody User user) {
        return userService.save(user);
    }

    @GetMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }

    @GetMapping("/findOne")
    public User findOne(@RequestParam Long id) {
        return userService.getUserById(id);
    }

    @GetMapping("/findOneByName")
    public User findOneByName(@RequestParam String name) {
        return userService.getUserByName(name);
    }

    @PostMapping("/update")
    public String update(@RequestBody User user) {
        User existUser = userService.getUserById(user.getId());
        if (existUser == null) {
            existUser = user;
        } else {
            if (user.getAge() != null) {
                existUser.setAge(user.getAge());
            }

            if (user.getPassword() != null) {
                existUser.setPassword(user.getPassword());
            }

            if (user.getName() != null) {
                existUser.setName(user.getName());
            }

            if (user.getPhone() != null) {
                existUser.setPhone(user.getPhone());
            }

            if (user.getRegisterTime() != null) {
                existUser.setRegisterTime(user.getRegisterTime());
            }

            if (user.getUsername() != null) {
                existUser.setUsername(user.getUsername());
            }
        }

        return userService.update(existUser);
    }

    @PostMapping("/delOne")
    public String delOne(@RequestBody User user) {
        return userService.deleteUser(user);
    }
}

四、使用MongoTemplate訪問(wèn)數(shù)據(jù)層

下面是另一種操作mongodb的方式。

4.1 數(shù)據(jù)訪問(wèn)及業(yè)務(wù)層

使用MongoTemplate,我們可以不需要建dao這一層,在業(yè)務(wù)邏輯中直接使用MongoTemplate進(jìn)行數(shù)據(jù)訪問(wèn)。

UserService :

package cn.pomit.springwork.mongodb.service;

import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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.stereotype.Service;

import cn.pomit.springwork.mongodb.model.User;


/**
 * 第一種方式
 * @author fufei
 *
 */
@Service
public class UserService {
    private static final Logger logger = LoggerFactory.getLogger(UserService.class);
    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 保存對(duì)象
     *
     * @param book
     * @return
     */
    public String save(User user) {
        logger.info("--------------------->[MongoDB save start]");
        user.setRegisterTime(new Date());
        mongoTemplate.save(user);
        return "添加成功";
    }

    /**
     * 查詢所有
     *
     * @return
     */
    public List<User> findAll() {
        logger.info("--------------------->[MongoDB find start]");
        return mongoTemplate.findAll(User.class);
    }

    /***
     * 根據(jù)id查詢
     * 
     * @param id
     * @return
     */
    public User getUserById(Long id) {
        logger.info("--------------------->[MongoDB find start]");
        Query query = new Query(Criteria.where("_id").is(id));
        return mongoTemplate.findOne(query, User.class);
    }

    /**
     * 根據(jù)名稱查詢
     *
     * @param name
     * @return
     */
    public User getUserByName(String name) {
        logger.info("--------------------->[MongoDB find start]");
        Query query = new Query(Criteria.where("name").is(name));
        return mongoTemplate.findOne(query, User.class);
    }

    /**
     * 更新對(duì)象
     *
     * @param book
     * @return
     */
    public String update(User user) {
        logger.info("--------------------->[MongoDB update start]");
        Query query = new Query(Criteria.where("_id").is(user.getId()));
        Update update = new Update().set("password", user.getPassword()).set("age", user.getAge()).set("phone",
                user.getPhone());
        // updateFirst 更新查詢返回結(jié)果集的第一條
        mongoTemplate.updateFirst(query, update, User.class);
        return "success";
    }

    /***
     * 刪除對(duì)象
     * 
     * @param book
     * @return
     */
    public String deleteUser(User user) {
        logger.info("--------------------->[MongoDB delete start]");
        mongoTemplate.remove(user);
        return "success";
    }
}

4.2 測(cè)試Web

MongodbRest :

package cn.pomit.springwork.mongodb.web;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.pomit.springwork.mongodb.model.User;
import cn.pomit.springwork.mongodb.service.UserService;

@RestController
@RequestMapping("/mongo")
public class MongodbRest {
    @Autowired
    UserService userService;

    @PostMapping("/save")
    public String saveObj(@RequestBody User user) {
        return userService.save(user);
    }

    @GetMapping("/findAll")
    public List<User> findAll() {
        return userService.findAll();
    }

    @GetMapping("/findOne")
    public User findOne(@RequestParam Long id) {
        return userService.getUserById(id);
    }

    @GetMapping("/findOneByName")
    public User findOneByName(@RequestParam String name) {
        return userService.getUserByName(name);
    }

    @PostMapping("/update")
    public String update(@RequestBody User user) {
        return userService.update(user);
    }

    @PostMapping("/delOne")
    public String delOne(@RequestBody User user) {
        return userService.deleteUser(user);
    }
}

五、過(guò)程中用到的實(shí)體

User :


詳細(xì)完整的實(shí)體,可以訪問(wèn)品茗IT-博客《Spring和Mongodb非關(guān)系型數(shù)據(jù)庫(kù)整合詳解》進(jìn)行查看

全部代碼可以在Spring組件化構(gòu)建https://www.pomit.cn/java/spring/spring.html中的MongoDb組件中查看,并下載。

快速構(gòu)建項(xiàng)目

Spring組件化構(gòu)建

SpringBoot組件化構(gòu)建

SpringCloud服務(wù)化構(gòu)建

喜歡這篇文章么,喜歡就加入我們一起討論Spring技術(shù)吧!


品茗IT交流群
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容