После использования MyBatis-Plus я больше никогда не захочу использовать mybatis — краткое введение в MyBatis-Plus плюс краткий обзор общих аннотаций и быстрое освоение MyBatis-Plus в одной статье.
После использования MyBatis-Plus я больше никогда не захочу использовать mybatis — краткое введение в MyBatis-Plus плюс краткий обзор общих аннотаций и быстрое освоение MyBatis-Plus в одной статье.

По сравнению с мибатисом сделаны только улучшения, никаких модификаций.

Один, что такое

MyBatis-Plus — это инструмент улучшения mybatis. характеристика: Никаких вторжений: Делаются только доработки на основе мибатиса без изменений. Низкие потери: базовый творог будет впрыскиваться при запуске, с базовой потерей производительности, прямая объектно-ориентированная операция. Мощная операция Curd: встроенный Mapper и общий сервис, большинство операций Crud на одной таблице могут быть реализованы с помощью лишь небольшого количества настроек, мощный условный конструктор для удовлетворения различных потребностей. Поддерживает вызов лямбда-формы: с помощью лямбда-выражений вы можете легко писать различные условные запросы, не беспокоясь о опечатках в полях. Поддерживает автоматическое создание первичных ключей: поддерживает до четырех стратегий первичного ключа. Встроенный генератор кода: используйте код или плагин maven для быстрого создания кодов слоев картографов, моделей, сервисов и контроллеров, а также поддержки механизмов шаблонов. Встроенный подключаемый модуль разбиения на страницы. Благодаря физическому разбиению на страницы mybatis разработчикам не нужно заботиться о конкретных операциях. После настройки подключаемого модуля написание разбиения на страницы эквивалентно обычным операциям со списками. Плагин подкачки поддерживает несколько баз данных: поддерживает MySQL, Oracle, DB2, hsql и другие базы данных. и т. д. Для получения дополнительной информации перейдите на официальный сайт:

Язык кода:javascript
копировать
https://baomidou.com/

2. Кейс «Начало работы»

1. Создайте базу данных и таблицу.

Язык кода:javascript
копировать
# Построить базу данных и таблицу
CREATE DATABASE `LBB` 
USE `LBB`;
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL COMMENT «Идентификатор первичного ключа»,
`name` VARCHAR(30) DEFAULT NULL COMMENT 'Имя',
`age` INT(11) DEFAULT NULL COMMENT 'возраст',
`email` VARCHAR(50) DEFAULT NULL COMMENT 'Почта',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
# Вставить данные
INSERT INTO USER (id, NAME, age, email) VALUES
(1, 'Jone', 18, '18@qq.com'),
(2, 'Jack', 19, '19@qq.com'),
(3, 'Tom', 20, '20@qq.com'),
(4, 'Lucy', 21, '21@qq.com'),
(5, 'bob', 22, '22@qq.com');

2. Создайте проект Spring Boot.

1. Используйте инициализацию для создания и внедрения зависимостей.

Язык кода:javascript
копировать
<dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--spring bootTest-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--mybatis -plus полагаться-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.3.1</version>
        </dependency>
        <!--Lombokполагаться,Также необходимо скачатьLombokплагин-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--MySQLПодключить драйвер-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

2.Настройте файл application.yml.

Язык кода:javascript
копировать
spring:
# Данные конфигурации — информация
datasource:
# Тип источника данных конфигурации
type: com.zaxxer.hikari.HikariDataSource
# Информация о базе данных конфигурационного соединения
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/lbb?characterEncoding=utf-
8&useSSL=false
username: root
password: 021806

Уведомление: spring boot 2.0 (встроенный драйвер jdbc5), использование класса драйвера: имя-класса-драйвера: com.mysql.jdbc.Driver spring boot 2.1 и выше (встроенный драйвер jdbc8), класс драйвера использует: driver-class-name: com.mysql.cj.jdbc.Driver В противном случае при запуске тестового примера будет WARN информация 2. URL-адрес адреса подключения. URL-адрес версии MySQL5.7: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false URL-адрес версии MySQL8.0: jdbc:mysql://localhost:3306/mybatis_plus? serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false В противном случае при запуске тестового примера выдается следующая ошибка: java.sql.SQLException: The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more

3. Настройте связанные пакеты и классы.

1. Сканирование основного пакета настроек класса

Язык кода:javascript
копировать
@SpringBootApplication
@MapperScan("com.li.mptest.mapper")//Сканировать пакет картографа
public class MpTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(MpTestApplication.class, args);
    }

}

2.Установить класс сущности

Язык кода:javascript
копировать
@Data   //lombok аннотация
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

3.Добавить картограф

Язык кода:javascript
копировать
public interface UserMapper extends BaseMapper<User> {

}

BaseMapper — это средство сопоставления шаблонов, предоставляемое MyBatis-Plus, которое содержит базовые методы CRUD и универсальные методы для операций. Тип объекта

4. Тест

Язык кода:javascript
копировать
@SpringBootTest
class MpTestApplicationTests {
    @Autowired
    private UserMapper userMapper;


    @Test
    void contextLoads() {
        //selectList() запрашивает коллекцию списков на основе встроенного конструктора условий MP. Значение null означает отсутствие условия, то есть запросить все.
        userMapper.selectList(null).forEach(System.out::println);
    }

}

3. Базовый творог

Для удобства просмотра базовые выполняемые операторы можно просмотреть в журнале конфигурации.

Язык кода:javascript
копировать
# КонфигурацияMyBatis日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

1.BaseMapper

Официальный базовый преобразователь инкапсулирует простые методы.

Язык кода:javascript
копировать
public interface BaseMapper<T> extends Mapper<T> {

    /**
     * вставить запись
     *
     * @param entity Сущность объект
     */
    int insert(T entity);

    /**
     * в соответствии с ID удалитьудалять
     *
     * @param id Идентификатор первичного ключа
     */
    int deleteById(Serializable id);

    /**
     * в соответствии с columnMap Условия удаления записи
     *
     * @param columnMap поля таблицы map объект
     */
    int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * в соответствии с entity Условия удаления записи
     *
     * @param wrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);

    /**
     * удалитьудалять(в соответствии сID 批量удалитьудалять)     *
     * @param idList Идентификатор первичного список ключей (не может быть null а также empty)
     */
    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * в соответствии с ID Исправлять
     *
     * @param entity Сущность объект
     */
    int updateById(@Param(Constants.ENTITY) T entity);

    /**
     * в соответствии с whereEntity состояние, обновить запись
     *
     * @param entity        Сущность объект (set Условие ценить может быть null)
     * @param updateWrapper Сущность класс операции инкапсуляции объекта (может быть ноль, внутри entity используется для создания where заявление)
     */
    int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);

    /**
     * в соответствии с ID Запрос
     *
     * @param id Идентификатор первичного ключа
     */
    T selectById(Serializable id);

    /**
     * Запрос(в соответствии сID Массовый Запрос)
     *
     * @param idList Идентификатор первичного список ключей (не может быть null а также empty)
     */
    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

    /**
     * Запрос(в соответствии с columnMap состояние)
     *
     * @param columnMap поля таблицы map объект
     */
    List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

    /**
     * в соответствии с entity состояние,Запись запроса
     *
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с Wrapper состояние,Запросить общее количество записей
     *
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с entity состояние,Все записи Запроса
     *
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с Wrapper состояние,Все записи Запроса
     *
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с Wrapper состояние,Все записи Запроса
     * <p>Уведомление: 只返回第一个字段的ценить</p>
     *
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с entity состояние,Все записи Запроса(и перевернуть страницу)
     *
     * @param page         Пагинация Запроссостояние(может быть RowBounds.DEFAULT)
     * @param queryWrapper Сущность класс операции инкапсуляции объекта (может быть null)
     */
    <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

    /**
     * в соответствии с Wrapper состояние,Все записи Запроса(и перевернуть страницу)
     *
     * @param page         Пагинация Запроссостояние
     * @param queryWrapper Сущность объект Класс операции инкапсуляции
     */
    <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
}

Наблюдая за методами в BaseMapper, большинство методов имеют формальные параметры типа Wrapper. Это условный конструктор, который может быть. Установите различные условия для оператора SQL. Если условий нет, вы можете присвоить формальному параметру значение null, то есть запросить (удалить/изменить) значение. Данные есть, а статья про Wrapper будет подробно представлена ​​позже.

2.Общее обслуживание

CRUD общего обслуживания инкапсулирует интерфейс IService и дополнительно инкапсулирует CRUD, используя get для запроса удаления и удаления одной строки. В дополнение к разбиению страниц на страницы коллекции запросов списка, метод именования префиксов различает слой Mapper, чтобы избежать путаницы. Generic T — это любой объект сущности. Если есть возможность настроить общий метод Service, вы можете создать собственное наследование IBaseService. Базовый класс предоставлен Mybatis-Plus. Официальный адрес сайта:

Язык кода:javascript
копировать
https://baomidou.com/pages/49cc81/#service-crud-%E6%8E%A5%E5%8F%A3

В MyBatis-Plus есть интерфейс IService и класс его реализации ServiceImpl, который инкапсулирует общую логику бизнес-уровня.

О том, как использовать: простой пример:

Запросить общее количество записей

1. Создайте интерфейс службы и класс реализации.

Язык кода:javascript
копировать
public interface UserService extends IService<User> {
}
Язык кода:javascript
копировать
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements
        UserService
{
}

2. Тест

Язык кода:javascript
копировать
@Autowired
   UserService userService;
    @Test
    public void testGetCount(){
        long count = userService.count();
        System.out.println("Общее количество записей:" + count);
    }

4. Часто используемые аннотации

1.@TableName

При использовании MyBatis-Plus для реализации базового CRUD нам не нужно указывать таблицу, с которой нужно работать. Нам нужно только установить общий тип (Пользователь), когда интерфейс Mapper наследует BaseMapper, который определяется универсальным типом BaseMapper. is, тип сущности и значение по умолчанию. Имя таблицы операции соответствует имени класса типа сущности. Если это противоречиво, используйте аннотацию @TableName.

Язык кода:javascript
копировать
@Data   //lombok аннотация
@TableName("t_user") //Имя таблицы в базе данных — t_user
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

Конечно, если вы хотите удалить префиксы большого количества таблиц, вы можете установить глобальные переменные.

Язык кода:javascript
копировать
ybatis-plus:
configuration:
# Журнал конфигурацииMyBatis
журнал-осуществление: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# Конфигурация Префикс по умолчанию для таблиц действий MyBatis-Plus.
table-prefix: t_

2.@TableId

Когда MyBatis-Plus реализует CRUD, он по умолчанию будет использовать id в качестве столбца первичного ключа, а при вставке данных он будет генерировать id на основе стратегии алгоритма снежинки, если первичный ключ в классе сущности и таблице не равен id. , но другие поля, такие как uid, MyBatis-Plus выдаст исключение, если не сможет его распознать. Поле «uid» не имеет значения по умолчанию, что указывает на то, что MyBatis-Plus не использует uid в качестве первичного ключа. Отметьте его как первичный ключ с помощью @TableId в атрибуте uid в классе сущности, и оператор SQL может быть успешно выполнен.

атрибут значения

Язык кода:javascript
копировать
@Data   //lombok аннотация
@TableName("t_user") //Имя таблицы в базе данных — t_user
public class User {
    @TableId("uid")
    private Long uid;
    private String name;
    private Integer age;
    private String email;
}

атрибут типа Используется для установки стратегии генерации первичного ключа. По умолчанию используется алгоритм «снежинка».

Распространенные типы

ценить

значение

idType.ASSIGN_ID

Стратегия, основанная на алгоритме снежинки, генерирует идентификатор данных независимо от того, установлен ли для идентификатора базы данных автоматическое приращение.

IdType.AUTO

Используйте стратегию автоматического увеличения базы данных. Обратите внимание: для этого типа убедитесь, что в базе данных установлено автоматическое увеличение идентификатора, иначе он будет недействительным.

Конечно, его также можно установить через глобальные переменные.

Язык кода:javascript
копировать
mybatis-plus:
configuration:
# Журнал конфигурацииMyBatis
журнал-осуществление: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
# Конфигурация Префикс по умолчанию для таблиц действий MyBatis-Plus.
table-prefix: t_
# Конфигурация стратегии первичного ключа MyBatis-Plus
id-type: auto

3@TableField

Когда MyBatis-Plus выполняет инструкции SQL, он должен гарантировать, что имена атрибутов в классе сущностей совпадают с именами полей в таблице. Если имена атрибутов и имена полей в классе сущностей несовместимы, Если атрибуты в классе сущностей используют стиль именования верблюжьего регистра, а поля в таблице используют стиль именования с подчеркиванием, например имя класса сущности userName и поле user_name в таблице, MyBatis-Plus автоматически преобразует подчеркивание стиль именования в стиле именования Camel. Эквивалент настройки в MyBatis. Например, имя атрибута класса сущности и имя пользователя поля таблицы. На данный момент вам необходимо использовать @TableField("username") в атрибуте класса сущности, чтобы установить имя поля, соответствующее атрибуту.

Язык кода:javascript
копировать
@Data   //lombok аннотация
@TableName("t_user") //Имя таблицы в базе данных — t_user
public class User {
    @TableId("uid")
    private Long uid;
    @TableField("username")
    private String name;
    private Integer age;
    private String email;
}

4.@TableLogic

надгробие Физическое удаление: реальное удаление, соответствующие данные удаляются из базы данных, и удаленные данные не могут быть запрошены позже. Логическое удаление: Фейковое удаление, изменение статуса соответствующего поля в данных на «статус удален», а затем в базе данных. Эту запись данных все еще можно увидеть в Сценарий использования: возможно восстановление данных.

Сначала добавьте поле в таблицу базы данных, представляющее надгробие.

Протестируйте функцию удаления. На самом деле выполняется модификация. При повторном запросе логически удаленные данные не будут запрошены по умолчанию.

Язык кода:javascript
копировать
UPDATE t_user SET is_deleted=1 WHERE id=? AND is_deleted=0

5. Плагин нумерации страниц

1.>добавить в Конфигурациядобрый

Язык кода:javascript
копировать
@Configuration
@MapperScan("com.li.mptest.mapper") //Здесь можно переместить аннотацию в основной класс
public class MybatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new
                PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2. Тест

Язык кода:javascript
копировать
public void testPage(){
//Установим параметры пагинации
        Page<User> page = new Page<>(1, 5);
        userMapper.selectPage(page, null);
//Получаем данные пагинации
        List<User> list = page.getRecords();
        list.forEach(System.out::println);
        System.out.println("Текущая страница:"+page.getCurrent());
        System.out.println("Количество элементов, отображаемых на каждой странице:"+page.getSize());
        System.out.println("Общее количество записей:"+page.getTotal());
        System.out.println("Общее количество страниц:"+page.getPages());
        System.out.println("Есть ли предыдущая страница:"+page.hasPrevious());
        System.out.println("Есть ли следующая страница:"+page.hasNext());
        }

6. Генератор кода

1. Введение зависимостей

Язык кода:javascript
копировать
<dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

2. Быстрое поколение

Язык кода:javascript
копировать
public class FastAutoGeneratorTest {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://127.0.0.1:3306/lbb?characterEncoding=utf-8&userSSL=false","root", "021806")
                        .globalConfig(builder -> {
                            builder.author("lbb") // Установить автора
//.enableSwagger() // включать swagger модель
                                    .fileOverride() // Перезаписать сгенерированные файлы
                                    .outputDir("D://mybatis_plus"); // Укажите выходной каталог
                        })
                        .packageConfig(builder -> {
                            builder.parent("com.li") // Установить имя родительского пакета
                                    .moduleName("mybatisplus") // Установите имя модуля родительского пакета
                                    .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://mybatis_plus"));
// Установить путь создания MapperXml
                        })
                        .strategyConfig(builder -> {
                            builder.addInclude("t_user") // Задайте имя таблицы, которая будет сгенерирована
                                    .addTablePrefix("t_", "c_"); // Установить префикс таблицы фильтров
                        })
                        .templateEngine(new FreemarkerTemplateEngine()) // Используйте шаблон движка Freemarker, по умолчанию используется шаблон движка Velocity.
                        .execute();
    }
}
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose