Spring Boot (八)MyBatis + Docker + MongoDB 4.x
一、MongoDB简介
1.1 MongoDB介绍
MongoDB是一个强大、灵活,且易于扩展的通用型数据库。MongoDB是C++编写的文档型数据库,有着丰富的关系型数据库的功能,并在4.0之后添加了事务支持。
随着存储数据量不断的增加,开发者面临一个困难:如何扩展数据库?而扩展数据库分为横向扩展和纵向扩展,纵向扩展就是使用计算能力更强大的机器,它的缺点就是:机器性能的提升有物理极限的制约,而且大型机通常都是非常昂贵的,而MongoDB的设计采用的是横向扩展的模式,面向文档的数据模型使它很容易的在多台服务器上进行数据分割。MongoDB能自动处理夸集群的数据和负载,自动重新分配文档,这样开发者就能集中精力编写应用程序,而不需要考虑如果扩展的问题。
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上安装软件一般需要两步:
- pull(下载)对应的镜像(相对于下载软件)
- 装载镜像到容器(相对于安装软件)
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添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
Setp2:配置MongoDB连接
在application.properties添加如下配置:
spring.data.mongodb.uri=mongodb://username:pwd@172.16.10.79:27019/testdb
Setp3:创建实体类
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
private int age;
private String pwd;
//...略set、get
}
Setp4:创建Dao类
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class UserDao {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 添加用户
* @param user User Object
*/
public void insert(User user) {
mongoTemplate.save(user);
}
/**
* 查询所有用户
* @return
*/
public List<User> findAll() {
return mongoTemplate.findAll(User.class);
}
/**
* 根据id 查询
* @param id
* @return
*/
public User findById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
User user = mongoTemplate.findOne(query, User.class);
return user;
}
/**
* 更新
* @param user
*/
public void updateUser(User user) {
Query query = new Query(Criteria.where("id").is(user.getId()));
Update update = new Update().set("name", user.getName()).set("pwd", user.getPwd());
mongoTemplate.updateFirst(query, update, User.class);
}
/**
* 删除对象
* @param id
*/
public void deleteUserById(Long id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, User.class);
}
}
Setp4:创建Controller
import com.hello.springboot.dao.IndexBuilderDao;
import com.hello.springboot.dao.UserDao;
import com.hello.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
@RequestMapping("/")
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/")
public ModelAndView index() {
User user = new User();
user.setId(new Long(1));
user.setAge(18);
user.setName("Adam");
user.setPwd("123456");
userDao.insert(user);
ModelAndView modelAndView = new ModelAndView("/index");
modelAndView.addObject("count", userDao.findAll().size());
return modelAndView;
}
}
Setp5:创建页面代码
<html>
<head>
<title>王磊的博客</title>
</head>
<body>
Hello ${count}
</body>
</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 创建实体类
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
@Document(collection = "IndexBuilder")
public class IndexBuilder {
@Id
private String id;
private Long seq;
//..省略get、set方法
}
其中collection = "IndexBuilder"是指数据库的集合名称,对应关系型数据库的表名。
3.2.2 创建Dao类
import com.hello.springboot.entity.IndexBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Component;
import static org.springframework.data.mongodb.core.FindAndModifyOptions.options;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
@Component
public class IndexBuilderDao {
@Autowired
private MongoOperations mongo;
/**
* 查询下一个id
* @param collectionName 集合名
* @return
*/
public Long getNextSequence(String collectionName) {
IndexBuilder counter = mongo.findAndModify(
query(where("_id").is(collectionName)),
new Update().inc("seq", 1),
options().returnNew(true).upsert(true),
IndexBuilder.class);
return counter.getSeq();
}
}
3.2.3 使用“自增”的id
User user = new User();
user.setId(indexBuilderDao.getNextSequence("user"));
//...其他设置
核心代码:indexBuilderDao.getNextSequence("user") 使用“自增”的id,实现id自增。
到此为止,已经完成了MongoDB的自增功能,如果使用正常,数据库应该是这样的:
数据库的IndexBuilder就是用来记录每个集合的“自增id”的。
MongoDB集成的源码:https://github.com/vipstone/springboot-example/tree/master/springboot-mybatis-mongodb
Spring Boot (八)MyBatis + Docker + MongoDB 4.x的更多相关文章
- Spring Boot 整合MyBatis(1)
这篇文章介绍如何在Spring boot中整合Mybatis,其中sql语句采用注解的方式插入.后续文章将会介绍,如何使用xml方式. SSM SSH框架已经满足轻量级这个需求了,但是对于开发人员而言 ...
- Spring Boot 整合 Mybatis 实现 Druid 多数据源详解
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “清醒时做事,糊涂时跑步,大怒时睡觉,独处时思考” 本文提纲一.多数据源的应用场景二.运行 sp ...
- 使用intelliJ创建 spring boot + gradle + mybatis站点
Spring boot作为快速入门是不错的选择,现在似乎没有看到大家写过spring boot + gradle + mybatis在intellij下的入门文章,碰巧.Net同事问到,我想我也可以写 ...
- spring boot hello and docker
主要是想试下spring boot运行在docker里的感觉, 小试牛刀 :) 这是原文,参考一下: https://spring.io/guides/gs/spring-boot-docker ...
- Spring Boot整合Mybatis并完成CRUD操作
MyBatis 是一款优秀的持久层框架,被各大互联网公司使用,本文使用Spring Boot整合Mybatis,并完成CRUD操作. 为什么要使用Mybatis?我们需要掌握Mybatis吗? 说的官 ...
- Spring boot整合Mybatis
时隔两个月的再来写博客的感觉怎么样呢,只能用“棒”来形容了.闲话少说,直接入正题,之前的博客中有说过,将spring与mybatis整个后开发会更爽,基于现在springboot已经成为整个业界开发主 ...
- 学习Spring Boot:(二十三)Spring Boot 中使用 Docker
前言 简单的学习下怎么在 Spring Boot 中使用 Docker 进行构建,发布一个镜像,现在我们通过远程的 docker api 构建镜像,运行容器,发布镜像等操作. 这里只介绍两种方式: 远 ...
- Spring boot教程mybatis访问MySQL的尝试
Windows 10家庭中文版,Eclipse,Java 1.8,spring boot 2.1.0,mybatis-spring-boot-starter 1.3.2,com.github.page ...
- Spring Boot(八):RabbitMQ详解
Spring Boot(八):RabbitMQ详解 RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多 ...
- spring boot 实现mybatis拦截器
spring boot 实现mybatis拦截器 项目是个报表系统,服务端是简单的Java web架构,直接在请求参数里面加了个query id参数,就是mybatis mapper的query id ...
随机推荐
- 使用POST下载文件
一直以来,JS都没有比较好的可以直接处理二进制的方法.而Blob的存在,允许我们可以通过JS直接操作二进制数据.一.下载util.fetchDownload= function (opt,data) ...
- 4.SSM整合_多表_多对多的增删改查
多对多关系,课程和学生 接口 public interface CourseMapper { /** * 获取所有课程 * @return * @throws Exception */ public ...
- openCV 简单实现身高测量(未考虑相机标定,windows)
(一) OpenCV3.1.0+VS2015开发环境配置 下载OpenCV安装包(笔者下载3.1.0版本) 环境变量配置(opencv安装路径\build\x64\vc14\bin,注意的是x64文件 ...
- R语言读入数据库的中英名词互译测试并计分脚本(考试用)
1. 分子生物学中英文.csv,输入文件,两列,以tab键分隔的txt文本,没有列名 2. 错误的名解.csv, 如果在测试中拼写错误,会写出到这个文件,可用这个容易犯错的名词进行新的测试 3. 注意 ...
- 反编译python打包的exe文件
目录 1.前言 2.使用环境 3.还原过程 4.号外 5.exe文件和所用到的反编译工具 6.参考 7.去签名(补漏) 前言 拿到了利用驱动人生进行传播的病毒样本,发现是python打包成的exe文件 ...
- XML语言1.简介和语法
一.什么是XML语言? XML 指可扩展标记语言(Extensible Markup Language) Xml是独立于软件和硬件的信息传输工具. XML 是一种很像HTML的标记语言. 但xml不是 ...
- PTA第三次作业
---恢复内容开始--- 题目 7-1 计算职工工资 1.设计思路 (1)第一步:观察题意了解各个参数与所需函数在题目中的意义: 第二步:设计算法编写函数,让函数的功能实现题目中所需的功能: 第三步: ...
- 【XSS】利用 onload 事件监控流量劫持
说到跨站资源监控,首先会联想到『Content Security Policy』.既然 CSP 好用,我们何必自己再搞一套呢.那就先来吐槽下 CSP 的缺陷. 目前的 CSP 日志不详细 用过 CSP ...
- 解决 spring-cloud-starter-zipkin 启动错误
应用场景:Spring Boot 服务添加 Zipkin 依赖,进行服务调用的数据采集,然后进行 Zipkin-Server 服务调用追踪显示. 示例pom.xml配置: <parent> ...
- java中级或者高级面试题分享
一. 基础知识: 1)集合类:List和Set比较,各自的子类比较(ArrayList,Vector,LinkedList:HashSet,TreeSet): 2)HashMap的底层实现,之后会问C ...