社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  docker

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

王磊的博客 • 5 年前 • 275 次点击  
阅读 24

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基础介绍安装与使用》:www.cnblogs.com/vipstone/p/…

1.3 Docker上安装MongoDB

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

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

1.3.1 下载镜像

下载镜像,需要到镜像市场:hub.docker.com/,如要要搜索的软件“m…

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的数据库工具,可以去官网下载: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集成的源码:github.com/vipstone/sp…


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/VtiyxQ1RYO
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/24856
 
275 次点击