1. 程式人生 > >Spring-Boot 整合 MongoDB 3.4 實現簡單物件儲存與查詢

Spring-Boot 整合 MongoDB 3.4 實現簡單物件儲存與查詢

搜尋spring-boot依賴的mongodb的包

點進去

以上教大家如何根據一項技術,去搜索其在Spring-Boot專案中對應的依賴

一、專案目錄結構圖

怎麼簡潔怎麼來,Controller就不寫了,Service也不寫了,所有測試全在TestSql單元測試類中實現

二、Pom.xml

<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.appleyk</groupId>
  <artifactId>spring-boot-mongodb</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
  <description>spring-boot 整合mongodb,實現簡單的物件儲存和查詢</description>
	<!-- 繼承官網最新父POM【假設當前專案不再繼承其他POM】 -->
	<!-- http://projects.spring.io/spring-boot/#quick-start -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.9.RELEASE</version>
	</parent>
	<!-- 使用Java8,嘗試使用新特新【stream和lambda】 -->
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<!-- Starter POMs是可以包含到應用中的一個方便的依賴關係描述符集合 -->
		<!-- 該Starters包含很多你搭建專案, 快速執行所需的依賴, 並提供一致的, 管理的傳遞依賴集。 -->
		<!-- 大多數的web應用都使用spring-boot-starter-web模組進行快速搭建和執行。 -->
		<!-- spring-boot-starter-web -->
		<!-- 對全棧web開發的支援, 包括Tomcat和 spring-webmvc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency><!-- 新增Mybatis、Spring-Mybatis依賴 -->	
		<!-- Spring 單元測試 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- JUnit單元測試 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>
		<!-- 新增熱部署 devtools:監聽檔案變動 -->
		<!-- 當Java檔案改動時,Spring-boo會快速重新啟動 -->
		<!-- 最簡單的測試,就是隨便找一個檔案Ctrl+S一下,就可以看到效果 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<!-- optional=true,依賴不會傳遞 -->
			<!-- 本專案依賴devtools;若依賴本專案的其他專案想要使用devtools,需要重新引入 -->
			<optional>true</optional>
		</dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-mongodb -->
		<dependency>
		    <groupId>org.springframework.boot</groupId>
		    <artifactId>spring-boot-starter-data-mongodb</artifactId>
		</dependency>
	</dependencies>
</project>

三、application.properties

server.port=8088
server.session.timeout=10
server.tomcat.uri-encoding=utf8


#在application.properties檔案中引入日誌配置檔案
#=====================================  log  =============================
logging.config=classpath:logback-boot.xml

spring.data.mongodb.uri= mongodb://localhost:27017/test

cmd視窗執行mongo命令,連線MongoDB,並切換test資料庫

四、日誌配置檔案

logback-boot.xml

<configuration>    
    <!-- %m輸出的資訊,%p日誌級別,%t執行緒名,%d日期,%c類的全名,%i索引【從數字0開始遞增】,,, -->    
    <!-- appender是configuration的子節點,是負責寫日誌的元件。 -->
    <!-- ConsoleAppender:把日誌輸出到控制檯 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">    
        <encoder>    
            <pattern>%d %p (%file:%line\)- %m%n</pattern>  
            <!-- 控制檯也要使用UTF-8,不要使用GBK,否則會中文亂碼 -->
            <charset>UTF-8</charset>   
        </encoder>    
    </appender>    
    <!-- RollingFileAppender:滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 -->
    <!-- 以下的大概意思是:1.先按日期存日誌,日期變了,將前一天的日誌檔名重新命名為XXX%日期%索引,新的日誌仍然是sys.log -->
    <!--             2.如果日期沒有發生變化,但是當前日誌的檔案大小超過1KB時,對當前日誌進行分割 重新命名-->
    <appender name="syslog"    
        class="ch.qos.logback.core.rolling.RollingFileAppender">    
        <!-- <File>log/sys.log</File>  --> 
        <File>opt/spring-boot-web/logs/sys.log</File>
        <!-- rollingPolicy:當發生滾動時,決定 RollingFileAppender 的行為,涉及檔案移動和重新命名。 -->
        <!-- TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">    
            <!-- 活動檔案的名字會根據fileNamePattern的值,每隔一段時間改變一次 -->
            <!-- 檔名:log/sys.2017-12-05.0.log -->
            <fileNamePattern>log/sys.%d.%i.log</fileNamePattern> 
            <!-- 每產生一個日誌檔案,該日誌檔案的儲存期限為30天 --> 
            <maxHistory>30</maxHistory>   
            <timeBasedFileNamingAndTriggeringPolicy  class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">    
                <!-- maxFileSize:這是活動檔案的大小,預設值是10MB,本篇設定為1KB,只是為了演示 -->  
                <maxFileSize>10MB</maxFileSize>    
            </timeBasedFileNamingAndTriggeringPolicy>    
        </rollingPolicy>    
        <encoder>    
            <!-- pattern節點,用來設定日誌的輸入格式 -->
            <pattern>    
                %d %p (%file:%line\)- %m%n  
            </pattern>    
            <!-- 記錄日誌的編碼 -->
            <charset>UTF-8</charset> <!-- 此處設定字符集 -->   
        </encoder>    
    </appender>    
    
    <!-- 控制檯輸出日誌級別 -->
    <root  level="error">
          <appender-ref ref="STDOUT" />
     </root> 
    <!-- 指定專案中某個包,當有日誌操作行為時的日誌記錄級別 -->
    <!-- com.appley為根包,也就是隻要是發生在這個根包下面的所有日誌操作行為的許可權都是DEBUG -->
    <!-- 級別依次為【從高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  --> 
     <logger name="com.appleyk" level="error">    
        <appender-ref ref="syslog" />    
    </logger> 
   
</configuration>  

五、Spring-Boot啟動入口

Application.java

package com.appleyk;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration  @ComponentScan
public class Application {
	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}
}

六、建立User實體(相當於MongoDB中的user表的對映)

user.java

package com.appleyk.entity;

import org.springframework.data.annotation.Id;

public class User {

	@Id
	private Long id;
	private String name;
	private int age;
	private String sex;

	
	public User(Long id,String name,int age,String sex){
		this.id = id;
		this.name = name ;
		this.age  = age  ;
		this.sex  = sex  ;
	}
	
	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 getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
}

七、建立UserRepository

UserRepository.java

package com.appleyk.repository;

import java.util.List;

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

import com.appleyk.entity.User;

public interface UserRepository extends MongoRepository<User, Long>{

	
	/*
	 * MongoRepository與HibernateTemplete相似,提供一些基本的方法,
	 * 實現的方法有findone(),save(),count(),findAll(),findAll(Pageable),delete(),deleteAll()..etc
	 * 要使用Repository的功能,先繼承MongoRepository<T, TD>介面
	 * 其中T為倉庫儲存的bean類,TD為該bean的唯一標識的型別,一般為ObjectId。
	 * 之後在spring-boot中注入該介面就可以使用,無需實現裡面的方法,spring會根據定義的規則自動生成。
	 * starter-data-mongodb 支援方法命名約定查詢 findBy{User的name屬性名},
	 * findBy後面的屬性名一定要在User類中存在,否則會報錯 
	 */
	
	/**
	 * 根據name查詢User實體集合
	 * @param name
	 * @return
	 */
	List<User> findByName(String name1);
}

八、單元測試

TestSql.java

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.appleyk.Application;
import com.appleyk.entity.User;
import com.appleyk.repository.UserRepository;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=Application.class)// 指定spring-boot的啟動類 
public class TestSql {

	
	@Autowired
	private UserRepository userRepository;
	
	/**
	 * 插入一條記錄
	 */
	@Test
	public void TestSave(){	
		userRepository.insert(new User(1001L,"appleyk",27,"男"));
		System.err.println("儲存成功!");
	}
	
	/**
	 * 查詢全部User實體
	 */
	@Test
	public void TestFindAll(){	
		List<User> users = userRepository.findAll();
		System.err.println("size: "+users.size()+","+users.get(0).getName());
	}
	
	
	/**
	 * 根據name查詢User
	 */
	@Test
	public void TestFindByName(){	
		List<User> users = userRepository.findByName("appleyk");
		System.err.println("size: "+users.size());
	}
	
	/**
	 * 根據id刪除對應User實體
	 */
	@Test
	public void TestDelete(){
		userRepository.delete(1001L);
		System.err.println("刪除成功!");
	}
}

mongo連線查詢