Обучение Spring Boot (5) Spring boot интегрирует Mybatis Generator и PageHelper

Spring Boot

предисловие

Представлено в предыдущем блогеSpring bootИнтегрироватьMybatisа такжеDruid, этот блог в основном знакомит с тем, как интегрировать обратный инжиниринг Mybatis в Spring boot.Mybatis Generatorименуемый в дальнейшемMBG, и очень удобный и простой плагин физического пейджинга в реальных проектахPageHelper, Использование этих плагинов может значительно сократить простые и повторяющиеся процессы нашего процесса разработки.Этот блог был интегрирован в проект.Mybatisна основе отсутствия интеграцииMybatisдрузья могут обратиться кSpring boot интегрирует Mybatis.

Статья впервые опубликована в личном блоге: [www.xiongfrblog.cn

Интегрировать МБГ

Зачем использовать МБГ

использовалMybatisМои друзья должны знать, что перед использованием нам нужно создать соответствующий класс сущности в проекте в соответствии с ситуацией в таблице базы данных,sqlСлой интерфейса оператора,XMLФайлы и т. д. Этот ряд операций очень прост, но он необходим, длителен и трудоемок, и не питательен.Если таблиц в базе данных достаточно, необходимо вручную создать это содержимое, что это для программистов, это просто пытка, поэтому при реальной разработкеMBGЭто очень необходимо, и мы подробно расскажем, какSpring bootконфигурация в проектеMBG.

Добавить плагин MBG в pom.xml

существует<plugins></plugins>Добавьте к этикетке следующее:

<!-- Mybatis Generator插件 -->
<plugin>
	<groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
    	<!-- 配置文件的位置 -->
    	<configurationFile>src/main/resources/generator/generatorConfig.xml</configurationFile>
    	<!-- 允许移动生成的文件 -->
    	<verbose>true</verbose>
        <!-- 是否覆盖,true表示会替换生成的Java文件,false则不覆盖 -->
        <overwrite>true</overwrite>
    </configuration>
    <executions>
       <execution>
           <id>Generate MyBatis Artifacts</id>
           <goals>
               <goal>generate</goal>
           </goals>
       </execution>
   </executions>
   <dependencies>
       <dependency>
	      <groupId>org.mybatis.generator</groupId>
	      <artifactId>mybatis-generator-core</artifactId>
	      <version>1.3.2</version>
	    </dependency>
	    <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.0</version>
        </dependency>
   </dependencies>
</plugin>

вconfigurationFile:MBGРасположение файла конфигурации можно переписать в соответствии с вашей реальной ситуацией.

Уведомление: Как показано выше, мы также добавили в плагинmysql,mybatisМы уже добавили эти две зависимости в зависимости проекта, но нам нужно добавить их снова здесь.Когда я настрою здесь, если я не добавлю сюда плагин выполнения, я сообщу об ошибке.

Добавьте файл конфигурации generateConfig.xml

Этот шаг является для нас ключевым для создания классов сущностей и т. д. Все правила настраиваются в этом файле конфигурации. первый вsrc/main/resourcesСоздано в каталогеgeneratorкаталог, в котором создатьgeneratorConfig.xmlКонфигурационный файл, содержание следующее:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

	<!-- 导入配置文件 -->
    <properties resource="application.properties"/>
	
	<!-- defaultModelType="flat" s设置复合主键时不单独为主键创建实体 -->
    <context id="MySql" defaultModelType="flat" targetRuntime="MyBatis3Simple">
    
    	<property name="javaFileEncoding" value="UTF-8"/>
		<!-- 当表名或者字段名为SQL关键字的时候,可以设置该属性为true,MBG会自动给表名或字段名添加分隔符(反单引号) -->
		<property name="autoDelimitKeywords" value="true"/>
		
		<!-- 由于beginningDelimiter和endingDelimiter的默认值为双引号("),在Mysql中不能这么写,所以还要将这两个默认值改为反单引号(`), -->
		<property name="beginningDelimiter" value="`"/>
		<property name="endingDelimiter" value="`"/> 
		
        <!-- 生成的POJO实现java.io.Serializable接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <!--注释-->
        <commentGenerator>
            <!-- 阻止生成注释 -->
            <property name="suppressAllComments" value="true"/>
            <!-- 注释里不添加日期 -->
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <!-- 数据库连接,直接通过${}读取application.properties里的配置 -->
        <jdbcConnection
                driverClass="${spring.datasource.driverClassName}"
                connectionURL="${spring.datasource.url}"
                userId="${spring.datasource.username}"
                password="${spring.datasource.password}"/>

        <!-- 生成POJO对象,并将类放到com.web.springbootmybatis.entity包下 -->
        <javaModelGenerator targetPackage="com.web.springboot.entity" targetProject="src/main/java"></javaModelGenerator>
        <!-- 生成mapper xml文件,并放到resources下的mapper文件夹下 -->
        <sqlMapGenerator targetPackage="mapper"  targetProject="src/main/resources"></sqlMapGenerator>

        <!-- 生成mapper xml对应dao接口,放到com.web.springbootmybatis.dao包下-->
        <javaClientGenerator targetPackage="com.web.springboot.dao" targetProject="src/main/java" type="XMLMAPPER"></javaClientGenerator>

        <!-- table标签可以有多个,至少一个,tableName指定表名,可以使用_和%通配符,我这里的配置表明匹配所有的表 -->
        <table tableName="%">
            <!-- 是否只生成POJO对象 -->
            <property name="modelOnly" value="false"/>
            <!-- 插入一条数据时,将id映射到实体类中 -->
            <generatedKey column="id" sqlStatement="Mysql"/>
        </table>
    </context>
</generatorConfiguration>

Приведенная выше конфигурация является наиболее часто используемой конфигурацией.Обратите внимание, что некоторые конфигурации, такие как имя пакета и подключение к базе данных, необходимо переписать в соответствии с их реальной ситуацией при использовании., обычно используйте это достаточно, если у вас есть другие особые потребности, вы можете обратиться к этому блогу, в котором объясняется значение всех тегов и атрибутов файла конфигурации, объяснение очень понятное, друзья, которые хотят узнать больше, пожалуйста перейти к [портал

Запустите плагин

  1. существуетeclipseв, щелкните элемент правой кнопкой мыши -->Run As-->Maven build...--> вGoalsзаполните командуmybatis-generator:generate, нажмитеRunВот и все.
  2. Для запуска в командной строке нужно переключиться на проектpom.xmlКаталог, в котором находится файл, выполните командуmvn mybatis-generator:generateВот и все.

После выполнения вы обнаружите, что в проекте созданы соответствующие файлы классов и интерфейсов, а также схема структуры проекта:

在这里插入图片描述

Демонстрация класса сущности:

package com.web.springboot.entity;

import java.io.Serializable;

public class SysUser implements Serializable {
    private Integer id;

    private String usercode;

    private String username;

    private String password;

    private String salt;

    private String locked;

    private static final long serialVersionUID = 1L;

    //省略getter.setter方法
}

sqlДемонстрация интерфейса:

package com.web.springboot.dao;

import com.web.springboot.entity.SysUser;
import java.util.List;

public interface SysUserMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(SysUser record);

    SysUser selectByPrimaryKey(Integer id);

    List<SysUser> selectAll();

    int updateByPrimaryKey(SysUser record);
}

xmlдемонстрация файла:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.web.springboot.dao.SysUserMapper" >
  <resultMap id="BaseResultMap" type="com.web.springboot.entity.SysUser" >
    <id column="id" property="id" jdbcType="INTEGER" />
    <result column="usercode" property="usercode" jdbcType="VARCHAR" />
    <result column="username" property="username" jdbcType="VARCHAR" />
    <result column="password" property="password" jdbcType="VARCHAR" />
    <result column="salt" property="salt" jdbcType="VARCHAR" />
    <result column="locked" property="locked" jdbcType="CHAR" />
  </resultMap>
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from sys_user
    where id = #{id,jdbcType=INTEGER}
  </delete>
  <insert id="insert" parameterType="com.web.springboot.entity.SysUser" >
    <selectKey resultType="java.lang.Integer" keyProperty="id" order="BEFORE" >
      SELECT 1418666
    </selectKey>
    insert into sys_user (id, usercode, username, 
      `password`, salt, locked
      )
    values (#{id,jdbcType=INTEGER}, #{usercode,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, 
      #{password,jdbcType=VARCHAR}, #{salt,jdbcType=VARCHAR}, #{locked,jdbcType=CHAR}
      )
  </insert>
  <update id="updateByPrimaryKey" parameterType="com.web.springboot.entity.SysUser" >
    update sys_user
    set usercode = #{usercode,jdbcType=VARCHAR},
      username = #{username,jdbcType=VARCHAR},
      `password` = #{password,jdbcType=VARCHAR},
      salt = #{salt,jdbcType=VARCHAR},
      locked = #{locked,jdbcType=CHAR}
    where id = #{id,jdbcType=INTEGER}
  </update>
  <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
    select id, usercode, username, `password`, salt, locked
    from sys_user
    where id = #{id,jdbcType=INTEGER}
  </select>
  <select id="selectAll" resultMap="BaseResultMap" >
    select id, usercode, username, `password`, salt, locked
    from sys_user
  </select>
</mapper>

Это два, которые я использовал.Можно проверить лично, но есть и другие способы.Подробности см. в официальной документации [портал

Некоторые распространенные ошибки и решения в конфигурации

  • pom.xmlПосле добавления плагина в файл ошибка сообщается следующим образом:

    Plugin execution not covered by lifecycle configuration:
    org.mybatis.generator:mybatis-generator-maven-plugin:1.3.2:generate
    (execution: Generate MyBatis Artifacts, phase: generate-sources)
    

    Решение: в<plugins>Поместите еще один поверх этикетки<pluginManagement>теги следующим образом:

    <build>
        <pluginManagement>
            <plugins>
                <plugin> ... </plugin>
                <plugin> ... </plugin>
                ....
            </plugins>
        </pluginManagement>
    </build>
    

    Если проблема не решена, обратитесь сюда【портал

  • При выполнении плагина происходит сбой со следующей ошибкой:

    在这里插入图片描述

    Этот тип ошибки встречается чаще всего, и решение не единственное.Я даю два общих направления, основанных на моем собственном наступлении на яму и информации в Интернете.

    Решение:

    1. Проблема с версией плагина, вы можете поискать в Интернете и попробовать другую версию.
    2. generatorConfig.xmlВ нем есть ошибки, такие как неправильные имена переменных, неправильные имена пакетов, и часто бывают сюрпризы, если внимательно проверить.

Интеграция PageHelper

PageHelperЭто очень простой плагин подкачки, для которого требуется всего две строки кода, и нам не нужно писать его самостоятельно.sqlЗаявление, автоматически помогает нам достичь, очень прост в использовании, давайте начнем знакомитьSpring bootИнтегрироватьPageHelper.

добавить зависимости

первый вpom.xmlДобавьте зависимости в файл следующим образом:

<!-- springboot分页插件 -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <!-- 特别注意版本问题 -->
    <version>1.2.3</version>
</dependency>

После добавления этой зависимости нам на самом деле не нужно ее добавлятьmybatis-spring-boot-starterзависимый, потому чтоpagehelper-spring-boot-starterОн уже включен в него.

Добавить конфигурацию в файл конфигурации

существуетaiilication.propertiesДобавьте в файл следующее:

#pageHelper配置
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.params=count=countSql
pagehelper.supportMethodsArguments=true

Здесь краткое введение нескольких параметров означает, что онлайн-учебники обычно не пишут, здесь было представлено:

  • helperDialect: Какой язык базы данных настроен, какой не настроен PageHelper автоматически определяет, я использую его здесь.mysql.
  • reasonable: Настройте функцию рационализации параметров пейджинга, по умолчанию — false. Когда рационализация включена, первая страница будет запрашиваться, если pageNum общее количество страниц; когда рационализация отключена, будут возвращены пустые данные, если pageNum общее количество страниц.
  • params: поддерживатьstartPage(Object params)метод, этот параметр добавляется для настройки сопоставления параметров, которое используется для получения значения от объекта в соответствии с именем свойства, которое можно настроитьpageNum,pageSize,count,pageSizeZero,reasonable, значение по умолчанию используется, если сопоставление не настроено, значение по умолчанию равноpageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero.
  • supportMethodsArguments: поддержка черезMapperПараметр интерфейса для передачи параметров разбиения на страницы, значение по умолчаниюfalse, плагин подкачки будет автоматически основан на указанных выше значениях параметров из метода запроса.paramsЗначение в настроенном поле будет автоматически разбито на страницы, когда будет найдено подходящее значение.

Дополнительные сведения о параметрах см. в разделе【портал

используется в коде

Используя приведенное выше введениеMBGКласс сущности был создан для нас,sqlинтерфейс иxmlфайл, теперь нам нужно создатьserviceСлой, здесь мы используем общие знания для созданияserviceИнтерфейс базового класса для слоевIBaseService.java, после всегоserviceВсе интерфейсы наследуют этот интерфейс базового класса, который необходим в реальных проектах для уменьшения ненужного дублирования операций.Код выглядит следующим образом:

package com.web.springboot.service;

import java.util.List;

/**
* @author Promise
* @createTime 2019年1月20日 下午8:24:40
* @description service接口层基类,包含基本的	CRUD操作。
*/
public interface IBaseService<T> {
	
	/**
	 * 根据主键删除
	 * @param id
	 * @return
	 */
	int deleteByPrimaryKey(Object id);

	/**
	 * 新增一条记录
	 * @param entity
	 * @return
	 */
    int insert(T entity);

    /**
     * 根据主键查询
     * @param id
     * @return
     */
    T selectByPrimaryKey(Object id);

    /**
     * 查询全部记录
     * @return
     */
    List<T> selectAll();

    /**
     * 根据主键修改数据
     * @param entity
     * @return
     */
    int updateByPrimaryKey(T entity);
}

Интерфейс базового класса определяет основныеCRUDОперация, о которой я здесь написал, относительно проста, на практике ее можно усовершенствовать в соответствии с вашими потребностями.

затем создайтеISysUserService.javaинтерфейс, наследуем интерфейс базового класса и определяем два, которые мы проверяемpageHelperМетоды:

package com.web.springboot.service;

import java.util.List;

import com.github.pagehelper.PageInfo;
import com.web.springboot.entity.SysUser;

/**
* @author Promise
* @createTime 2019年1月20日 下午8:31:09
* @description 
*/
public interface ISysUserService extends IBaseService<SysUser>{

	List<SysUser> findAllByPage(int pageNum, int pageSize);
	
	PageInfo<SysUser> findAllByPage2(int pageNum, int pageSize);
}

  • findAllByPage: Реализовать простое разбиение на страницы, возвращая нужный объектlistколлекция, где параметрpageNumпредставляет текущую страницу,pageSizeПредставляет, сколько фрагментов данных на странице.
  • findAllByPage2: Реализовать простую подкачку, возвратPageInfo<T>объекты, в том числеlistВ коллекцию также входит общее количество записей в базе данных, общее количество страниц, текущая страница, следующая страница и многие другие сведения, среди которых параметрыpageNumпредставляет текущую страницу,pageSizeПредставляет, сколько фрагментов данных на странице.

Вы можете выбрать, какой метод использовать в соответствии с фактическими потребностями проекта.

класс реализации интерфейсаSysUserServiceImpl.java, код показан ниже:

package com.web.springboot.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.web.springboot.dao.SysUserMapper;
import com.web.springboot.entity.SysUser;
import com.web.springboot.service.ISysUserService;

/**
* @author Promise
* @createTime 2019年1月20日 下午8:31:50
* @description 
*/
@Service("sysUserService")
public class SysUserServiceImpl implements ISysUserService{
	
	@Autowired
	private SysUserMapper sysUserMapper;

	@Override
	public int deleteByPrimaryKey(Object id) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public int insert(SysUser entity) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public SysUser selectByPrimaryKey(Object id) {
		// TODO Auto-generated method stub
		return sysUserMapper.selectByPrimaryKey((Integer)id);
	}

	@Override
	public List<SysUser> selectAll() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int updateByPrimaryKey(SysUser entity) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public List<SysUser> findAllByPage(int pageNum, int pageSize) {
		// TODO Auto-generated method stub
		PageHelper.startPage(pageNum, pageSize);
		List<SysUser> lists = sysUserMapper.selectAll();
		return lists;
	}

	@Override
	public PageInfo<SysUser> findAllByPage2(int pageNum, int pageSize) {
		// TODO Auto-generated method stub
		PageHelper.startPage(pageNum, pageSize);
		List<SysUser> lists = sysUserMapper.selectAll();
		PageInfo<SysUser> pageInfo = new PageInfo<SysUser>(lists);
		return pageInfo;
	}
}

Вы можете видеть, что этот класс реализует интерфейс нашего базового класса.IBaseService.javaа такжеISysUSerService.javaВсе методы, определенные в нем, здесь мы сосредоточимся наfindAllByPage(int pageNum, int pageSize)в методе

PageHelper.startPage(pageNum, pageSize);
List<SysUser> lists = sysUserMapper.selectAll();

Этот код, первое предложение использует наш плагин подкачки, только это предложение, следует отметить, что оператор запроса должен бытьвнимательно следитьэто предложение, иможно использовать только один раз, что означает, что если есть запрос на подкачку, который необходимо определить сноваPageHelper.startPage(pageNum, pageSize).

Давайте поговоримfindAllByPage2(int pageNum, int pageSize)метод, только на одно предложение больше, чем метод, описанный выше, и возвращаемый результат отличается

PageInfo<SysUser> pageInfo = new PageInfo<SysUser>(lists);

Конечно,PageHelperЕсть много других способов использования, вышеуказанный метод должен быть правильным, чтобы обеспечить правильность.Код запроса следует сразу за кодом страницы.Только это должен контролировать программист, что увеличивает вероятность ошибок, так что вот более безопасный способ--ISelectРежим интерфейса:

findAllByPage(int pageNum, int pageSize)Пересмотрено:

@Override
public List<SysUser> findAllByPage(int pageNum, int pageSize) {
	//这种写法需要jdk8 lambda用法
	Page<SysUser> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(()-> sysUserMapper.selectAll());
	//如果是低版本的jdk,则使用如下写法(两种写法根据自己jdk版本二选一)
	Page<SysUser> page = PageHelper.startPage(pageNum, pageSize).doSelectPage(new ISelect() {
		@Override
		public void doSelect() {
			sysUserMapper.selectAll();
		}
	});
	return page;
}

Некоторые друзья, увидевшие здесь, могут обнаружить, что мы возвращаемPage<SysUser>объект, а метод определяетList<SysUser>Объект, тут я его прямо выкладываюPageHelperИсходный код, определенный в этом методе, понятен каждому с первого взгляда:

public class Page<E> extends ArrayList<E> implements Closeable {
    //为了不占过多的篇幅,这里只贴出方法定义的源码,想要了解具体内容请自行查看源码。
    //可以看到该方法继承了ArrayList<T>这也是我们可以直接返回Page<SysUser>的原因。
}

findAllByPage2(int pageNum, int pageSize)Пересмотрено:

@Override
public PageInfo<SysUser> findAllByPage2(int pageNum, int pageSize) {
    //这种写法需要jdk8 lambda用法
	PageInfo<SysUser> pageInfo = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(()-> sysUserMapper.selectAll());
	//如果是低版本的jdk,则使用如下写法(两种写法根据自己jdk版本二选一)
	PageInfo<SysUser> pageInfo = PageHelper.startPage(pageNum, pageSize).doSelectPageInfo(new ISelect() {
		@Override
		public void doSelect() {
			sysUserMapper.selectAll();
		}
	});
	return pageInfo;
}

Вот два использованияPageHelperметод, если вы хотите узнать больше, перейдите на【портал

Затем создайте тестовый контроллерTestController.java,следующее:

package com.web.springboot.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.github.pagehelper.PageInfo;
import com.web.springboot.entity.SysUser;
import com.web.springboot.service.ISysUserService;

/**
* @author Promise
* @createTime 2019年1月20日 下午8:21:02
* @description 
*/
@RestController
public class TestController {
	
	@Autowired
	private ISysUserService sysUserService;

	@RequestMapping("/users/{pageNum}/{pageSize}")
	public Object getAllUser(@PathVariable int pageNum, @PathVariable int pageSize) {
		List<SysUser> lists=sysUserService.findAllByPage(pageNum, pageSize);
		return lists;
	}
	
	@RequestMapping("/users2/{pageNum}/{pageSize}")
	public Object getAllUser2(@PathVariable int pageNum, @PathVariable int pageSize) {
		PageInfo<SysUser> pageInfo=sysUserService.findAllByPage2(pageNum, pageSize);
		return pageInfo;
	}
}

Что ж, код написан!

Проверить нумерацию страниц

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

在这里插入图片描述

Запустить проект, доступ через браузерlocalhost:8080/users/1/2, указывающий на доступ к первой странице, две части данных на страницу, результаты следующие:

在这里插入图片描述

Сравните базу данных, данные возвращаются правильно, затем посетитеlocalhost:8080/user2/1/2, результат следующий:

在这里插入图片描述

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

{
	"pageNum": 1,
	"pageSize": 2,
	"size": 2,
	"startRow": 1,
	"endRow": 2,
	"total": 6,
	"pages": 3,
	"list": [{
		"id": 1,
		"usercode": "Promise",
		"username": "eran",
		"password": "123456",
		"salt": null,
		"locked": "0"
	}, {
		"id": 2,
		"usercode": "Promise2",
		"username": "eran",
		"password": "123456",
		"salt": null,
		"locked": "0"
	}],
	"prePage": 0,
	"nextPage": 2,
	"isFirstPage": true,
	"isLastPage": false,
	"hasPreviousPage": false,
	"hasNextPage": true,
	"navigatePages": 8,
	"navigatepageNums": [1, 2, 3],
	"navigateFirstPage": 1,
	"navigateLastPage": 3,
	"lastPage": 3,
	"firstPage": 1
}

Можно обнаружить, что возвращается много полезного контента, и я не буду вводить их здесь по одному. Поля просты для понимания. В реальной разработке мы можем выбрать, какой метод использовать в соответствии с нашими потребностями.

Эпилог

оSpring bootИнтегрироватьMBGа такжеpageHelperСодержание здесь, увидимся в следующем блоге. пока~