目录
3、AbstractMongodbDao类,实现MongoDb的CRUD操作
4.1 MongoUser 实体类,对应db中的集合user
4.4 MongoUserManage(controller)
5、启动MongoDB Server,为数据库testdb,添加一个用户
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,供参考!