最近使用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类:

  1. 更新: save()。
  2. 查询: findAll()、find()、findOne()。
  3. 更新操作:update()。
  4. 删除操作: 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的更多相关文章

  1. 用了Redisson的Spring Boot Starter搞的我都想重写个

    在对接一个小程序推送的框架时,需要将 access_token 存储到 Redis 中,框架中提供了存储逻辑,只需要将 RedissonClient 对象传进去即可. 框架内部在用 Redisson ...

  2. spring Boot 入门--为什么用spring boot

    为什么用spring boot 回答这个问题不得不说下spring 假设你受命用Spring开发一个简单的Hello World Web应用程序.你该做什么? 我能想到一些 基本的需要.  一个项目 ...

  3. 【转】Spring Boot干货系列:(一)优雅的入门篇

    转自Spring Boot干货系列:(一)优雅的入门篇 前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社区中热度一直很高,所以决定花时间来了解和学习,为自己做 ...

  4. Spring Boot干货系列:(一)优雅的入门篇

    Spring Boot干货系列:(一)优雅的入门篇 2017-02-26 嘟嘟MD 嘟爷java超神学堂   前言 Spring一直是很火的一个开源框架,在过去的一段时间里,Spring Boot在社 ...

  5. 【转载】Spring boot学习记录(一)-入门篇

    前言:本系列文章非本人原创,转自:http://tengj.top/2017/04/24/springboot0/ 正文 首先声明,Spring Boot不是一门新技术.从本质上来说,Spring B ...

  6. 前后端分离,我怎么就选择了 Spring Boot + Vue 技术栈?

    前两天又有小伙伴私信松哥,问题还是职业规划,Java 技术栈路线这种,实际上对于这一类问题我经常不太敢回答,每个人的情况都不太一样,而小伙伴也很少详细介绍自己的情况,大都是一两句话就把问题抛出来了,啥 ...

  7. Spring Boot → 01:概要

    背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...

  8. spring boot实现超轻量级网关(反向代理、转发)

    在我们的rest服务中,需要暴露一个中间件的接口给用户,但是需要经过rest服务的认证,这是典型的网关使用场景.可以引入网关组件来搞定,但是引入zuul等中间件会增加系统复杂性,这里实现一个超轻量级的 ...

  9. Spring Boot 返回 XML 数据,一分钟搞定!

    Spring Boot 返回 XML 数据,前提必须已经搭建了 Spring Boot 项目,所以这一块代码就不贴了,可以点击查看之前分享的 Spring Boot 返回 JSON 数据,一分钟搞定! ...

随机推荐

  1. 精益求精!Spring Boot 知识点全面回顾,带你重新细读源码!

    约定优于配置 Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-bas ...

  2. 面试阿里,腾讯,字节跳动90%都会被问到的Spring中的循环依赖

    前言 Spring中的循环依赖一直是Spring中一个很重要的话题,一方面是因为源码中为了解决循环依赖做了很多处理,另外一方面是因为面试的时候,如果问到Spring中比较高阶的问题,那么循环依赖必定逃 ...

  3. Android呼吸灯添加

    平台:mtk 一.hal层入口    Lights.c (vendor\mediatek\proprietary\hardware\liblights)     char const*const RE ...

  4. css3系列之transform 详解skew

    skew skewx skewy skewX()  倾斜该元素,里面填的是角度,下面↓ 你会看到,随着元素被倾斜,高度居然不变.聪明的你,一定会知道,高度不变,代表了,Y轴被拉伸了. 跟scale 同 ...

  5. Sonar检测Math.abs(new Random().nextInt()) “Use the original value instead”

    今天早上旁边同事喊我看一个Sonar检测出的问题: 当时看了好几眼没觉得这个有太大问题,于是又看了下Sonar建议: 这是说Math.abs()方法使用在数字上面可能返回最小值,觉得这个挺有意思的,于 ...

  6. Netty源码分析之ByteBuf(二)—内存分配器ByteBufAllocator

    Netty中的内存分配是基于ByteBufAllocator这个接口实现的,通过对它的具体实现,可以用来分配我们之前描述过的任意类型的BytebBuf实例:我们先看一下ByteBufAllocator ...

  7. Robot Framework安装和入门

    1:安装 python 安装python并且配置好环境变量 2:安装 Robot Framework pip install robotframework 3:安装GUI界面 pip install ...

  8. NTML

     NTLM:         1.客户端向服务器发送一个请求,请求中包含明文的登陆用户名.在服务器中已经存储了登陆用户名和对应的密码hash         2.服务器接收到请求后,NTLMv2协议下 ...

  9. 【进阶之路】定时任务调用平台xxl-job

    大家好,我是练习java两年半时间的南橘,从一名连java有几种数据结构都不懂超级小白,到现在懂了一点点的进阶小白,学到了不少的东西.知识越分享越值钱,我这段时间总结(包括从别的大佬那边学习,引用)了 ...

  10. 部署 Prometheus 和 Grafana 到 k8s

    在 k8s 中部署 Prometheus 和 Grafana Intro 上次我们主要分享了 asp.net core 集成 prometheus,以及简单的 prometheus 使用,在实际在 k ...