Весенняя загрузка (8) MyBatis + Docker + MongoDB 4.x

база данных контейнер Docker MongoDB

1. Введение в 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»:Woohoo.cn blog on.com/vip Stone / foreaid / ...

1.3 Установите MongoDB на Docker

Установка программного обеспечения в Docker обычно требует двух шагов:

  1. вытащить (скачать) соответствующее зеркало (относительно скачиваемого софта)
  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: последнее имя и метка зеркала

Используйте «образы докеров». Просмотрите имя и метку образа, как показано ниже:

После успешной загрузки контейнера вы можете использовать клиент 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 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 bash

Setp2: создать базу данных

use testdb

Если testdb отсутствует, база данных будет создана автоматически.

Setp3: Создать базу данных назначений пользователей

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

Среди них роль: таблица "readWrite" дает пользователям права назначать операции и читать.Конечно, нет проблем с добавлением индексов и удалением таблиц.

Пока мы можем использовать admin/admin для работы с базой данных testdb.

1.3.5 Другие команды Docker

Удалить контейнер: docker container rm

Остановить контейнер: docker stop

Запустите контейнер: docker start

Просмотр запущенного контейнера: docker ps

Запросить все контейнеры: docker ps -a

2. 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: Создать класс Дао

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: Создать контроллер

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/" перейдите в базу данных для просмотра вставленных данных.

Нормальная вставка в базу данных выглядит следующим образом:

3. Автоматическое увеличение первичного ключа MongoDB

Внимательные пользователи могут обнаружить, что хотя MongoDB была интегрирована, идентификатор пользователя — это значение, установленное вручную при вставке в базу данных.

3.1 Идеи реализации

Реализация автоматического увеличения идентификатора в MongoDB аналогична Spring Boot JPA. Он создает таблицу в базе данных для записи «идентификатора автоматического увеличения» таблицы. Необходимо только обеспечить атомарность идентификатора, добавляемого каждый раз, и возвращаемого 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 Создание класса Дао

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 Использовать идентификатор «Самостоятельно увеличивающийся»

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

Основной код: indexBuilderDao.getNextSequence("user") Используйте "самоувеличивающийся" идентификатор для достижения самоувеличения идентификатора.

На данный момент функция автоинкремента MongoDB завершена, при нормальном использовании база данных должна выглядеть так:

IndexBuilder базы данных используется для записи «самоувеличивающегося идентификатора» каждой коллекции.

Исходный код для интеграции с MongoDB:GitHub.com/VIP stone/Билеты…