Недавно я обновил столбец «План развития Java», который в основном представляет собой запись всего процесса изучения Java. Он был обновлен до части параллельной многопоточности Java и будет продолжать обновляться в будущем; сегодня планирую открыть новую рубрику «Эффективная ферма».
EfficientFarm: эффективная ферма,Ожидается, что работы по разработке ПО можно будет механизировать, как и во многих зарубежных эффективных фермах.,автоматизация。Готовность к использованию и повышение эффективности работы – цель этой колонки!
Когда мы разрабатываем традиционные проекты Maven или проекты SpringBoot, в конечном итоге мы имеем дело с чтением и хранением данных. На этом этапе неизбежно приходится писать код сопоставления объектных отношений, класс сущностей, картограф, Mapper.xml и другие коды. имеется большое количество дополнений. Если мы удалим, изменим и проверим функцию, мы продолжим повторять одни и те же операции во время разработки, что сильно снижает эффективность работы.
По этой причине это сделаноMybatis «Реверс-инжиниринг»
Так называемый обратный инжиниринг заключается в том, чтобы начать со структуры таблицы базы данных и обратно сгенерировать соответствующие объекты и коды сопоставления. Сегодня мы представляем его здесь. 2 планы реализовать.
1)springboot Проект (JDK1.8)
2)apache-maven-3.6.1
3)MySQL 8.0.30
Первый шаг в реверс-инжиниринге требует структуры таблицы базы данных! Сначала мы создадим здесь таблицу, чтобы использовать ее в качестве примера. Сценарий sql выглядит следующим образом:
--Если существование уже сохранено, сначала удалите его
drop table user
-- Создать таблицу пользователей базы данных
create table user (
id int NOT NULL AUTO_INCREMENT COMMENT «Первичный ключ»,
name varchar(100) DEFAULT NULL COMMENT «Имя сотрудника»,
phone_num varchar(20) DEFAULT NULL COMMENT «Контактные данные»,
address varchar(200) DEFAULT NULL COMMENT 'адрес',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
Чтобы реализовать реверс-инжиниринг, вам необходимо сначала ввести зависимости, связанные с mybatis. Если он был введен в проект, этот шаг можно автоматически проигнорировать.
<dependencies>
<!-- mybatis-generator -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.7</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
После того, как зависимости и таблицы базы данных созданы, мы официально входим в проект Springboot для обратного проектирования. Сначала создайте файл конфигурации подключения к базе данных в каталоге ресурсов:generator.properties.
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.userId=root
jdbc.password=123456
После завершения настройки базы данных мы настраиваем правило генерации, включая кодировку, путь к сгенерированному файлу, необходимость установки пользовательских комментариев и т. д. Эту конфигурацию можно найти в Интернете, и существует множество конфигурацийgeneratorConfiguration.
<?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="generator.properties"/>
<context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat">
<!--ведущий сепаратор-->
<property name="beginningDelimiter" value="`"/>
<!--конечный разделитель-->
<property name="endingDelimiter" value="`"/>
<!--Установить кодировку-->
<property name="javaFileEncoding" value="UTF-8"/>
<!-- Создание методов сериализации для моделей-->
<plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
<!-- Создайте метод toString для генерации моделей Java. -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!--генерироватьmapper.xmlперезаписать исходный файл-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<!--可以自定义генерироватьmodelиз Комментарии к коду-->
<commentGenerator type="org.javaboy.vhr.utils.CommentGenerator">
<!-- Удалять ли автоматически созданные комментарии правда: да : ложь: Нет -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!--Конфигурация Подключение к базе данных-->
<jdbcConnection driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.userId}"
password="${jdbc.password}">
<!--решатьmysqlДрайвер обновлен до8.0后不генерировать指定数据库代码извопрос-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!--指定генерироватьmodelизпуть-->
<javaModelGenerator targetPackage="org.javaboy.vhr.pojo" targetProject="vhr-web\src\main\java"/>
<!--指定генерироватьmapper.xmlизпуть-->
<sqlMapGenerator targetPackage="mybatis.mapper" targetProject="vhr-web\src\main\resources"/>
<!--指定генерироватьmapperинтерфейсизизпуть-->
<javaClientGenerator type="XMLMAPPER" targetPackage="org.javaboy.vhr.mapper"
targetProject="vhr-web\src\main\java"/>
<!--单独генерировать某个表,Напишите конкретное имя таблицы,否则генерировать全部表tableNameустановлен на%-->
<table tableName="user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
enableSelectByExample="false" selectByExampleQueryId="false">
<property name="useActualColumnNames" value="false"/>
<property name="constructorBased" value="false"/>
<generatedKey column="id" sqlStatement="JDBC" identity="true"/>
</table>
</context>
</generatorConfiguration>
Поскольку на предыдущем шаге мы настроили генератор аннотаций, нам необходимо создать класс по соответствующему пути для настройки правил создания аннотаций. Путь: org.javaboy.vhr.utils.CommentGenerator
<commentGenerator type="org.javaboy.vhr.utils.CommentGenerator">
<!-- Удалять ли автоматически созданные комментарии правда: да : ложь: Нет -->
<property name="suppressAllComments" value="true"/>
<property name="suppressDate" value="true"/>
<property name="addRemarkComments" value="true"/>
</commentGenerator>
Код генератора комментариев
**
* @author 86138
* @date 2024-05-01 13:27:15
* @description Добавить пользовательскую аннотацию
*/
public class CommentGenerator extends DefaultCommentGenerator {
private boolean addRemarkComments = false;
/**
* Установить параметры конфигурации пользователя
*/
@Override
public void addConfigurationProperties(Properties properties) {
super.addConfigurationProperties(properties);
this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments"));
}
/**
* Добавляйте комментарии к полям
*/
@Override
public void addFieldComment(Field field, IntrospectedTable introspectedTable,
IntrospectedColumn introspectedColumn) {
String remarks = introspectedColumn.getRemarks();
//Определяем, добавлять ли информацию о примечаниях на основе параметров и информации о примечаниях
if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
addFieldJavaDoc(field, remarks);
}
}
/**
* Добавьте комментарий в поле моделииз
*/
private void addFieldJavaDoc(Field field, String remarks) {
//Начало комментариев к документации
field.addJavaDocLine("/**");
//Получить поле базы данных из информации о примечаниях
String[] remarkLines = remarks.split(System.getProperty("line.separator"));
for (String remarkLine : remarkLines) {
field.addJavaDocLine(" * " + remarkLine);
}
addJavadocTag(field, false);
field.addJavaDocLine(" */");
}
}
После выполнения вышеуказанных шагов мы напишем наш генератор реверс-инжиниринга и вызовем генератор MyBatisGenerator в org.mybatis.generator.api для его реализации. Примечание. Если сгенерированный код дублируется, перезапишите исходный код!
Код генератора
/**
* @author 86138
* @date 2024-05-01 13:35:22
* @description обратный инжиниринггенератор
*/
public class Generator {
public static void main(String[] args) throws Exception {
//MBG Процесс выполнения в предупреждающем сообщении
List<String> warnings = new ArrayList<String>();
//Когда сгенерированный код повторяется, перезаписываем исходный код
boolean overwrite = true;
//Читайте нас из MBG Конфигурация文件 InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
//создавать MBG
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
//Выполняем сгенерированный код
myBatisGenerator.generate(null);
//Вывод предупреждающей информации
for (String warning : warnings) {
System.out.println(warning);
}
}
}
Непосредственное выполнение основного метода вышеуказанного класса Generator автоматически прочитает таблицы в базе данных и сгенерирует соответствующие классы сущностей и сопоставления, а также простое добавление, удаление, изменение и коды функций запроса.
09:07:48.051 [main] DEBUG org.mybatis.generator.logging.LogFactory - Logging initialized using 'org.mybatis.generator.logging.slf4j.Slf4jLoggingLogFactory@1dde4cb2' adapter.
09:07:48.054 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Retrieving column information for table "user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "id", data type 4, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "name", data type 12, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "phone_num", data type 12, in table "vhr..user"
09:07:48.086 [main] DEBUG org.mybatis.generator.internal.db.DatabaseIntrospector - Found column "address", data type 12, in table "vhr..user"
【Создать файл】
Основываясь на первом решении, мы можем быстро выполнить реверс-инжиниринг на основе таблиц в базе данных, что значительно сокращает нашу повторяющуюся работу, но! Его реализация по-прежнему относительно сложна. Содержимое конфигурацииgeneratorConfiguration богато и сложно, его трудно запомнить, и для его реализации необходимо написать определенный объем кода в исходном коде.
Второе решение, о котором мы поговорим дальше, практически не требует написания кода, и вы можете выполнить реверс-инжиниринг всего за несколько кликов. Это решение особенно удобно, если вы используете idea.
Загрузите плагин MybatisX в разделе управления плагинами.
Настройте источник данных в базе данных Idea. Здесь в качестве примера используется MySQL. Вам необходимо обратить внимание на настройку часового пояса.
Нажмите «Проверить соединение». Успешный тест означает, что настройка завершена.
<!--lombokполагаться-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--MyBatis Plusполагаться-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
1) Откройте только что настроенную локальную базу данных, выберите таблицу данных, которую хотите построить, и щелкните правой кнопкой мыши. -> MybatisX-Generator。
2) Выберите путь к пакету проекта.、Имя пакета сущности、имя таблицы;
Вставьте сюда описание изображения
3) После этого продолжайте генерировать пути для Configurationmapper, xml, serviceiz и требовать из функций аннотаций, hashCode/equals, аннотаций Lombk и т. д.
Вставьте сюда описание изображения
После завершения окончательной настройки предыдущего шага нажмите кнопку «Готово», чтобы просмотреть результаты. Нужные нам файлы успешно сгенерированы по соответствующему пути.
Оба варианта имеют свои плюсы и минусы: