一、什么是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实体类
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 ship 13 * @Description 14 * @Date: 2018-07-04 14:15 15 */ 16 //@Data lombok虽然好用但隐藏了好多坑啊,@RequestBody注解获取不到pId的值 17 @Document(collection = "personInfo") 18 public class Person implements Serializable{ 19 @Id 20 @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 person 15 */ 16 void insert(Person person); 17 18 /** 19 * 更新文档 20 * @param person 21 */ 22 void update(Person person); 23 24 /** 25 * 删除文档 26 * @param pId 27 */ 28 void delete(int pId); 29 30 /** 31 * 查询文档 32 * @param pId 33 * @return 34 */ 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 ship 15 * @Description 16 * @Date: 2018-07-04 14:17 17 */ 18 @Service("personDao") 19 public class PersonDaoImpl implements PersonDao{ 20 21 @Autowired 22 private MongoTemplate mongoTemplate; 23 24 25 @Override 26 public void insert(Person person) { 27 mongoTemplate.insert(person); 28 } 29 30 @Override 31 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 @Override 42 public void delete(int pId) { 43 DeleteResult result = mongoTemplate.remove(new Query(Criteria.where("_id").is(pId)), Person.class); 44 } 45 46 @Override 47 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 ship 11 * @Description 12 * @Date: 2018-07-04 15:25 13 */ 14 @RestController 15 @RequestMapping("person") 16 public class TestController { 17 18 @Resource 19 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()。
参考链接: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/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/13253.html