demo架构:
Book Controller:
bash
package com.zy.controller;
import com.zy.entity.Book;
import com.zy.service.MongoDbService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
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;
/**
* @Author: zy
* @Date: 2025-03-05-19:44
* @Description:
*/
@RestController
@RequestMapping("/book")
public class BookController {
@Autowired
private MongoDbService mongoDbService;
@PostMapping("/mongo/save")
public String saveObj(@RequestBody Book book) {
return mongoDbService.saveObj(book);
}
@GetMapping("/mongo/findAll")
public List<Book> findAll() {
return mongoDbService.findAll();
}
@GetMapping("/mongo/findOne")
public Book findOne(@RequestParam String id) {
return mongoDbService.getBookById(id);
}
@GetMapping("/mongo/findOneByName")
public Book findOneByName(@RequestParam String name) {
return mongoDbService.getBookByName(name);
}
@PostMapping("/mongo/update")
public String update(@RequestBody Book book) {
return mongoDbService.updateBook(book);
}
@PostMapping("/mongo/delOne")
public String delOne(@RequestBody Book book) {
return mongoDbService.deleteBook(book);
}
@GetMapping("/mongo/delById")
public String delById(@RequestParam String id) {
return mongoDbService.deleteBookById(id);
}
}
bash
package com.zy.dao;
import com.zy.entity.Book;
import org.springframework.stereotype.Repository;
/**
* @Author: zy
* @Date: 2025-03-05-20:31
* @Description:
*/
@Repository
public class BookMongoDbDao extends MongoDbDao<Book> {
@Override
protected Class<Book> getEntityClass() {
return Book.class;
}
}
bash
package com.zy.dao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
/**
* 描述:
* mongoDB基础方法封装
* /**
*
* @Author: zy
* @Date: 2025-03-05-20:29
* @Description:
*/
public abstract class MongoDbDao<T> {
protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class);
/**
* 反射获取泛型类型
*
* @return
*/
protected abstract Class<T> getEntityClass();
@Autowired
private MongoTemplate mongoTemplate;
/***
* 保存一个对象
* @param t
*/
public void save(T t) {
logger.info("-------------->MongoDB save start");
this.mongoTemplate.save(t);
}
/***
* 根据id从几何中查询对象
* @param id
* @return
*/
public T queryById(Integer id) {
Query query = new Query(Criteria.where("_id").is(id));
logger.info("-------------->MongoDB find start");
return this.mongoTemplate.findOne(query, this.getEntityClass());
}
/**
* 根据条件查询集合
*
* @param object
* @return
*/
public List<T> queryList(T object) {
Query query = getQueryByObject(object);
logger.info("-------------->MongoDB find start");
return mongoTemplate.find(query, this.getEntityClass());
}
/**
* 根据条件查询只返回一个文档
*
* @param object
* @return
*/
public T queryOne(T object) {
Query query = getQueryByObject(object);
logger.info("-------------->MongoDB find start");
return mongoTemplate.findOne(query, this.getEntityClass());
}
/***
* 根据条件分页查询
* @param object
* @param start 查询起始值
* @param size 查询大小
* @return
*/
public List<T> getPage(T object, int start, int size) {
Query query = getQueryByObject(object);
query.skip(start);
query.limit(size);
logger.info("-------------->MongoDB queryPage start");
return this.mongoTemplate.find(query, this.getEntityClass());
}
/***
* 根据条件查询库中符合条件的记录数量
* @param object
* @return
*/
public Long getCount(T object) {
Query query = getQueryByObject(object);
logger.info("-------------->MongoDB Count start");
return this.mongoTemplate.count(query, this.getEntityClass());
}
/***
* 删除对象
* @param t
* @return
*/
public int delete(T t) {
logger.info("-------------->MongoDB delete start");
return (int) this.mongoTemplate.remove(t).getDeletedCount();
}
/**
* 根据id删除
*
* @param id
*/
public void deleteById(Integer id) {
Criteria criteria = Criteria.where("_id").is(id);
if (null != criteria) {
Query query = new Query(criteria);
T obj = this.mongoTemplate.findOne(query, this.getEntityClass());
logger.info("-------------->MongoDB deleteById start");
if (obj != null) {
this.delete(obj);
}
}
}
/*MongoDB中更新操作分为三种
* 1:updateFirst 修改第一条
* 2:updateMulti 修改所有匹配的记录
* 3:upsert 修改时如果不存在则进行添加操作
* */
/**
* 修改匹配到的第一条记录
*
* @param srcObj
* @param targetObj
*/
public void updateFirst(T srcObj, T targetObj) {
Query query = getQueryByObject(srcObj);
Update update = getUpdateByObject(targetObj);
logger.info("-------------->MongoDB updateFirst start");
this.mongoTemplate.updateFirst(query, update, this.getEntityClass());
}
/***
* 修改匹配到的所有记录
* @param srcObj
* @param targetObj
*/
public void updateMulti(T srcObj, T targetObj) {
Query query = getQueryByObject(srcObj);
Update update = getUpdateByObject(targetObj);
logger.info("-------------->MongoDB updateFirst start");
this.mongoTemplate.updateMulti(query, update, this.getEntityClass());
}
/***
* 修改匹配到的记录,若不存在该记录则进行添加
* @param srcObj
* @param targetObj
*/
public void updateInsert(T srcObj, T targetObj) {
Query query = getQueryByObject(srcObj);
Update update = getUpdateByObject(targetObj);
logger.info("-------------->MongoDB updateInsert start");
this.mongoTemplate.upsert(query, update, this.getEntityClass());
}
/**
* 将查询条件对象转换为query
*
* @param object
* @return
* @author Jason
*/
private Query getQueryByObject(T object) {
Query query = new Query();
String[] fileds = getFiledName(object);
Criteria criteria = new Criteria();
for (int i = 0; i < fileds.length; i++) {
String filedName = (String) fileds[i];
Object filedValue = getFieldValueByName(filedName, object);
if (filedValue != null) {
criteria.and(filedName).is(filedValue);
}
}
query.addCriteria(criteria);
return query;
}
/**
* 将查询条件对象转换为update
*
* @param object
* @return
* @author Jason
*/
private Update getUpdateByObject(T object) {
Update update = new Update();
String[] fileds = getFiledName(object);
for (int i = 0; i < fileds.length; i++) {
String filedName = (String) fileds[i];
Object filedValue = getFieldValueByName(filedName, object);
if (filedValue != null) {
update.set(filedName, filedValue);
}
}
return update;
}
/***
* 获取对象属性返回字符串数组
* @param o
* @return
*/
private static String[] getFiledName(Object o) {
Field[] fields = o.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; ++i) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/***
* 根据属性获取对象属性值
* @param fieldName
* @param o
* @return
*/
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String e = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + e + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[0]);
return method.invoke(o, new Object[0]);
} catch (Exception var6) {
return null;
}
}
}
bash
package com.zy.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import java.util.Date;
/**
* @Author: zy
* @Date: 2025-03-05-19:39
* @Description:
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Book {
@Id
private String id;
//价格
private Integer price;
//书名
private String name;
//简介
private String info;
//出版社
private String publish;
//创建时间
private Date createTime;
//修改时间
private Date updateTime;
}
bash
package com.zy.service;
import com.zy.entity.Book;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @Author: zy
* @Date: 2025-03-05-20:31
* @Description:
*/
@Service
public class BookMongoDbService {
private static final Logger logger = LoggerFactory.getLogger(BookMongoDbService.class);
@Autowired
@SuppressWarnings("all")
private MongoTemplate mongoTemplate;
/**
* 保存对象
*
* @param book
* @return
*/
public String saveObj(Book book) {
logger.info("--------------------->[MongoDB save start]");
book.setCreateTime(new Date());
book.setUpdateTime(new Date());
mongoTemplate.save(book);
return "添加成功";
}
//其他操作方法......
}
bash
package com.zy.service;
import com.zy.entity.Book;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* @Author: zy
* @Date: 2025-03-05-19:39
* @Description: mongoDb service
*/
@Service
public class MongoDbService {
private static final Logger logger = LoggerFactory.getLogger(MongoDbService.class);
private final MongoTemplate mongoTemplate;
@SuppressWarnings("all")
public MongoDbService(MongoTemplate mongoTemplate) {
this.mongoTemplate = mongoTemplate;
}
/**
* 保存对象
*
* @param book 实体类
* @return String
*/
public String saveObj(Book book) {
logger.info("--------------------->[MongoDB save start]");
book.setCreateTime(new Date());
book.setUpdateTime(new Date());
mongoTemplate.save(book);
return "添加成功";
}
/**
* 查询所有
*
* @return List
*/
public List<Book> findAll() {
logger.info("--------------------->[MongoDB find start]");
return mongoTemplate.findAll(Book.class);
}
/***
* 根据id查询
* @param id book ID
* @return Book
*/
public Book getBookById(String id) {
logger.info("--------------------->[MongoDB find start]");
Query query = new Query(Criteria.where("_id").is(id));
return mongoTemplate.findOne(query, Book.class);
}
/**
* 根据名称查询
*
* @param name 书名
* @return Book
*/
public Book getBookByName(String name) {
logger.info("--------------------->[MongoDB find start]");
logger.info("--------------------->[MongoDB name]:" + name);
Query query = new Query(Criteria.where("name").is(name));
return mongoTemplate.findOne(query, Book.class);
}
/**
* 更新对象
*
* @param book 书
* @return String
*/
public String updateBook(Book book) {
logger.info("--------------------->[MongoDB update start]");
Query query = new Query(Criteria.where("_id").is(book.getId()));
Update update = new Update().set("publish", book.getPublish()).set("info", book.getInfo()).set("updateTime",
new Date()).set("name", book.getName());
//updateFirst 更新查询返回结果集的第一条
mongoTemplate.updateFirst(query, update, Book.class);
//updateMulti 更新查询返回结果集的全部
// mongoTemplate.updateMulti(query,update,Book.class);
//upsert 更新对象不存在则去添加
// mongoTemplate.upsert(query,update,Book.class);
return "success";
}
/***
* 删除对象
* @param book 实体类
* @return String
*/
public String deleteBook(Book book) {
logger.info("--------------------->[MongoDB delete start]");
mongoTemplate.remove(book);
return "success";
}
/**
* 根据id删除
*
* @param id ID
* @return String
*/
public String deleteBookById(String id) {
logger.info("--------------------->[MongoDB delete start]");
//findOne
Book book = getBookById(id);
//delete
deleteBook(book);
return "success";
}
}
bash
package com.zy;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Author: zy
* @Date: 2025-03-05-19:30
* @Description:
*/
@SpringBootApplication
public class MongoDbApp {
public static void main(String[] args) {
SpringApplication.run(MongoDbApp.class, args);
System.out.println("MongoDbApp started...");
}
}
bash
server:
port: 8080
spring:
data:
mongodb:
host: IP地址
username: 用户名
database: 你的苦
password: 你的密码
port: 端口号
# 日志打印
logging:
level:
org.springframework.data.mongodb.core: DEBUG
# org.springframework.data.mongodb.core.MongoTemplate: DEBUG
Postman 测试接口:
bash
localhost:8080/book/mongo/save
{
"id": "8",
"name": "从你的全世界路过5",
"price": 123,
"info": "小说5",
"publish": "某某出版社5"
}
localhost:8080/book/mongo/findAll
localhost:8080/book/mongo/findOne?id=4
localhost:8080/book/mongo/findOneByName?name=从你的全世界路过
localhost:8080/book/mongo/update
{
"id": "5",
"name": "从你的全世界路过5-update",
"price": 123,
"info": "小说5-pdate",
"publish": "某某出版社5-update"
}
localhost:8080/book/mongo/delOne
{
"id": "5",
"name": "从你的全世界路过5",
"price": 123,
"info": "小说5",
"publish": "某某出版社5----当时的撒的撒的"
}