MongoDB简介
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成,类似于JSON对象,字段值可以包含其他文档,数组及文档数组
SpringBoot整合MongoDB
创建SpringBoot项目并引入依赖
<!--MongoDB-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!--MongoDB工具包-->
<dependency>
<groupId>cn.craccd</groupId>
<artifactId>mongoHelper</artifactId>
<version>0.7.7</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
完善配置文件application.yml
server:
port: 8080
spring:
data:
mongodb:
authentication-database: admin
host: xxxx # 我在服务器上搭建的MongoDB,此处为主机号,如果是本机就填127.0.0.1
port: 27017
database: demo # 数据库名
username: wzc
password: 123456
maxWaitTime: 120000
#链接超时的毫秒数,0表示不超时,此参数只用在新建一个新链接时,推荐配置10,000.
connectTimeout: 10000
#此参数表示socket I/O读写超时时间,推荐为不超时,即 0 Socket.setSoTimeout(int)
socketTimeout: 60000
创建实体类
User类
package com.springbootdemo.entity;
import lombok.*;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private String id;
/**
* 用户昵称
*/
private String username;
/**
* 密码
*/
private String password;
}
Blog类
package com.springbootdemo.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("Blog") // 对应MongoDB中的集合名
public class Blog {
@Id // 此注解不可省略
private String id;
/**
* 博客标题
*/
private String title;
/**
* 博客内容
*/
private String content;
/**
* 创建时间
*/
private Date createTime;
/**
* 作者
*/
private User author;
/**
* 标签
*/
private List<String> tags;
}
实现增删改查
如果按照传统的方式就可以直接用mongoTemplate来操作了,但我个人认为这种方式不够简便,就引入了一个
MongoDB的工具包:mongoHelper[Gitee地址:https://gitee.com/cym1102/mongoHelper],用起来非常丝滑,类似于Mybatis-plus的方便程度。下面用该工具实现简单的增删改查,详情点击上方项目地址了解。
配置MongoConfig
package com.edu.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"cn.craccd"})
public class MongoConfig {
}
创建测试类
package com.springbootdemo;
import cn.craccd.mongoHelper.utils.CriteriaAndWrapper;
import cn.craccd.mongoHelper.utils.MongoHelper;
import com.springbootdemo.entity.Blog;
import com.springbootdemo.entity.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SpringBootTest
public class MongoDBTest {
@Resource
private MongoHelper mongoHelper;
public final static String ID = "635e9af365d65b0a44e6c69b";
@Test
public void addRecord() {
User user = new User("1", "小明", "123456");
List<String> tags = new ArrayList<>();
tags.add("编程");
tags.add("Java");
Blog blog = new Blog(ID, "博客标题", "博客内容", new Date(), user, tags);
mongoHelper.insert(blog);
}
@Test
public void updateRecord() {
Blog blog = mongoHelper.findById(ID, Blog.class);
blog.setContent("更新后的博客内容");
mongoHelper.updateById(blog);
System.out.println(blog);
}
@Test
public void deleteRecord() {
mongoHelper.deleteById(ID, Blog.class);
}
@Test
public void searchRecord() {
CriteriaAndWrapper criteriaAndWrapper = new CriteriaAndWrapper(); // 条件构造器
criteriaAndWrapper.like(Blog::getTitle, "博客"); // 模糊查询
List<Blog> blogs = mongoHelper.findListByQuery(criteriaAndWrapper, Blog.class);
}
}
运行成功,可以看到MongoDB中已经有数据了
细心的小伙伴们可能会注意到,数据库里显示的创建时间与当前时间差了8个小时,这是因为存储在MongoDB中的时间是标准时间,与中国的时区正好相差8小时,但是大家也不必担心,因为从数据库中查询出来的结果会自动换算成我们所在的时区,如下图:
总结
虽然MySQL已经是国内当前最流行的数据库,但在某些场景下,MongoDB这种非关系型数据库也有独特的优势。比如以上这个以博客为主题的项目,如果使用MySQL就需要创建用户、博客、标签三张表,而在MongoDB中用一个集合就可以搞定,所以大家还是要结合具体的业务场景来选择合适的数据库。