SpringBoot整合MongoDB
MongoDB简介
MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业、各个行业以及各类应用程序的开源数据库。基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能,开源,无模式的文档型数据库,是当前NoSql数据库中比较热门的一种。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。
MySql |
MongoDB |
数据库 |
数据库 |
表 |
集合 |
行 |
文档 |
记录 |
字段 |
POM引入相关依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
|
配置文件配置
在application.properties文件完成配置
1 2 3
| spring.data.mongodb.host=127.0.0.1 spring.data.mongodb.port=27017 spring.data.mongodb.database=test
|
创建相关类
创建实体类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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;
}
|
创建service类
Service中主要来实现CURD的操作
此处需要说明的是Mongodb的修改操作大致有3种:
mongoTemplate.updateFirst操作:修改第一条
mongoTemplate.updateMulti操作:修改符合条件的所有
mongoTemplate.upsert操作:修改时如果不存在则添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| @Service public class MongoDbService { private static final Logger logger = LoggerFactory.getLogger(MongoDbService.class);
@Autowired private MongoTemplate mongoTemplate;
public String saveObj(Book book) { logger.info("--------------------->[MongoDB save start]"); book.setCreateTime(new Date()); book.setUpdateTime(new Date()); mongoTemplate.save(book); return "添加成功"; }
public List<Book> findAll() { logger.info("--------------------->[MongoDB find start]"); return mongoTemplate.findAll(Book.class); }
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); }
public Book getBookByName(String name) { logger.info("--------------------->[MongoDB find start]"); Query query = new Query(Criteria.where("name").is(name)); return mongoTemplate.findOne(query, Book.class); }
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()); mongoTemplate.updateFirst(query, update, Book.class);
return "success"; }
public String deleteBook(Book book) { logger.info("--------------------->[MongoDB delete start]"); mongoTemplate.remove(book); return "success"; }
public String deleteBookById(String id) { logger.info("--------------------->[MongoDB delete start]"); Book book = getBookById(id); deleteBook(book); return "success"; } }
|
创建Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| @RestController public class BaseController {
@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); } }
|
运行测试
启动项目,打开postman开始接口调试,可以看到成功添加book对象。返回添加成功。
打开命令行使用mongo客户端,连接本地MongoDB,可以看到刚才添加的信息。
优化使用
完成以上配置,我们springBoot集成MongoDB环境基本已经搭建好了。
但是在使用中会发现一个问题,假如要对数据库操作多个对象,那岂不是每一个对象Service都需要写一套增删查改的方法。
为了解决这一问题我们可以封装一个通用的操作类来提高效率。
MongoDbDao
我们将mongoDB常用的CURD操作封装为通用的父类,然后在不同的业务场景下继承该类,通过泛型和反射获取到正在操作的实体类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
| public abstract class MongoDbDao<T> {
protected Logger logger = LoggerFactory.getLogger(MongoDbDao.class);
protected abstract Class<T> getEntityClass();
@Autowired private MongoTemplate mongoTemplate;
public void save(T t) { logger.info("-------------->MongoDB save start"); this.mongoTemplate.save(t); }
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()); }
public List<T> queryList(T object) { Query query = getQueryByObject(object); logger.info("-------------->MongoDB find start"); return mongoTemplate.find(query, this.getEntityClass()); }
public T queryOne(T object) { Query query = getQueryByObject(object); logger.info("-------------->MongoDB find start"); return mongoTemplate.findOne(query, this.getEntityClass()); }
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()); }
public Long getCount(T object) { Query query = getQueryByObject(object); logger.info("-------------->MongoDB Count start"); return this.mongoTemplate.count(query, this.getEntityClass()); }
public int delete(T t) { logger.info("-------------->MongoDB delete start"); return (int) this.mongoTemplate.remove(t).getDeletedCount(); }
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); } } }
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()); }
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()); }
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()); }
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; }
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; }
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; }
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; } } }
|
BookMongoDbDao
比如我们可以将之前的Book实体类的CURD类进行改造
创建BookMongoDbDao类继承MongoDbDao
1 2 3 4 5 6 7
| @Repository public class BookMongoDbDao extends MongoDbDao<Book> { @Override protected Class<Book> getEntityClass() { return Book.class; } }
|