最近使用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. jquery 的 change() 方法的使用

    w3c 中的定义:链接  <a>http://www.w3school.com.cn/jquery/event_change.asp<a> jQuery 事件 - change ...

  2. docker下启动单机nacos

    docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server 参数说明: MODE standalo ...

  3. 企业级工作流解决方案(十二)--集成Abp和ng-alain--用户身份认证与权限验证

    多租户 如果系统需要支持多租户,那么最好事先定义好多租户的存储部署方式,Abp提供了几种方式,根据需要选择,每一个用户身份认证与权限验证都需要完全的隔离 这里设计的权限数据全部存储在缓存中,每个租户单 ...

  4. IDEA创建WebService服务端与客户端

    创建服务端 一.file–>new–>project 二.点击next后输入服务端名,点击finish,生成目录如下 三.在 HelloWorld.Java 文件中右击,选 Tools 的 ...

  5. 教你用Camtasia制作精美片头

    大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...

  6. IDM下载器添加支持自动下载的文件类型

    不知道各位读者老爷有没有试过IDM下载器的自动下载功能,对于经常需要下载素材资源的朋友来说,一个个的选择图片或者其他什么素材来下载也是够烦的,IDM的自动下载功能可谓是十分好用,而且自动下载+批量下载 ...

  7. FL studio系列教程(十):FL Studio中如何新建样本

    FL Studio中强调以样本为核心的编曲模式.样本其实就是一个小的音序片段,可以是单独的乐器或单独的打击乐,还可以是他们组合的一个小音序片段,它是我们学习编曲的最基础知识.所以本文主要为大家讲解的是 ...

  8. 「CSP-S 2019」括号树

    [题目描述] 传送门 [题解] 是时候讨论一下我在考场上是怎么将这道题写挂的了 初看这道题毫无思路,先看看部分分吧 一条链的情况?设k[i]表示前i个括号的方案数 显然\(k[i]=k[i-1]+\) ...

  9. 慢SQL优化:where id in (select max(id)...) 改为join后性能提升400倍

    背景 有两张表,都是主键递增,类似于主表和明细表: statistics_apply:统计申请表,主键applyId,7万多条记录 statistics_apply_progress:统计申请进度表( ...

  10. java中String类的使用

    一.Strng类的概念 String类在我们开发中经常使用,在jdk1.8版本之前(包括1.8),String类的底层是一个char类型的数组,1.8版本之后是byte类型的数组,正是因为String ...