使用 Spring Data MongoDB 可以方便的在 Spring Boot 项目中操作 MongoDB。
在项目中要使用 Spring Data MongoDB 需要在 pom.xml 文件中引入依赖,依赖如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
# 用户名:root、密码:aaaaaa、数据库地址:127.0.0.1、端口号:27017、库名:test spring.data.mongodb.uri=mongodb://root:aaaaaa@127.0.0.1:27017/test # mongodb 没有密码,url 配置如下 spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test
(1)使用 @Document 注解映射一个集合实体类。代码如下:
package com.huangx.springdata.mongondb.model;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
/**
* users 集合映射集合
* @author huangxin 2019/12/31
*/
// @Document 注释此类将被映射到数据库的一个集合(collection为集合名称)
@Document(collection = "users")
public class User {
@Field("id")
private long id;
@Field("name")
private String name;
@Field("age")
private int age;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}Spring Data MongoDB提供了一些方便的映射注释供我们使用,下面列出以供参考:
@Id:用于标记id字段,没有标记此字段的实体也会自动生成id字段,但是我们无法通过实体来获取id。id建议使用ObjectId类型来创建。
@Document:用于标记此实体类是mongodb集合映射类。可以使用collection参数指定集合名称。特别需要注意的是如果实体类没有为任何字段创建索引将不会自动创建集合。
@Indexed:用于标记为某一字段创建索引。direction参数可以指定排序方向,升或降序。
@CompoundIndex:用于创建复合索引。def参数可以定义复合索引的字段及排序方向。
@Transient:被该注解标注的,将不会被录入到数据库中。只作为普通的javaBean属性。
@PersistenceConstructor:用于声明构造函数,作用是把从数据库取出的数据实例化为对象。
@Field:用于指定某一个字段映射到数据库中的名称。
@DBRef:用于指定与其他集合的级联关系,但是需要注意的是并不会自动创建级联集合。
(2)配置一个控制器,然后在控制器中引入 MongoTemplate 依赖。接下来就去试试 MongoTemplate 的威力吧!代码如下:
package com.huangx.springdata.mongondb.controller;
import com.alibaba.fastjson.JSONObject;
import com.huangx.springdata.mongondb.model.User;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.DeleteResult;
import com.mongodb.client.result.UpdateResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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 org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Spring Data MongoDB 简单实例
* @author huangxin 2019/12/31
*/
@RestController
@RequestMapping("/demo")
public class DemoController {
/**
* 注入 MongoDB 模板类,由 Spring 进行创建和维护
*/
@Autowired
private MongoTemplate mongoTemplate;
/**
* 获取数据库名称和类名
* @return
*/
@RequestMapping("/info")
public String info() {
MongoDatabase mongoDatabase = mongoTemplate.getDb();
JSONObject obj = new JSONObject();
obj.put("dbName", mongoDatabase.getName());
obj.put("class", mongoDatabase.getClass().toString());
return obj.toJSONString();
}
/**
* 获取用户列表
* @return
*/
@RequestMapping("/list")
public String list() {
List<User> users = mongoTemplate.findAll(User.class, "users");
return JSONObject.toJSONString(users);
}
/**
* 添加用户信息
* @param id 用户ID
* @param name 用户名
* @param age 年龄
* @return
*/
@RequestMapping("/add")
public String add(@RequestParam(value = "id", defaultValue = "-1") int id,
@RequestParam(value = "name", defaultValue = "test") String name,
@RequestParam(value = "age", defaultValue = "20") Integer age) {
if(id <= 0) {
return "用户ID不能小于0";
}
// 根据用户ID判断用户是否存在
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
List<User> userList = mongoTemplate.find(query, User.class);
if(userList != null && userList.size() > 0) {
return "ID=" + id + "的用户已经存在,不能添加用户";
}
// 添加用户
User user = new User();
user.setId(id);
user.setName(name);
user.setAge(age);
mongoTemplate.save(user, "users");
return JSONObject.toJSONString(user);
}
/**
* 根据ID更新文档
* @param id 用户ID
* @param name 用户名
* @param age 年龄
* @return
*/
@RequestMapping("/update")
public String update(@RequestParam(value = "id", defaultValue = "-1") int id,
@RequestParam(value = "name", defaultValue = "test") String name,
@RequestParam(value = "age", defaultValue = "20") Integer age) {
// 根据用户ID判断用户是否存在
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
List<User> userList = mongoTemplate.find(query, User.class);
if(userList == null || userList.isEmpty()) {
return "ID=" + id + "的用户不存在,不能修改用户";
}
// 更新数据
Update update = new Update();
update.addToSet("name", name);
update.addToSet("age", age);
UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);
return JSONObject.toJSONString(result);
}
/**
* 根据ID删除用户
* @param id 用户ID
* @return
*/
@RequestMapping("/delete")
public String delete(@RequestParam("id") int id) {
// 根据用户ID字段删除MongoDB文档
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
// 删除用户信息
DeleteResult deleteResult = mongoTemplate.remove(query, "users");
return JSONObject.toJSONString(deleteResult);
}
}