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 数据,一分钟搞定! ...
随机推荐
- 精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!
约定优于配置 Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-bas ...
- 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖
前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...
- Android呼吸灯添加
平台:mtk 一.hal层入口 Lights.c (vendor\mediatek\proprietary\hardware\liblights) char const*const RE ...
- css3系列之transform 详解skew
skew skewx skewy skewX() 倾斜该元素,里面填的是角度,下面↓ 你会看到,随着元素被倾斜,高度居然不变.聪明的你,一定会知道,高度不变,代表了,Y轴被拉伸了. 跟scale 同 ...
- Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”
今天早上旁边同事喊我看一个Sonar检测出的问题: 当时看了好几眼没觉得这个有太大问题,于是又看了下Sonar建议: 这是说Math.abs()方法使用在数字上面可能返回最小值,觉得这个挺有意思的,于 ...
- Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator
Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例:我们先看一下ByteBufAllocator ...
- Robot Framework安装和入门
1:安装 python 安装python并且配置好环境变量 2:安装 Robot Framework pip install robotframework 3:安装GUI界面 pip install ...
- NTML
NTLM: 1.客户端向服务器发送一个请求,请求中包含明文的登陆用户名.在服务器中已经存储了登陆用户名和对应的密码hash 2.服务器接收到请求后,NTLMv2协议下 ...
- 【进阶之路】定时任务调用平台xxl-job
大家好,我是练习java两年半时间的南橘,从一名连java有几种数据结构都不懂超级小白,到现在懂了一点点的进阶小白,学到了不少的东西.知识越分享越值钱,我这段时间总结(包括从别的大佬那边学习,引用)了 ...
- 部署 Prometheus 和 Grafana 到 k8s
在 k8s 中部署 Prometheus 和 Grafana Intro 上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k ...