1. 程式人生 > >SpringBoot開發案例之整合mongoDB

SpringBoot開發案例之整合mongoDB

一、說明

  • Spring boot是對Spring的進一步封裝,旨在簡化Spring的安裝和配置過程。我們知道使用Spring搭建專案環境,往往需要引用很多jar包,並隨著業務的逐漸複雜,創建出很多的xml檔案。Spring boot封裝了Spring整合的很多服務元件,並自動建立這些物件的例項,你只用將所需使用的服務元件的jar包引入即可快速構建開發環境。
  • Spring boot所整合的服務元件,可在官網找到,你可以勾選所使用的服務元件,並把相應maven 專案下載到本地。
  • Spring boot同樣集成了對MongoDB等Nosql的支援,下面介紹通過Spring boot連線和操作MongoDB。

二、開發環境

  • JDK1.8、Maven、iDEA、SpringBoot2.0.6.RELEASE、mongodb3.4,Robomongo(視覺化工具)

三、建立Spring boot專案

本文使用的IDE是idea,其Spring initializr是建立Spring Boot專案的快速視覺化元件,當然你也可以構建maven專案,然後在Spring boot官網將相關pom引入。   3.1 建立一個工程或Module,選擇Spring Initializr,選擇jdk版本  在這裡插入圖片描述3.2 填寫工程或模板資訊  在這裡插入圖片描述3.3 選擇nosql中的mongodb  在這裡插入圖片描述    3.4 建立  在這裡插入圖片描述

   3.5 建立完成  在這裡插入圖片描述

四、案例實戰

4.1 目錄結構

4.2 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</
modelVersion
>
<groupId>com.nosql.mongodb</groupId> <artifactId>mongodb-server</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>mongodb-server</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>

4.3 實體類 Users.java

package com.nosql.mongodb.mongodbserver.model;

import java.io.Serializable;

import org.springframework.data.annotation.Transient;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.CompoundIndexes;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection="users")
@CompoundIndexes({
        @CompoundIndex(name = "age_idx", def = "{'name': 1, 'age': -1}")
})
public class Users  implements Serializable{
    private static final long serialVersionUID = 1L;
    @Indexed
    private String uid;
    private String name;
    private int age;
    @Transient
    private String address;

    public Users(String uid, String name, int age) {
        super();
        this.uid = uid;
        this.name = name;
        this.age = age;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return String.format(
                "Customer[name='%s', age='%s']",
                name, age);
    }
}

4.4 業務介面 IUserService.java

package com.nosql.mongodb.mongodbserver.service;

import com.nosql.mongodb.mongodbserver.model.Users;

import java.util.List;

/**
 * mongodb 案例
 *
 */
public interface IUserService {
    public void saveUser(Users users);

    public Users findUserByName(String name);

    public void removeUser(String name);

    public void updateUser(String name, String key, String value);

    public List<Users> listUser();
}

4.5 業務實現UserServiceImpl.java

package com.nosql.mongodb.mongodbserver.service.impl;

import java.util.List;

import com.nosql.mongodb.mongodbserver.model.Users;
import com.nosql.mongodb.mongodbserver.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Component;



@Component("userService")
public class UserServiceImpl implements IUserService {
    @Autowired
    MongoOperations mongoTemplate;

    public void saveUser(Users users) {
        mongoTemplate.save(users);
    }

    public Users findUserByName(String name) {
        return mongoTemplate.findOne(
                new Query(Criteria.where("name").is(name)), Users.class);
    }

    public void removeUser(String name) {
        mongoTemplate.remove(new Query(Criteria.where("name").is(name)),
                Users.class);
    }

    public void updateUser(String name, String key, String value) {
        mongoTemplate.updateFirst(new Query(Criteria.where("name").is(name)),
                Update.update(key, value), Users.class);

    }

    public List<Users> listUser() {
        return mongoTemplate.findAll(Users.class);
    }
}

4.6 啟動類Application.java

import org.apache.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@EnableAutoConfiguration
@ComponentScan(basePackages={"com.itstyle.mongodb"})
public class Application  {
    private static final Logger logger = Logger.getLogger(Application.class);

    public static void main(String[] args) throws InterruptedException {
        SpringApplication.run(Application.class, args);
        logger.info("專案啟動 ");
    }
}

4.7 基礎配置application.properties

# 專案contextPath,一般在正式釋出版本中
server.context-path=/mongodb
# 服務埠
server.port=8080
# session最大超時時間(分鐘),預設為30
server.session-timeout=60
# 該服務繫結IP地址,啟動伺服器時如本機不是該IP地址則丟擲異常啟動失敗,只有特殊需求的情況下才配置
# server.address=192.168.16.11
# tomcat最大執行緒數,預設為200
server.tomcat.max-threads=800
# tomcat的URI編碼
server.tomcat.uri-encoding=UTF-8

#mongo2.x支援以上兩種配置方式 mongo3.x僅支援uri方式
#mongodb note:mongo3.x will not use host and port,only use uri
#spring.data.mongodb.host=192.168.1.180
#spring.data.mongodb.port=27017
#spring.data.mongodb.database=itstyle
#沒有設定密碼
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/My_Mongodb
#設定了密碼
#spring.data.mongodb.uri=mongodb://itstyle:[email protected]:27017/My_Mongodb

4.8測試類SpringbootMongodbApplication.java

package com.nosql.mongodb.mongodbserver;

import java.util.List;

import com.nosql.mongodb.mongodbserver.model.Users;
import com.nosql.mongodb.mongodbserver.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;



@SpringBootApplication
@ComponentScan(basePackages={"com.nosql.mongodb.mongodbserver"})
public class SpringbootMongodbApplication implements CommandLineRunner {

    @Autowired
    private IUserService userService;

    public static void main(String[] args) {
        SpringApplication.run(SpringbootMongodbApplication.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        try {
            Users users = new Users("1", "小明", 10);
            users.setAddress("青島市");
            userService.saveUser(users);
            List<Users> list = userService.listUser();
            System.out.println("一共這麼多人:"+list.size());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4.9 執行測試類 在這裡插入圖片描述 4.10 Robomongo檢視 在這裡插入圖片描述

五、註解說明

@Document 標註在實體類上,與hibernate異曲同工。

@Document(collection="users")
public class Users  implements Serializable{
    private static final long serialVersionUID = 1L;
    ...省略程式碼

@CompoundIndex 複合索引,加複合索引後通過複合索引欄位查詢將大大提高速度。

@Document(collection="users")
@CompoundIndexes({
    @CompoundIndex(name = "age_idx", def = "{'name': 1, 'age': -1}")
})
public class Users  implements Serializable{
    private static final long serialVersionUID = 1L;
    ...省略程式碼

@Id MongoDB預設會為每個document生成一個 _id 屬性,作為預設主鍵,且預設值為ObjectId,可以更改 _id 的值(可為空字串),但每個document必須擁有 _id 屬性。 當然,也可以自己設定@Id主鍵,不過官方建議使用MongoDB自動生成。 @Indexed 宣告該欄位需要加索引,加索引後以該欄位為條件檢索將大大提高速度。 唯一索引的話是@Indexed(unique = true)。 也可以對陣列進行索引,如果被索引的列是陣列時,mongodb會索引這個陣列中的每一個元素。

@Indexed
private String uid;

@Transient 被該註解標註的,將不會被錄入到資料庫中。只作為普通的javaBean屬性。

@Transient
private String address;

@Field 代表一個欄位,可以不加,不加的話預設以引數名為列名。

@Field("firstName")
private String name;