Spring Boot之搞定mongoTemplate
最近使用MongoDB+Spring Boot的项目,发现相较于MyBatis来说,Spring Boot对于MongoDB进行操作变化更多,所以总结一下使用mongoTemplate库的知识点,以备以后查阅方便。
首先在项目中的pom.xml配置文件中添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
在需要引入mongoTemplate对象的Service文件中添加该对象即可,如下所示:
public class JobService {
// 引入mongoTemplate对象
@Autowired
MongoTemplate mongoTemplate;
针对CURD操作,常用的API方法有如下4类:
- 更新: save()。
- 查询: findAll()、find()、findOne()。
- 更新操作:update()。
- 删除操作: remove()。
下面以一个实际的CRUD例子来讲解具体用法,在注释中会给出语法。
先还是创建一个数据类,假设我们是对武侠剑客数据进行操作,POJO对象的定义代码如下所示。
/**
* 武侠剑客类
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "my_sworders")
public class MySworder implements Serializable {
// 剑客的ID
@Id
private long id;
// 姓名
@Field
private String name;
// 生平描述
@Field
private String description;
// 绝招
@Field
private String skill;
// 创建时间
@Field
private int created;
}
其中特别注意的是,@Document是mongodb驱动库提供设置操作的文档集合名称的注解,这里设置集合为my_sworders。
然后针对这个剑客类编写一个Service文件,命名为SworderService.java:
@Service
public class SworderService {
@Autowired
MongoTemplate mongoTemplate;
/**
* 添加一个剑客
* @param mySworder
* @return
*/
public boolean add(MySworder mySworder) {
long unixTime = System.currentTimeMillis() / 1000L;
int nowUnixTime = (int) unixTime;
mySworder.setCreated(nowUnixTime);
/**
* 语法:<T> T mongoTemplate.save(T objectToSave)
* save方法用于保存数据对象,传递定义好的JavaBean即可,被保存的数据对象会作为返回值被返回。
* 类似地,使用insert也可以达到保存数据的作用。
*/
MySworder obj = mongoTemplate.save(mySworder);
if (obj.getId() > 0) {
return true;
} else {
return false;
}
}
/**
* 获取所有剑客数据
* @return
*/
public List<MySworder> findAll() {
/**
* 语法:<T> List<T> findAll(Class<T> entityClass)
* finAll会返回所有entityClass对应的数据集合的数据,相当于MySQL中select * from xxx_table_name。
*/
return mongoTemplate.findAll(MySworder.class);
}
public boolean update(MySworder mySworder) {
// 创建查询对象
Query query = Query.query(Criteria.where("id").is(mySworder.getId()));
Update update = new Update();
update.set("name", mySworder.getName());
update.set("description", mySworder.getDescription());
update.set("skill", mySworder.getSkill());
/**
* 语法:public UpdateResult updateFirst(Query query, UpdateDefinition update, Class<?> entityClass)
* updateFirst用于更新第一个被匹配的数据,query参数是查询条件对象,update是需要更新的数据对象,entityClass就是对应的JavaBean对象(文档集合类)
*/
UpdateResult updateResult = mongoTemplate.updateFirst(query, update, MyArticle.class);
if (updateResult.getModifiedCount() > 0) {
return true;
} else {
return false;
}
}
public boolean updateBatchByKeyWords(String searchKey,String replaceString) {
// 创建模糊查询对象
Pattern pattern = Pattern.compile("^.*" + searchKey + ".*$", Pattern.CASE_INSENSITIVE);
Criteria criteria = Criteria.where("description").regex(pattern);
Update update = new Update();
update.set("description", replaceString);
Query query = new Query();
query.addCriteria(criteria);
/**
* 语法:public UpdateResult updateMulti(Query query, UpdateDefinition update, Class<?> entityClass)
* updateMulti用于所有被匹配的数据,query参数是查询条件对象,update是需要更新的数据对象,entityClass就是对应的JavaBean对象(文档集合类)
*/
UpdateResult updateResult = mongoTemplate.updateMulti(query, update, MySworder.class);
if (updateResult.getModifiedCount() > 0) {
return true;
} else {
return false;
}
}
public boolean delete(long id) {
MySworder mySworder = new MySworder();
mySworder.setId(id);
/**
* 语法: DeleteResult remove(Object object)
* 该方法用于删除数据,一般都是传递一个主键ID即可
*/
DeleteResult deleteResult = mongoTemplate.remove(mySworder);
if (deleteResult.getDeletedCount() > 0) {
return true;
} else {
return false;
}
}
}
其中模糊查询是使用了regex方法,并使用匹配Pattern对象来保存需要被匹配的字符串。
如果是多条件查询,则需要使用Query对象来保存多个查询条件,具体代码如下:
// 用于存储条件对象
Query query = new Query();
Criteria nameCriteria = Criteria.where("name").is(loginUser.getName());
Criteria passwordCriteria = Criteria.where("password").is(loginUser.getPassword());
query.addCriteria(nameCriteria);
query.addCriteria(passwordCriteria);
MyUser hasUser = mongoTemplate.findOne(query, MyUser.class);
Integer userId = hasUser.getId();
如果查询条件很多,那么这个addCriteria的代码段就会很长,这个时候就考虑自己再封装一个工具类,把循环查询条件和一些复杂查询的过程给封装成一个方法,这样事半功倍。
Spring Boot之搞定mongoTemplate的更多相关文章
- 用了Redisson的Spring Boot Starter搞的我都想重写个
在对接一个小程序推送的框架时,需要将 access_token 存储到 Redis 中,框架中提供了存储逻辑,只需要将 RedissonClient 对象传进去即可. 框架内部在用 Redisson ...
- spring Boot 入门--为什么用spring boot
为什么用spring boot 回答这个问题不得不说下spring 假设你受命用Spring开发一个简单的Hello World Web应用程序.你该做什么? 我能想到一些 基本的需要. 一个项目 ...
- 【转】Spring Boot干货系列:(一)优雅的入门篇
转自Spring Boot干货系列:(一)优雅的入门篇 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做 ...
- Spring Boot干货系列:(一)优雅的入门篇
Spring Boot干货系列:(一)优雅的入门篇 2017-02-26 嘟嘟MD 嘟爷java超神学堂 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社 ...
- 【转载】Spring boot学习记录(一)-入门篇
前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 首先声明,Spring Boot不是一门新技术.从本质上来说,Spring B ...
- 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?
前两天又有小伙伴私信松哥,问题还是职业规划,Java 技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的情况,大都是一两句话就把问题抛出来了,啥 ...
- Spring Boot → 01:概要
背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...
- spring boot实现超轻量级网关(反向代理、转发)
在我们的rest服务中,需要暴露一个中间件的接口给用户,但是需要经过rest服务的认证,这是典型的网关使用场景.可以引入网关组件来搞定,但是引入zuul等中间件会增加系统复杂性,这里实现一个超轻量级的 ...
- Spring Boot 返回 XML 数据,一分钟搞定!
Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击查看之前分享的 Spring Boot 返回 JSON 数据,一分钟搞定! ...
随机推荐
- 金九银十已到!Cookie 和 Session的这些知识你必须知道,面试必问!
前言 会话:一次会话中包含多次请求和响应 注:一次会话表示浏览器第一次给服务器发送请求,会话建立,直到有一方断开为止 功能:在一次会话的多次请求间共享数据 方式: (1) 客户端会话技术:Cookie ...
- 考研党其实可以用思维导图MindManager做考研复习计划
近年由于就业压力,个人学历提升等各种原因,考研的人数越来越多了,相对难度也越来越大了,尽管今年研究生招生规模同比去年增加18.9万,但也无法掩盖考研的竞争逐年激烈. 身为考研大军中的预备选手之一,小编 ...
- 深入浅出之mysql索引--上
当着小萌新之际,最近工作中遇到了mysql优化的相关问题,然后既然提到了优化,很多像我这样的小萌新不容置喙,肯定张口就是 建立索引 之类的. 那么说到底,索引到底是什么,它是怎么工作的?接下来就让我和 ...
- badboy下载
最近新接触了badboy软件,以下是百度网盘链接,有需要可以下载. 链接:https://pan.baidu.com/s/1O4oIhx-twcaMA_fDzRQPHg提取码:7i44 二维码:
- 一个使用xlwings操作excel数据优化60倍处理效率的案例
☞ ░ 前往老猿Python博文目录 ░ 一.引言 老猿在将自己的博文数据(包括url地址.标题和阅读数量)从博客中获取后,使用xlwings保存到excel对象时发现,不同的处理方法性能相差非常大. ...
- 老猿学5G:融合计费场景的离线计费会话的Nchf_OfflineOnlyCharging_Update 更新操作过程
☞ ░ 前往老猿Python博文目录 ░ 一.Nchf_OfflineOnlyCharging_Update消息交互过程 Nchf_OfflineOnlyCharging_Update消息是是5G融合 ...
- 第7.28节 《Python类、类型、协议》章节总结
本章详细介绍了Python协议.多态与"鸭子类型".类.类实例变量.类变量.实例方法.类方法.静态方法.类继承.抽象类.property函数和@property装饰器定义属性访问方 ...
- PyQt(Python+Qt)学习随笔: QDoubleSpinBox浮点数字设定部件简介
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<PyQt(Python+Qt)学习随笔: ...
- C++中对一个布尔类型的变量按位取反结果不变
C++中对一个bool类型的变量按位取反是无效的.例如: bool a = true; bool b = ~a; // b的值还是true
- 对巡风vulscan的理解
# coding:utf-8 # 漏洞检测引擎 import urllib2 import thread import time import pymongo import sys import da ...