Spring Boot (八)MyBatis + Docker + MongoDB 4.x

一、MongoDB简介

1.1 MongoDB介绍

MongoDB是一个强大、灵活,且易于扩展的通用型数据库。MongoDB是C++编写的文档型数据库,有着丰富的关系型数据库的功能,并在4.0之后添加了事务支持。

随着存储数据量不断的增加,开发者面临一个困难:如何扩展数据库?而扩展数据库分为横向扩展和纵向扩展,纵向扩展就是使用计算能力更强大的机器,它的缺点就是:机器性能的提升有物理极限的制约,而且大型机通常都是非常昂贵的,而MongoDB的设计采用的是横向扩展的模式,面向文档的数据模型使它很容易的在多台服务器上进行数据分割。MongoDB能自动处理夸集群的数据和负载,自动重新分配文档,这样开发者就能集中精力编写应用程序,而不需要考虑如果扩展的问题。

<!--more-->

1.2 MongoDB安装

MongoDB的安装简单来说分为两种:

  • 官网下载对应物理机的安装包,直接安装
  • 使用Docker镜像,安装到Docker上

推荐使用第二种,直接使用MongoDB镜像安装到Docker上,这样带来的好处是:

  • 安装简单、方便,且快速
  • 更容易进行数据迁移,使用Docker可以很容易的导入和导出整个MongoDB到任何地方

所以本文将重点介绍MongoDB在Docker上的安装和使用。

如果想要直接在物理机安装Docker,可以查看我之前的一篇文章《MongoDB基础介绍安装与使用》:https://www.cnblogs.com/vipstone/p/8494347.html

1.3 Docker上安装MongoDB

在Docker上安装软件一般需要两步:

  1. pull(下载)对应的镜像(相对于下载软件)
  2. 装载镜像到容器(相对于安装软件)

1.3.1 下载镜像

下载镜像,需要到镜像市场:https://hub.docker.com/,如要要搜索的软件“mongo”,选择官方镜像“Official”,点击详情,获取相应的下载方法,我们得到下载MongoDB的命令如下:

docker pull mongo:latest

1.3.2 装载镜像到容器

使用命令:

docker run --name mongodb1 -p 27018:27017 -d mongo:latest

  • --name 指定容器名称
  • -p 27018:27017 映射本地端口27018到容器端口27017
  • -d 后台运行
  • mongo:latest 镜像名称和标签

使用“docker images”查看镜像名称和标签,如下图:

容器装载成功之后,就可以使用Robo 3T客户端进行连接了,是不需要输入用户名和密码的,如下图:

表示已经连接成功了。

Robo 3T为免费的连接MongoDB的数据库工具,可以去官网下载:https://robomongo.org/download

1.3.3 开启身份认证

如果是生成环境,没有用户名和密码的MongoDB是非常不安全的,因此我们需要开启身份认证。

Setp1:装载容器

我们还是用之前下载的镜像,重新装载一个容器实例,命令如下:

docker run --name mongodb2 -p 27019:27017 -d mongo:latest --auth

其中“--auth”就是开启身份认证。

装载完身份认证成功容器之后,我们需要进入容器内部,给MongoDB设置用户名和密码。

Setp2:进入容器内部

docker exec -it <容器id/名称> bash

Setp3:进入mongo命令行模式

mongo admin

Setp4:创建用户

db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

创建的用户名为“admin”密码为“admin”,指定的数据库为“admin”。

这个时候,我们使用Robo 3T 输入相应的信息进行连接,如下图:

表示已经连接成功了。

1.3.4 创建数据库设置用户

上面我们用“admin”账户使用了系统数据库“admin”,通常在生成环境我们不会直接使用系统的数据库,这个时候我们需要自己创建自己的数据库分配相应的用户。

Setp1:首先需要进入容器

docker exec -it <容器id/名称> bash

Setp2:创建数据库

use testdb

如果没有testdb就会自动创建数据库。

Setp3:创建用户分配数据库

db.createUser({ user: 'admin', pwd: 'admin', roles: [ { role: "readWrite", db: "testdb" } ] });

其中 role: "readWrite" 表式给用户赋值操作和读取的权限,当然增加索引、删除表什么的也是完全没有问题的。

到目前为止我们就可以使用admin/admin操作testdb数据库了。

1.3.5 其他Docker命令

删除容器:docker container rm <容器id/名称>

停止容器:docker stop <容器id/名称>

启动容器:docker start <容器id/名称>

查看运行是容器:docker ps

查询所有的容器:docker ps -a

二、MyBatis集成MongoDB

Spring Boot项目集成MyBatis前两篇文章已经做了详细的介绍,这里就不做过多的介绍,本文重点来介绍MongoDB的集成。

Setp1:添加依赖

在pom.xml添加如下依赖:

1<dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-data-mongodb</artifactId> 4</dependency>

Setp2:配置MongoDB连接

在application.properties添加如下配置:

spring.data.mongodb.uri=mongodb://username:pwd@172.16.10.79:27019/testdb

Setp3:创建实体类

1import java.io.Serializable; 2 3public class User implements Serializable { 4 private Long id; 5 private String name; 6 private int age; 7 private String pwd; 8 //...略set、get 9} 10

Setp4:创建Dao类

1import com.hello.springboot.entity.User; 2import org.springframework.beans.factory.annotation.Autowired; 3import org.springframework.data.mongodb.core.MongoTemplate; 4import org.springframework.data.mongodb.core.query.Criteria; 5import org.springframework.data.mongodb.core.query.Query; 6import org.springframework.data.mongodb.core.query.Update; 7import org.springframework.stereotype.Component; 8import java.util.List; 9 10@Component 11public class UserDao { 12 @Autowired 13 private MongoTemplate mongoTemplate; 14 /** 15 * 添加用户 16 * @param user User Object 17 */ 18 public void insert(User user) { 19 mongoTemplate.save(user); 20 } 21 22 /** 23 * 查询所有用户 24 * @return 25 */ 26 public List<User> findAll() { 27 return mongoTemplate.findAll(User.class); 28 } 29 30 /** 31 * 根据id 查询 32 * @param id 33 * @return 34 */ 35 public User findById(Long id) { 36 Query query = new Query(Criteria.where("id").is(id)); 37 User user = mongoTemplate.findOne(query, User.class); 38 return user; 39 } 40 41 /** 42 * 更新 43 * @param user 44 */ 45 public void updateUser(User user) { 46 Query query = new Query(Criteria.where("id").is(user.getId())); 47 Update update = new Update().set("name", user.getName()).set("pwd", user.getPwd()); 48 mongoTemplate.updateFirst(query, update, User.class); 49 } 50 51 /** 52 * 删除对象 53 * @param id 54 */ 55 public void deleteUserById(Long id) { 56 Query query = new Query(Criteria.where("id").is(id)); 57 mongoTemplate.remove(query, User.class); 58 } 59 60} 61

Setp4:创建Controller

1import com.hello.springboot.dao.IndexBuilderDao; 2import com.hello.springboot.dao.UserDao; 3import com.hello.springboot.entity.User; 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.web.bind.annotation.RequestMapping; 6import org.springframework.web.bind.annotation.RestController; 7import org.springframework.web.servlet.ModelAndView; 8 9@RestController 10@RequestMapping("/") 11public class UserController { 12 @Autowired 13 private UserDao userDao; 14 15 @RequestMapping("/") 16 public ModelAndView index() { 17 User user = new User(); 18 user.setId(new Long(1)); 19 user.setAge(18); 20 user.setName("Adam"); 21 user.setPwd("123456"); 22 userDao.insert(user); 23 24 ModelAndView modelAndView = new ModelAndView("/index"); 25 modelAndView.addObject("count", userDao.findAll().size()); 26 return modelAndView; 27 } 28} 29

Setp5:创建页面代码

1<html> 2<head> 3 <title>王磊的博客</title> 4</head> 5<body> 6Hello ${count} 7</body> 8</html>

到此为止已经完成了MongoDB的集成,启动项目,输入“http://localhost:8080/”去数据库查看插入的数据吧。

正常插入数据库如下图:

三、MongoDB主键自增

细心的用户可能会发现,虽然MongoDB已经集成完了,但插入数据库的时候user的id是手动set的值,接下来我们来看怎么实现MongoDB中的id自增。

3.1 实现思路

MongoDB 实现id自增和Spring Boot JPA类似,是在数据库创建一张表,来记录表的“自增id”,只需要保证每次都增加的id和返回的id的原子性,就能保证id实现“自增”的功能。

3.2 实现方案

有了思路之后,接下来我们来看具体的实现方案。

3.2.1 创建实体类

1import org.springframework.data.annotation.Id; 2import org.springframework.data.mongodb.core.mapping.Document; 3 4@Document(collection = "IndexBuilder") 5public class IndexBuilder { 6 @Id 7 private String id; 8 private Long seq; 9 //..省略get、set方法 10}

其中collection = "IndexBuilder"是指数据库的集合名称,对应关系型数据库的表名。

3.2.2 创建Dao类

1import com.hello.springboot.entity.IndexBuilder; 2import org.springframework.beans.factory.annotation.Autowired; 3import org.springframework.data.mongodb.core.MongoOperations; 4import org.springframework.data.mongodb.core.query.Update; 5import org.springframework.stereotype.Component; 6import static org.springframework.data.mongodb.core.FindAndModifyOptions.options; 7import static org.springframework.data.mongodb.core.query.Criteria.where; 8import static org.springframework.data.mongodb.core.query.Query.query; 9 10@Component 11public class IndexBuilderDao { 12 @Autowired 13 private MongoOperations mongo; 14 /** 15 * 查询下一个id 16 * @param collectionName 集合名 17 * @return 18 */ 19 public Long getNextSequence(String collectionName) { 20 IndexBuilder counter = mongo.findAndModify( 21 query(where("_id").is(collectionName)), 22 new Update().inc("seq", 1), 23 options().returnNew(true).upsert(true), 24 IndexBuilder.class); 25 return counter.getSeq(); 26 } 27}

3.2.3 使用“自增”的id

1User user = new User(); 2user.setId(indexBuilderDao.getNextSequence("user")); 3//...其他设置

核心代码:indexBuilderDao.getNextSequence("user") 使用“自增”的id,实现id自增。

到此为止,已经完成了MongoDB的自增功能,如果使用正常,数据库应该是这样的:

数据库的IndexBuilder就是用来记录每个集合的“自增id”的。

MongoDB集成的源码:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis-mongodb

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

swap空间的增减方法

(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap