Spring 整合MongoDB

目錄

1、在pom.xml文件中添加mongoDB的依賴:

2、通過xml配置MongoTemplate

3、AbstractMongodbDao類,實現MongoDb的CRUD操作

4、測試

4.1 MongoUser 實體類,對應db中的集合user

4.2 UserMongoDao

4.3 MongoUserManageService

4.4 MongoUserManage(controller)

5、啓動MongoDB Server,爲數據庫testdb,添加一個用戶

6、啓動項目


Demo已上傳Github: https://github.com/cloudgyb/spring-mongodb,供參考!

首先創建一個Spring MVC的Maven項目,用於整合MongoDB。

1、在pom.xml文件中添加mongoDB的依賴:

<dependency>
       <groupId>org.springframework.data</groupId>
       <artifactId>spring-data-mongodb</artifactId>
       <version>2.2.7.RELEASE</version>
</dependency>

2、通過xml配置MongoTemplate

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

	<bean id="mongoDbFactory" class="org.springframework.data.mongodb.core.SimpleMongoClientDbFactory">
		<constructor-arg value="mongodb://venus:123456@localhost:27017/testdb" />
	</bean>
	<bean class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg ref="mongoDbFactory"/>
	</bean>
</beans>

MogoTemplate依賴MongoDbFactory,SimpleMongoClientDbFactory是其一個實現類,通過構造器注入mongodb的uri,uri中包含了連接的數據庫的用戶名、密碼、主機、端口和數據庫名稱,格式爲mongodb://userName:password@host:port/dbName.通過上述配置mongoTemplate就注入到Spring 容器中了。

3、AbstractMongodbDao類,實現MongoDb的CRUD操作

import com.gyb.spring.mongodb.domain.Pagination;
import com.mongodb.client.result.DeleteResult;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;

/**
 * @author geng
 * 2020/5/15
 */
public abstract class AbstractMongodbDao<T> {
    protected final MongoTemplate mongoTemplate;
    private Class<T> entityClass;

    public AbstractMongodbDao(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
        Type genericSuperclass = this.getClass().getGenericSuperclass();
        if (genericSuperclass instanceof ParameterizedType) {
            ParameterizedType paraType = (ParameterizedType) genericSuperclass;
            Type[] params = paraType.getActualTypeArguments();
            if(params[0] instanceof Class) {
                entityClass = (Class<T>) params[0];
            }
        }
    }

    public void add(T entity){
        mongoTemplate.insert(entity);
    }

    public void add(Collection<T> coll){
        mongoTemplate.insertAll(coll);
    }

    public List<T> find(Query query){
        if(query == null)
            return findAll();
        return mongoTemplate.find(query, entityClass);
    }

    /**
     * 按照field字段進行查找
     * @param field 對應數據庫中的字段名
     * @param value 屬性值
     */
    public List<T> find(String field,String value){
        Criteria criteria = new Criteria();
        criteria.and(field).is(value);
        Query query = new Query(criteria);
        return find(query);
    }

    public Pagination<T> findPage(Query query, int pageNum, int pageSize){
        if(query == null)
            query = new Query();
        long total = count(query);
        query.skip((pageNum-1)*pageSize).limit(pageSize);
        List<T> data = find(query);
        return Pagination.of(pageNum,pageSize,total,data);
    }

    public List<T> findAll(){
        return mongoTemplate.findAll(entityClass);
    }

    public long count(Query query){
        if(query == null){
            query = new Query();
        }
        return mongoTemplate.count(query,entityClass);
    }

    public long remove(Query query){
        DeleteResult result = mongoTemplate.remove(query, entityClass);
        return result.getDeletedCount();
    }

}

這個類實現了基本的CRUD,後續的數據庫操作可以繼承這個類即可。

4、測試

  以都熟知的用戶管理功能爲例,看看效果。

4.1 MongoUser 實體類,對應db中的集合user

/**
 * @author geng
 * 2020/5/15
 */
@Document(collection = "user")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class MongoUser {
    @Id
    private String id;
    private String name;
    private String password;
}

@Document註解標記了這個類對應db中的user集合。@Id指定一個字段對應集合中的id。 

4.2 UserMongoDao

/**
 * @author geng
 * 2020/5/15
 */
@Repository
public class UserMongoDao extends AbstractMongodbDao<MongoUser> {

    public UserMongoDao(MongoTemplate mongoTemplate) {
        super(mongoTemplate);
    }

}

繼承了AbstractMongodbDao。

4.3 MongoUserManageService

/**
 * @author geng
 * 2020/5/18
 */
@Service
public class MongoUserManageService {
    private final UserMongoDao userMongoDao;

    public MongoUserManageService(UserMongoDao userMongoDao) {
        this.userMongoDao = userMongoDao;
    }

    public List<MongoUser> getAll(){
        return userMongoDao.findAll();
    }

    public List<MongoUser> getByUserName(String userName){
        return userMongoDao.find("name",userName);
    }

    public Pagination<MongoUser> page(int pageNum,int pageSize){
        return userMongoDao.findPage(null,pageNum,pageSize);
    }

    public void addUser(MongoUser user){
        userMongoDao.add(user);
    }

    public long deleteUser(String id){
        Criteria id1 = Criteria.where("id").is(id);
        Query query = new Query(id1);
        return userMongoDao.remove(query);
    }
}

4.4 MongoUserManage(controller)


@RestController
@RequestMapping("/mongoUser")
public class MongoUserManage {
	private final MongoUserManageService mongoUserManageService;

	public MongoUserManage(MongoUserManageService mongoUserManageService) {
		this.mongoUserManageService = mongoUserManageService;
	}

	@RequestMapping("/list")
	public List<MongoUser> userList() {
		return mongoUserManageService.getAll();
	}
	@RequestMapping("/query")
	public List<MongoUser> userList(@RequestParam String userName) {
		return mongoUserManageService.getByUserName(userName);
	}

	@RequestMapping("/page")
	public Pagination<MongoUser> userList(@RequestParam(defaultValue = "1") int pageNum,
										  @RequestParam(defaultValue = "10") int pageSize){
		return mongoUserManageService.page(pageNum,pageSize);
	}

	@PostMapping("/add")
	public void add(@RequestBody MongoUser user){
		mongoUserManageService.addUser(user);
	}

	@DeleteMapping("/delete")
	public void delete(String id){
		long l = mongoUserManageService.deleteUser(id);
		System.out.println(l);
	}

}

5、啓動MongoDB Server,爲數據庫testdb,添加一個用戶

 下載MongoDB-server:https://www.mongodb.com/download-center/community,選擇合適的版本去下載。

下載完解壓,進入bin目錄,執行下面的命令啓動Mongo服務:

mongod --dbpath ../data //指定存放數據的目錄爲bin目錄上一級的data目錄。

執行mongo,進入客戶端控制檯,執行下面的命令,創建用戶:

use testdb

db.createUser(
  {
    user: "venus", //用戶名
    pwd: "123456",   // 密碼
    roles: [ { role: "readWrite", db: "testdb" }]
  }
)

 然後關掉Mongo Server,重啓以需要認證的模式啓動Server:

mongod --dbpath ../data --auth //指定訪問db需要認證

mongo 的幫助文檔:https://docs.mongodb.com/manual/

6、啓動項目

調用接口測試一下,應該問題不大。

 

Demo已上傳Github: https://github.com/cloudgyb/spring-mongodb,供參考!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章