SpringBoot使用MongoDB
一、什么是MongoDB
MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
二、MongoDB的安装和配置
1.下载安装包
访问这个地址下载对应的安装包https://www.mongodb.com/download-center#community。
以window版本为例,双击mongodb-win32-x86_64-3.4.15-signed.exe文件,除了路径改为其他盘符外其他默认就可以了,然后电脑里会多个mongodb的目录。

以管理员的身份运行cmd,进入对应的bin目录,输入命令
mongod --dbpath D:\data\db --logpath D:\log\mongodb.log --logappend --install --serviceName "MongoDB"
前提是你的电脑存在D:\data\db和D:\log,如果没有就自己先创建一个。先启动服务MongoDB再双击mongo.exe。如图则表示安装成功。

其他系统的安装步骤和使用可以参考菜鸟教程
三、整合SpringBoot
1.用idea新建项目时勾选mongodb就可以了,对应的pom是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.在application.properties文件中添加配置:
spring.data.mongodb.uri=mongodb://127.0.0.1:27017/test?maxPoolSize=256
总的格式是:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
这里因为没有开启安全认证(整了好久都没弄好。。),所以不需要输入用户名和密码。
3.代码编写,我们直接使用框架提供的mongoTemplate就可以了,但如果是spring框架的话还需要在xml文件中进行一些配置。

Person实体类
package cn.sp.bean; import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field; import java.io.Serializable;
import java.util.Date; /**
* @author ship
* @Description
* @Date: 2018-07-04 14:15
*/
//@Data lombok虽然好用但隐藏了好多坑啊,@RequestBody注解获取不到pId的值
@Document(collection = "personInfo")
public class Person implements Serializable{
@Id
@Field("p_id")
private int pId;
private String name;
private int age;
private Date birthday; public int getpId() {
return pId;
} public void setpId(int pId) {
this.pId = pId;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Date getBirthday() {
return birthday;
} public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
PersonDao接口
package cn.sp.dao; import cn.sp.bean.Person; /**
* @author ship
* @Description
* @Date: 2018-07-04 14:17
*/
public interface PersonDao { /**
* 插入
* @param person
*/
void insert(Person person); /**
* 更新文档
* @param person
*/
void update(Person person); /**
* 删除文档
* @param pId
*/
void delete(int pId); /**
* 查询文档
* @param pId
* @return
*/
Person findByPId(int pId);
}
实现类
package cn.sp.dao.Impl; import cn.sp.bean.Person;
import cn.sp.dao.PersonDao;
import com.mongodb.client.result.DeleteResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service; /**
* @author ship
* @Description
* @Date: 2018-07-04 14:17
*/
@Service("personDao")
public class PersonDaoImpl implements PersonDao{ @Autowired
private MongoTemplate mongoTemplate; @Override
public void insert(Person person) {
mongoTemplate.insert(person);
} @Override
public void update(Person person) {
Query query = new Query(Criteria.where("_id").is(person.getpId()));
Update update = new Update()
.set("name",person.getName())
.set("age",person.getAge())
.set("birthday",person.getBirthday());
//更新查询返回结果集的第一条
mongoTemplate.updateFirst(query,update,Person.class);
} @Override
public void delete(int pId) {
DeleteResult result = mongoTemplate.remove(new Query(Criteria.where("_id").is(pId)), Person.class);
} @Override
public Person findByPId(int pId) {
return mongoTemplate.findOne(new Query(Criteria.where("_id").is(pId)), Person.class);
}
}
controller层
package cn.sp.controller; import cn.sp.bean.Person;
import cn.sp.dao.PersonDao;
import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /**
* @author ship
* @Description
* @Date: 2018-07-04 15:25
*/
@RestController
@RequestMapping("person")
public class TestController { @Resource
private PersonDao personDao; @PostMapping("add")
public String addPerson(@RequestBody Person person){
System.out.println("插入数据:" + person.toString());
personDao.insert(person);
return "ok";
} @GetMapping("/{pId}")
public Person find(@PathVariable int pId){
return personDao.findByPId(pId);
} @DeleteMapping("/{pId}")
public String remove(@PathVariable int pId){
personDao.delete(pId);
return "ok";
} @PostMapping("update")
public String update(@RequestBody Person person){
personDao.update(person);
return "ok";
}
}
请大家注意实体上的注解,@Document(collection = "personInfo")将会在文档数据库中创建一个personInfo的集合,@Id表示指定该字段为主键, @Field("")表示实体字段存在MongoDB中的字段名称是什么。
根据MongoDB官方文档介绍,如果在插入数据时没有指定主键,MongoDB会自动给插入行自动加上一个主键_id,MongoDB客户端把这个id类型称为ObjectId,看上去就是一个UUID。我们可以通过注解自己设置主键类型,但是根据实践,_id名称是无法改变的。@Id和 @Field("p_id")表面看上去是我想创建一个p_id为主键的表,但是实际主键只有_id而没有p_id。当然,主键的类型不一定非要是UUID,可以是你自己根据业务生成的唯一流水号等等。
四、测试总结
分别使用postman(没用过的自己去下载)请求四个接口完成CURD操作,同时使用命令行查看数据情况。
use test
db.personInfo.find().pretty()
总的来说使用起来还是挺方便的,但是@Data注解自动生成getset方法有个坑,它会弄成setPId()和getPId(),如果是手动生成就是setpId()和getpId()。导致前端传来的json字符串转对象的时候pId这个属性一直是0,获取不到值。
之前也发现类似的坑,比如isValid,注解生成的就变成setValid()和getValid()。
参考链接:https://www.cnblogs.com/jeffwongishandsome/p/spring-boot-integrate-mongodb-practise.html
代码地址:https://github.com/2YSP/mongodb_demo
关于mongodb3.X开启安全认证的部分:http://www.yangbajing.me/2016/01/11/mongodb-3-x-%E7%94%A8%E6%88%B7%E8%AE%A4%E8%AF%81/
SpringBoot使用MongoDB的更多相关文章
- java操作mongodb & springboot整合mongodb
简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...
- springboot操作mongodb
springboot操作mongodb 采用MongoRepository操作mongodb springboot版本2.1.2.RELEASE 注意的是:在运行应用程序时,会报错OSS Algori ...
- SpringBoot整合mongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...
- SpringBoot与mongodb的结合
本文系列文章: 使用Shell 操作 MongoDB的技巧 MongoTemplate的使用技巧及其注意事项 敬请期待. 前言 最近公司想要做一个用户行为数据的收集,最开始想用mysql来存储 ...
- SpringBoot操作MongoDB实现增删改查
本篇博客主讲如何使用SpringBoot操作MongoDB. SpringBoot操作MongoDB实现增删改查 (1)pom.xml引入依赖 <dependency> <group ...
- SpringBoot结合MongoDB入门
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
- springboot连接mongodb进行CRUD
springboot连接mongodb进行CRUD的过程: 在执行以下操作前已安装了mongodb并创建了用户和数据库,使用Robo 3T可成功连接. 1.创建springboot项目,加入以下mav ...
- springboot集成mongoDB 异常认证
1.springboot连接mongoDB 出现异常认证 异常详情: com.mongodb.MongoSecurityException: Exception authenticating Mong ...
- 实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
1 简介 Springboot是最简单的使用Spring的方式,而MongoDB是最流行的NoSQL数据库.两者在分布式.微服务架构中使用率极高,本文将用实例介绍如何在Springboot中整合Mon ...
随机推荐
- [Bzoj1051][HAOI2006]受欢迎的牛(缩环)
1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 6676 Solved: 3502[Submit][Sta ...
- 清北省选 DAY last 集锦
这是题目描述的链接: http://lifecraft-mc.com/wp-content/uploads/2018/03/problems1.pdf (虽然这次没去清北,但还是厚颜无耻的做了一下这套 ...
- hdu6215 Brute Force Sorting(模拟)
题意 给一个长度为n(n<=1e5)的序列,如果一个位置i满足a[i-1]>a[i]或者a[i]>a[i+1],那么我们就称该位置是不合法的位置 先把序列中所有不合法的位置统一找出来 ...
- UVALive3211- Now or later(二分+2-SAT)
题目链接 题意:有n架飞机.每架飞机都能够选择早着陆和晚着陆两种方式之中的一个,且必须选择一种. 任务就是安排全部飞机着陆时.相邻两个着陆时间间隔的最小值尽量大. 思路:用二分处理最小值尽量大.该题目 ...
- hibernate查询之Criteria实现分页方法(GROOVY语法)
public int searchTest(String name, Integer pageIndex, List<Test> resultList){ def criteria = T ...
- Unity5的关卡切换
本文章由cartzhang编写,转载请注明出处. 全部权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51055584 作者:car ...
- LoadRunner压测时,出现的问题汇总
[问题]Error -10776 Failed to find .cfg file 错误分析:在loadrunner打开脚本的情况下,运行磁盘清理工具,导致运行打开的脚本时,提示Mdrv error ...
- Android之——AIDL深入
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071927 在上一篇博文<Android之--AIDL小结>中,我们 ...
- 一个程序员对微信小程序的看法
我们公司用两周的时间开发了一款微信小程序,叫<如e支付>,大家可以去体验一下.由于接口都是写好的,所以开发起来很快.我将从4个不同的角度来介绍我对微信小程序的理解. 1.技术的角度 ...
- sqlserver主机名变更后的错误与处理办法
sqlserver 服务器更改主机名后,须要做一些操作.不然维护计划 以及订阅公布都会有问题,详细过程例如以下:能够參考 有时改动计算机名后,运行select @@servername仍返回原来的计算 ...