博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot使用MongoDB
阅读量:5093 次
发布时间:2019-06-13

本文共 6359 字,大约阅读时间需要 21 分钟。

一、什么是MongoDB

MongoDB是一个基于分布式文件存储的数据库,由语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

二、MongoDB的安装和配置

1.下载安装包

访问这个地址下载对应的安装包。

以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是

org.springframework.boot
spring-boot-starter-data-mongodb

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实体类

1 package cn.sp.bean; 2  3 import lombok.Data; 4 import org.springframework.data.annotation.Id; 5 import org.springframework.data.mongodb.core.mapping.Document; 6 import org.springframework.data.mongodb.core.mapping.Field; 7  8 import java.io.Serializable; 9 import java.util.Date;10 11 /**12  * @author ship13  * @Description14  * @Date: 2018-07-04 14:1515  */16 //@Data  lombok虽然好用但隐藏了好多坑啊,@RequestBody注解获取不到pId的值17 @Document(collection = "personInfo")18 public class Person implements Serializable{19     @Id20     @Field("p_id")21     private int pId;22     private String name;23     private int  age;24     private Date  birthday;25 26     public int getpId() {27         return pId;28     }29 30     public void setpId(int pId) {31         this.pId = pId;32     }33 34     public String getName() {35         return name;36     }37 38     public void setName(String name) {39         this.name = name;40     }41 42     public int getAge() {43         return age;44     }45 46     public void setAge(int age) {47         this.age = age;48     }49 50     public Date getBirthday() {51         return birthday;52     }53 54     public void setBirthday(Date birthday) {55         this.birthday = birthday;56     }57 }
View Code

PersonDao接口

1 package cn.sp.dao; 2  3 import cn.sp.bean.Person; 4  5 /** 6  * @author ship 7  * @Description 8  * @Date: 2018-07-04 14:17 9  */10 public interface PersonDao {11 12     /**13      * 插入14      * @param person15      */16     void insert(Person person);17 18     /**19      * 更新文档20      * @param person21      */22     void update(Person person);23 24     /**25      * 删除文档26      * @param pId27      */28     void delete(int pId);29 30     /**31      * 查询文档32      * @param pId33      * @return34      */35     Person findByPId(int pId);36 }
View Code

实现类

1 package cn.sp.dao.Impl; 2  3 import cn.sp.bean.Person; 4 import cn.sp.dao.PersonDao; 5 import com.mongodb.client.result.DeleteResult; 6 import org.springframework.beans.factory.annotation.Autowired; 7 import org.springframework.data.mongodb.core.MongoTemplate; 8 import org.springframework.data.mongodb.core.query.Criteria; 9 import org.springframework.data.mongodb.core.query.Query;10 import org.springframework.data.mongodb.core.query.Update;11 import org.springframework.stereotype.Service;12 13 /**14  * @author ship15  * @Description16  * @Date: 2018-07-04 14:1717  */18 @Service("personDao")19 public class PersonDaoImpl implements PersonDao{20 21     @Autowired22     private MongoTemplate mongoTemplate;23 24 25     @Override26     public void insert(Person person) {27         mongoTemplate.insert(person);28     }29 30     @Override31     public void update(Person person) {32         Query query = new Query(Criteria.where("_id").is(person.getpId()));33         Update update = new Update()34                             .set("name",person.getName())35                             .set("age",person.getAge())36                             .set("birthday",person.getBirthday());37         //更新查询返回结果集的第一条38         mongoTemplate.updateFirst(query,update,Person.class);39     }40 41     @Override42     public void delete(int pId) {43         DeleteResult result = mongoTemplate.remove(new Query(Criteria.where("_id").is(pId)), Person.class);44     }45 46     @Override47     public Person findByPId(int pId) {48         return mongoTemplate.findOne(new Query(Criteria.where("_id").is(pId)), Person.class);49     }50 }
View Code

controller层

1 package cn.sp.controller; 2  3 import cn.sp.bean.Person; 4 import cn.sp.dao.PersonDao; 5 import org.springframework.web.bind.annotation.*; 6  7 import javax.annotation.Resource; 8  9 /**10  * @author ship11  * @Description12  * @Date: 2018-07-04 15:2513  */14 @RestController15 @RequestMapping("person")16 public class TestController {17 18     @Resource19     private PersonDao personDao;20 21 22     @PostMapping("add")23     public String addPerson(@RequestBody Person person){24         System.out.println("插入数据:" + person.toString());25         personDao.insert(person);26         return "ok";27     }28 29     @GetMapping("/{pId}")30     public Person find(@PathVariable int pId){31         return personDao.findByPId(pId);32     }33 34     @DeleteMapping("/{pId}")35     public String remove(@PathVariable int pId){36         personDao.delete(pId);37         return "ok";38     }39 40     @PostMapping("update")41     public String update(@RequestBody Person person){42         personDao.update(person);43         return "ok";44     }45 }
View Code

请大家注意实体上的注解,@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()。

参考链接:

代码地址:

关于mongodb3.X开启安全认证的部分:

转载于:https://www.cnblogs.com/2YSP/p/9264003.html

你可能感兴趣的文章
mybatis--面向接口编程
查看>>
yii第三方插件snoopy配置
查看>>
分立元件封装尺寸及PCB板材工艺与设计实例
查看>>
Web前端学习笔记(三)——input标签的属性
查看>>
BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)
查看>>
BZOJ.1312.[Neerc2006]Hard Life(分数规划 最大权闭合子图)
查看>>
js的concat函数、join 、slice函数及二维数组的定义方式
查看>>
Vue的单页应用中如何引用单独的样式文件
查看>>
html5利用getObjectURL获取图片路径上传图片
查看>>
学习资料
查看>>
.net中序列化读写xml方法的总结
查看>>
转]python 结巴分词(jieba)学习
查看>>
hread.interrupt()到底意味着什么
查看>>
分享我的iOS app 开发杂谈3
查看>>
页面上通过地址栏传值时出现乱码的两种解决方法
查看>>
jq遍历的基础语法之一
查看>>
肝毒净-道格拉斯实验室
查看>>
LinkedHashMap 底层分析
查看>>
第二次作业—熟悉使用工具
查看>>
Animation中的scale、rotate、translate、alpha
查看>>