предисловие
Представлено в предыдущем блоге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>
Приведенная выше конфигурация является наиболее часто используемой конфигурацией.Обратите внимание, что некоторые конфигурации, такие как имя пакета и подключение к базе данных, необходимо переписать в соответствии с их реальной ситуацией при использовании., обычно используйте это достаточно, если у вас есть другие особые потребности, вы можете обратиться к этому блогу, в котором объясняется значение всех тегов и атрибутов файла конфигурации, объяснение очень понятное, друзья, которые хотят узнать больше, пожалуйста перейти к [портал】
Запустите плагин
- существует
eclipse
в, щелкните элемент правой кнопкой мыши -->Run As
-->Maven build...
--> вGoals
заполните командуmybatis-generator:generate
, нажмитеRun
Вот и все. - Для запуска в командной строке нужно переключиться на проект
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>
Если проблема не решена, обратитесь сюда【портал】
-
При выполнении плагина происходит сбой со следующей ошибкой:
Этот тип ошибки встречается чаще всего, и решение не единственное.Я даю два общих направления, основанных на моем собственном наступлении на яму и информации в Интернете.
Решение:
- Проблема с версией плагина, вы можете поискать в Интернете и попробовать другую версию.
-
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
Содержание здесь, увидимся в следующем блоге. пока~