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,供参考!

 

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