zoukankan      html  css  js  c++  java
  • 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:datadb --logpath D:logmongodb.log --logappend --install --serviceName "MongoDB"

    前提是你的电脑存在D:datadb和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/

  • 相关阅读:
    23种设计模式
    iOS中 判断对象类型的一些方法
    iOS 反射获取类的属性列表
    CATransition--(2)
    CATransition
    App Extension编程指南(iOS8/OS X v10.10):常见问题的处理方案
    触摸、手势与响应者链条
    NSTimer使用
    监控数据库运行
    MS AX 技术相关网站收藏
  • 原文地址:https://www.cnblogs.com/2YSP/p/9264003.html
Copyright © 2011-2022 走看看