1. 程式人生 > >mongoDB學習之路,安裝、配置、啟動、命令、應用(五)-

mongoDB學習之路,安裝、配置、啟動、命令、應用(五)-

上篇說了java連線mongo,並進行增刪改查

這篇說一下spring整合mongo

github上也有小demo,很簡單,適合初學者,地址:點選跳轉

1、首先建立maven專案,新增依賴

<!-- mongo驅動 -->
    <dependency>
      <groupId>org.mongodb</groupId>
      <artifactId>mongo-java-driver</artifactId>
      <version>3.8.1</version>
    </dependency>
    <!-- spring與mongo整合 -->
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-mongodb</artifactId>
      <version>1.10.7.RELEASE</version>
    </dependency>

2、mongo.properties 檔案

mongo.host=localhost
mongo.port=27017
mongo.username=root
mongo.password=root
mongo.defaultDbName=test
mongo.connectionsPerHost=10
mongo.threadsAllowedToBlockForConnectionMultiplier=5
mongo.minConnectionsPerHost=5
#連線超時時間
mongo.connectTimeout=1000
#等待時間
mongo.maxWaitTime=1500
#Socket超時時間
mongo.socketTimeout=1000
mongo.socketKeepAlive=true

mongo.description=chat messgae mongodb database
mongo.maxConnectionIdleTime=1500
mongo.maxConnectionLifeTime=0
#mongo slave
mongo.heartbeatSocketTimeout=1000
mongo.heartbeatConnectTimeout=1500
mongo.minHeartbeatFrequency=5
mongo.heartbeatFrequency=10
mongo.autoConnectRetry=true
mongo.slaveOk=true

3、spring_mongo.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/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">


    <context:property-placeholder location="classpath:mongo.properties" />

    <context:component-scan base-package="com.zhangchao.mongo" />

    <!-- Activate annotation configured components -->
    <context:annotation-config/>
    <!-- ============ MongoDB config start ============ -->
    <!-- 定義mongo物件,對應的是mongodb官方jar包中的Mongo,replica-set設定叢集副本的ip地址和埠 -->
    <mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}" >
        <!-- 一些連線屬性的設定 -->
        <mongo:client-options
                connections-per-host="${mongo.connectionsPerHost}"
                threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
                connect-timeout="${mongo.connectTimeout}"
                max-wait-time="${mongo.maxWaitTime}"
                socket-keep-alive="${mongo.socketKeepAlive}"
                socket-timeout="${mongo.socketTimeout}"></mongo:client-options>
    </mongo:mongo-client>

    <!-- 定義MongoDbFactory -->
    <mongo:db-factory id="dbFactory" dbname="${mongo.defaultDbName}" mongo-ref="mongoClient"/>

    <!-- 定義沒有_class欄位的converter -->
    <bean id="mongoMappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
    <bean id="defaultTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
        <constructor-arg name="typeKey"><null/></constructor-arg>
    </bean>
    <bean id="mongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
        <constructor-arg name="mongoDbFactory" ref="dbFactory" />
        <constructor-arg name="mappingContext" ref="mongoMappingContext" />
        <property name="typeMapper" ref="defaultTypeMapper"></property>
    </bean>

    <!-- 定義Template -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="dbFactory"/>
        <constructor-arg name="mongoConverter" ref="mongoConverter"/>
        <!--<constructor-arg name="databaseName" value="${mongo.databaseName}"/>-->
    </bean>

    <!-- Use this post processor to translate any MongoExceptions thrown in @Repository annotated classes -->
    <!-- ============ MongoDB config end ============ -->
</beans>

4、準備一個實體類

package com.zhangchao.mongo.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

import java.util.Date;

/**
 * @author zc
 */
@Document(collection = "student") //註解對應表名
public class Student {
    @Id
    private String id;
    @Field
    private String name;
    @Field
    private Integer age;
    @Field
    private String gender;
    @Field
    private Date createTime;

    public Student() {
    }

    public Student( String name, Integer age, String gender, Date createTime) {

        this.name = name;
        this.age = age;
        this.gender = gender;
        this.createTime = createTime;
    }
    public Student( String id, String name, Integer age, String gender, Date createTime) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.createTime = createTime;
    }
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                ", createTime=" + createTime +
                '}';
    }
}

5、通過mongoTemplate操作資料庫進行增刪改查

package com.zhangchao.mongo.main;

import com.mongodb.WriteResult;
import com.zhangchao.mongo.entity.Student;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.data.domain.Sort;
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 javax.annotation.Resource;
import java.util.Date;
import java.util.List;

/**
 * @author zc
 */
public class MongoTemplateTest{

    @Resource
    private static MongoOperations mongoTemplate;

    @Before
    public void setUp() throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring_mongo.xml");
        mongoTemplate = (MongoOperations) context.getBean("mongoTemplate");
    }

    /**
     *  insert插入
     */
    @Test
    public void insertone(){
        //insert: 若新增資料的主鍵已經存在,則會拋 org.springframework.dao.DuplicateKeyException 異常提示主鍵重複,不儲存當前資料
       mongoTemplate.insert(new Student( "dsfsdfsdfsdfsde","王五2",15,"女",new Date()),"student");
    }
    /**
     *  save插入
     */
    @Test
    public void save(){
        //save若新增資料的主鍵已經存在,則會對當前已經存在的資料進行修改操作
        mongoTemplate.save(new Student( "wwwwwwwwwwww","宋九",21,"男",new Date()),"student");
    }

    /**
     *  查詢所有
     */
    @Test
    public void find() {
        List<Student> all = mongoTemplate.findAll(Student.class,"student");
        for (Student s:all
             ) {
            System.out.println(s);
        }
    }
    /**
     * 條件查詢
     */
    @Test
    public void find1(){
        Query query = new Query(Criteria.where("name").is("王五").and("age").gte(20).lte(30));
        List<Student> student = mongoTemplate.find(query, Student.class, "student");
        for (Student s :
                student) {
            System.out.println(s);
        }
    }
    /**
     * 排序查詢(按年齡倒序)
     */
    @Test
    public void find2(){
        Query query = new Query();
        Query q = query.with(new Sort(new Sort.Order(Sort.Direction.DESC, "age")));
        List<Student> student = mongoTemplate.find(q, Student.class, "student");
        for (Student s :
                student) {
            System.out.println(s);
        }
    }
    /**
     * 刪除(名字包含趙)
     */
    @Test
    public void delete(){
        Query query = new Query(Criteria.where("name").regex("趙"));
        WriteResult result = mongoTemplate.remove(query, "student");
        System.out.println(result);
    }
    /**
     * 修改
     * 如果query條件沒有篩選出對應的資料,那麼upsert會插入一條新的資料,而update則什麼都不會做
     */
    @Test
    public void update(){
        Query query = new Query(Criteria.where("age").ne(25));
        Update update = Update.update("gender","女");
//        更新滿足條件的第一條資料
//        WriteResult result = mongoTemplate.updateFirst(query, update, "student");
//        System.out.println(result);
//        更新所有滿足條件的資料
        WriteResult result1 = mongoTemplate.updateMulti(query, update, "student");
        System.out.println(result1);

    }
    @Test
    public void upsert(){
        Query query = new Query(Criteria.where("age").is(35));
        Update update = Update.update("gender","男");
        WriteResult result = mongoTemplate.upsert(query, update, "student");
        System.out.println(result);

    }


}