首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

MongoDB 整合 Spring 實戰教學(含完整代碼範例)

     編輯:Java 相關知識

前言

本文將詳細介紹如何將 MongoDB 與 Spring 框架進行整合,並提供完整的代碼範例供參考。筆者在開發過程中踩過不少坑,特別是版本不匹配導致的各種錯誤,因此決定整理一份可直接運行的整合指南,希望能幫助大家避開這些陷阱。

常見錯誤與解決方案

在整合測試過程中,主要遇到以下兩個經典錯誤:

  1. org/springframework/data/mapping/context/MappingContextAware 找不到類
  2. src-resolve: Cannot resolve the name 'repository:repository' to a(n) 'type definition'

這些問題本質上都是 版本不匹配 引起的。特別是第二個錯誤,網路上許多解法提到引入 JPA,但本專案並未使用 JPA。最終解決辦法是升級 spring-data-commons 套件版本即可。

開發環境配置

  • IDE:MyEclipse 6.5
  • 資料庫:MongoDB 2.0.8
  • 框架:Spring 3.0.4

關鍵依賴版本(這兩個版本必須對應,否則極易出現各種離譜問題):

  • spring-data-commons-dist-1.4.0.M1
  • spring-data-document-1.0.0.M2.zip

官方下載地址:

專案結構圖

專案結構圖

核心配置文件

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="https://www.springframework.org/schema/context"
       xmlns:mongo="https://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="
           https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context-3.0.xsd
           https://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
           https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <!-- MongoDB 連線配置 -->
    <mongo:mongo host="192.168.0.138" port="27017"/>

    <!-- MongoTemplate Bean 定義 -->
    <bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
        <constructor-arg ref="mongo"/>
        <constructor-arg name="databaseName" value="db"/>
        <constructor-arg name="defaultCollectionName" value="person" />
    </bean>

    <!-- Repository Bean -->
    <bean id="personRepository" class="com.mongo.dao.impl.PersonRepository">
        <property name="mongoTemplate" ref="mongoTemplate"></property>
    </bean>

    <context:annotation-config />
</beans>

資料存取層設計

統一介面 AbstractRepository

package com.mongo.dao;

import java.util.List;
import com.mongo.bean.Person;

public interface AbstractRepository {
    void insert(Person person);
    Person findOne(String id);
    List<Person> findAll();
    List<Person> findByRegex(String regex);
    void removeOne(String id);
    void removeAll();
    void findAndModify(String id);
}

實作類 PersonRepository

package com.mongo.dao.impl;

import java.util.List;
import java.util.regex.Pattern;
import org.springframework.data.document.mongodb.MongoTemplate;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Query;
import org.springframework.data.document.mongodb.query.Update;
import com.mongo.bean.Person;
import com.mongo.dao.AbstractRepository;

public class PersonRepository implements AbstractRepository {
    private MongoTemplate mongoTemplate;

    @Override
    public List<Person> findAll() {
        return getMongoTemplate().find(new Query(), Person.class);
    }

    @Override
    public void findAndModify(String id) {
        getMongoTemplate().updateFirst(
            new Query(Criteria.where("id").is(id)),
            new Update().inc("age", 3)
        );
    }

    @Override
    public List<Person> findByRegex(String regex) {
        Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
        Criteria criteria = new Criteria("name").regex(pattern.toString());
        return getMongoTemplate().find(new Query(criteria), Person.class);
    }

    @Override
    public Person findOne(String id) {
        return getMongoTemplate().findOne(
            new Query(Criteria.where("id").is(id)), Person.class);
    }

    @Override
    public void insert(Person person) {
        getMongoTemplate().insert(person);
    }

    @Override
    public void removeAll() {
        List<Person> list = this.findAll();
        if (list != null) {
            for (Person person : list) {
                getMongoTemplate().remove(person);
            }
        }
    }

    @Override
    public void removeOne(String id) {
        Criteria criteria = Criteria.where("id").in(id);
        if (criteria != null) {
            Query query = new Query(criteria);
            Person person = getMongoTemplate().findOne(query, Person.class);
            if (person != null) {
                getMongoTemplate().remove(person);
            }
        }
    }

    // Getter/Setter 略
}

實體類別 Person

package com.mongo.bean;

import java.io.Serializable;

public class Person implements Serializable {
    private static final long serialVersionUID = 3617931430808763429L;
    
    private String id;
    private String name;
    private int age;

    // 建構子、Getter/Setter、toString() 略
}

測試類別

package com.mongo.test;

import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mongo.bean.Person;
import com.mongo.dao.AbstractRepository;
import com.mongo.dao.impl.PersonRepository;

public class MongoTest {
    private static Log log = LogFactory.getLog(MongoTest.class.getName());
    private AbstractRepository pr = null;

    public void init() {
        log.debug("啟動開始");
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        pr = (PersonRepository) ctx.getBean("personRepository");
    }

    public void insert() {
        Person p = new Person("cuiran", 27);
        pr.insert(p);
        log.debug("新增成功");
    }

    public void findOne() {
        String id = "50c83cb552c2ceb0463177d6";
        Person p = pr.findOne(id);
        log.debug(p);
    }

    public void listAll() {
        List<Person> list = pr.findAll();
        log.debug("查詢結果如下:");
        for (Person p : list) {
            log.debug(p.toString());
        }
    }

    public void start() {
        init();
        // insert();
        // listAll();
        findOne();
    }

    public static void main(String[] args) {
        new MongoTest().start();
    }
}

執行結果

2012-12-12 16:23:59:DEBUG com.mongo.test.MongoTest - 啟動開始
2012-12-12 16:23:59:INFO  org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing...
2012-12-12 16:24:00:DEBUG com.mongo.test.MongoTest - Person[id=50c83cb552c2ceb0463177d6,name=cuiran,age=27]

執行成功!完整 Demo 原始碼可自行下載研究。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved