Эта статья является подразделом фреймворка персональной разработки SpringBoot 2.1, сначала прочтите ее.Springboot2.1 версия фреймворка для персонального развитияПрочтите эту статью еще раз
Адрес бэкенд-проекта:Версия SpringBoot 2.1 среды разработки персональных приложений
Адрес фронтенд проекта:ywh-vue-admin
Создайте структуру проекта для основного подмодуля
Сначала мы планируем основной модуль. Основной модуль в основном используется для написания бизнес-кода. Лучше всего поместить некоторые общие методы или классы в общий модуль. После изменения вышеуказанных файлов мы создаем и пишем код в основном модуле. И некоторые настроенные пакеты находятся в основном модуле com, ywh.core щелкните правой кнопкой мыши New->package, чтобы создать имя пакета, которое создается моими собственными привычками и может быть названо в соответствии с моими собственными привычками.
Основной модуль является ядром проекта, предварительная структура планирования выглядит следующим образом:
- config - поместите некоторые файлы конфигурации
- контроллер - контроллер уровня контроллера находится под этим пакетом
- dao - поместите здесь несколько операционных интерфейсов в базу данных
- entity - класс сущности бизнес-объекта
- service — интерфейс и класс реализации сервисного уровня, класс реализации сервиса помещается в Impl
- система - система может поместить несколько основных классов, используемых в одиночку
- MyBatis-Mappers - поставьте XML-файл myBatis, этот файл создан под ресурсом
Знакомство с Друидом
Создание подключения к базе данных — это трудоемкая операция, которая может легко создать угрозу безопасности базы данных. Управление подключениями к базе данных может существенно повлиять на масштабируемость и надежность всего приложения, а также повлиять на показатели производительности программы.
Druid — это прежде всего пул соединений с базой данных, но это не просто пул соединений с базой данных, он также включает в себя ProxyDriver, ряд встроенных библиотек компонентов JDBC и SQLParser. Druid поддерживает все JDBC-совместимые базы данных, включая Oracle, MySql, Derby, Postgresql, SQLServer, H2 и другие. Druid был специально оптимизирован для Oracle и MySql, например, для оптимизации использования памяти Oracle PSCache и оптимизации обнаружения пинга MySql. Druid имеет явные преимущества в мониторинге, масштабируемости, стабильности и производительности. Druid предоставляет расширенный API для режима Filter-Chain.Вы можете написать свой собственный фильтр для перехвата любого метода в JDBC, и вы можете делать с ним все, что угодно, например, мониторинг производительности, аудит SQL, шифрование имени пользователя и пароля, ведение журнала и многое другое. .
Ссылаться на:
Конфигурация проекта друид
Я решил использовать базу данных MySQL MySQL для представления первой зависимости и зависящей от конфигурации Druid Druid раньше, зависит от введения файла Pump.xml, а затем настроитьcoreВнизapplication-dev.ymlфайл, большая часть файла yml является конфигурацией по умолчанию, и я написал комментарий, чтобы понять его хорошо, если вы хотите настроить конфигурацию, вы можете обратиться кОфициальная документация Druid на GitHub. Зависимость JDBC добавлена здесь, потому что для подключения к базе данных требуется драйвер для подключения, который можно удалить после добавления MyBatisPlus позже.
<!-- druid连接池的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!-- mysql驱动依赖 不加版本号会获取最新的 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.13</version>
</dependency>
<!-- jdbc驱动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
Содержимое файла Application-dev.yml, следующее содержимое опущено, можно просмотреть конкретное содержимоеapplication-dev.yml
#在这里我没有写driver-class-name: com.mysql.jdbc.Driver这个驱动被弃用了 使用新版com.mysql.cj.jdbc.Driver
#控制台提示说自动帮我们找相应的驱动,一般无需手动加载,所以我注释掉了
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
# 初始化Druid
druid:
# mysql数据库接地址
url: jdbc:mysql://127.0.0.1:3306/ywh_code?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
#driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
# 监控页面的用户名和密码 以及页面地址
stat-view-servlet:
login-username: admin
login-password: admin
enabled: true
url-pattern: /druid/*
После настройки Durid мы можем получить доступhttp://localhost:8082/core/druid/login.html. мой номер порта8082, потому что я вapplication.ymlнастроенcontext-path: /core, поэтому мой адрес доступа указан выше, если он не настроен, по умолчаниюhttp://localhost:8080/druid/login.html, логин и пароль оба admin, а интерфейс мониторинга выкладывать не буду.
Интеграция Mybatis-Plus
После настройки Друида можно подключиться к БД.Если использовать нативный jdbc для подключения к БД, то можно и к БД подключиться, но это слишком хлопотно, поэтому я использую расширенную версию Mybatis-Plus, Mybatis- Плюс только расширяет Mybatis и не делает этого Модифицированный, поэтому он прекрасно совместим с Mybatis, а также поддерживает автоматическую генерацию кода для вас, а также большое количество CRUD-интерфейсов для пользователей, и есть много отличных кейсов с использованием Mybaits- Плюс.
Настройка Mybatis-Plus в проекте
Во-первых, введите соответствующие зависимости Mybatis-Plus в родительский pom.xml, настройте файл application-dev.yml под ядром и добавьте @MapperScan(basePackages = "com.ywh.**. dao") для сканирования всех интерфейсы в вашем пакете dao и автоматически внедрять их в контейнер Spring IOC для использования; зависимости: mybatis-plus-boot-starter, freemarker, speed, а последние два используются при генерации кода. Это шаблон, которые будут использоваться позже Эти два можно найти в Интернете, чтобы просмотреть введение.
<!-- mybatisPlus的依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.6</version>
</dependency>
<!-- freemarke引擎依赖引入 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
<!-- velocity引擎依赖引入 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
application-dev.yml
mybatis-plus:
mapper-locations: classpath*:/mybatis-mappers/*
# MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名
type-aliases-package: com.ywh.core.entity
# 数据库表与实体类的驼峰命名自动转换
configuration:
map-underscore-to-camel-case: true
@SpringBootApplication(scanBasePackages = "com.ywh")
/**
* 全局配置,扫描指定包下的dao接口,不用每个dao接口上都写@Mapper注解了
*/
@MapperScan(basePackages = "com.ywh.**.dao")
public class CoreApplication {
public static void main(String[] args) {
SpringApplication.run(CoreApplication.class, args);
}
}
прецедент
После завершения настройки давайте проверим, можем ли мы работать с базой данных.Создайте пользовательскую таблицу в базе данных ywh_code и вставьте несколько фрагментов данных для запроса.
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL DEFAULT '' COMMENT '用户姓名',
`age` tinyint(3) unsigned NOT NULL COMMENT '用户年龄',
`gender` tinyint(3) unsigned NOT NULL COMMENT '用户性别',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
INSERT INTO `user` VALUES ('1', 'ywh', '22', '1');
INSERT INTO `user` VALUES ('2', 'lry', '22', '1');
INSERT INTO `user` VALUES ('3', 'whp', '26', '0');
в пакете Entity, который мы создали ранееExampleEntityНапишите атрибуты соответствующей базы данных в классе объекта, слой DAOExampleDaoНапишите метод запроса в классе интерфейса и проверьте, хорошо ли работает наша конфигурация в классе тестирования Sprilboot. Атрибуты в классе объекта должны иметь свои собственные методы Get и Set. Я использую метод аннотации Lombok, чтобы помочь нам автоматически производить получение, установить метод. Во-первых, введите пакет зависимостей Lombok в родительском POM.xml и установите плагин Lombok в идее. Если вы думаете, что этот метод слишком неприятно, вы можете напрямую генерировать методы Get и Set.
<!-- lombok的依赖 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
<scope>provided</scope>
</dependency>
В идее выберите Файл->Настройки->Плагины, чтобы найти плагин lombok Plugin и установить его.Если есть ошибка времени ожидания соединения и загрузка не может быть загружена, вы можете нажатьЗагрузите плагин ломбока в IDEAПосле перехода на локальный установите этот плагин локально.
класс сущности
import lombok.Data;
/**
* CreateTime: 2018-12-09 18:24
* ClassName: ExampleEntity
* Package: com.ywh.core.entity
* Describe:
* 测试实体类
*
* @author YWH
*/
@Data
public class ExampleEntity {
private Integer id;
private String name;
private String age;
private String gender;
}
дао интерфейс
import com.ywh.core.entity.ExampleEntity;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* CreateTime: 2018-12-09 18:25
* ClassName: ExampleDao
* Package: com.ywh.core.dao
* Describe:
* 测试例子的Dao层 持久层
*
* @author YWH
*/
public interface ExampleDao {
@Select("select * from user")
List<ExampleEntity> findAll();
}
Тестовый класс SpringBoot
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class CoreApplicationTests {
@Autowired
private ExampleDao exampleDao;
@Test
public void contextLoads() {
List<ExampleEntity> all = exampleDao.findAll();
System.out.println(all);
}
}
После запуска метода теста вывод:
[ExampleEntity(id=1, name=ywh, age=22, gender=1), ExampleEntity(id=2, name=lry, age=22, gender=1), ExampleEntity(id=3, name=whp, age=26, gender=0)]
Генератор кода MybatisPlus
Интеграция MybatisPlus, генератора кода, в основные функции MybatisPlus может помочь нам значительно повысить эффективность работы, не создавая много повторяющейся работы. AutoGenerator — это генератор кода MyBatis-Plus. С помощью AutoGenerator вы можете быстро генерировать Entity, Mapper, Mapper XML , Сервис, Контроллер и другие коды модулей значительно повышают эффективность разработки.Этот код является лишь общим методом, который мы определили заранее.Конкретный бизнес-код все еще должен быть написан нами, но в значительной степени нам очень помог .
Я поместил эту функцию под общий модуль, поэтому нам нужно разделить структуру общего подмодуля.
- база: поставить базовый контроллер, сервис и т.д.
- config: поместите некоторые классы конфигурации
- Сущность: поместите некоторую базовую сущность
- mapper: вы можете поместить базовый файл mapper.xml
- исключение: мы можем поместить наш пользовательский класс исключений
- utils: поместите некоторые общие служебные классы
- Создайте шаблоны в каталоге ресурсов и поместите файлы шаблонов, которые мы будем использовать позже.
После создания структуры каталогов мы создаем файл myBatisPlus.properties для хранения переменных, которые мы часто хотим изменить, чтобы нам не приходилось изменять их в коде, содержимое выглядит следующим образом:
#此处为本项目src所在路径(代码生成器输出路径)
outputDir=/ywh-starter-core/src/main/java
#父的包名
setParent=com.ywh.core
#是否覆盖文件 默认是false 如果生成的代码有改动的话 在没有确认之前不要改成true 否则会把文件覆盖 丢失代码
fileOverride=false
#数据库地址
url=jdbc:mysql://127.0.0.1:3306/ywh_code?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
#数据库驱动
driverClass=com.mysql.cj.jdbc.Driver
#数据库用户名
userName=root
#数据库密码
passWord=123456
# mapper.xml文件生成路径
mapperPath=/ywh-starter-core/src/main/resources/mybatis-mappers/
Настроить содержимое шаблона
Код, который мы генерируем, должен быть сгенерирован в соответствии с шаблоном.Официальный шаблон по умолчанию, используемый MybatisPlus, — это скорость, и он также предоставляет другой шаблон, freemarker.
- Скорость: скорость - это шаблон на основе Java. Это позволяет всем использовать простой, но мощный язык шаблона для ссылочных объектов, определенных в коде Java.
- freemarker: FreeMarker — это механизм шаблонов: общий инструмент для создания выходного текста на основе шаблонов и данных, которые необходимо изменить.
- Синтаксис freemarker может означать:Общие метки и синтаксис инструкций Freemaker FTL
существуетcom.baomidou.mybatis-plus-generatorВ папке templates под пакетом есть официальный файл шаблона.Мы используем шаблонный движок freemarker с суффиксом .ftl.Скопируем все файлы с .ftl в созданные нами шаблоны.Конечно если не хотите Если вы изменяете содержимое самостоятельно, вы можете использовать содержимое по умолчанию, не копируя его, просто пропустите этот шаг.
controller.java.ftl: из-за слишком большого количества кода здесь опубликован только один пример. Другие конкретные коды можно посмотреть в моем git.шаблон freemarker
package ${package.Controller};
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import ${package.Service}.${table.serviceName};
import ${package.Entity}.${table.entityName};
<#if restControllerStyle>
import org.springframework.web.bind.annotation.RestController;
<#else>
import org.springframework.stereotype.Controller;
</#if>
<#if superControllerClassPackage??>
import ${superControllerClassPackage};
</#if>
/**
* CreateTime: ${date}
* ClassName: ${table.controllerName}
* Package: ${package.Controller}
* Describe:
* ${table.comment!} 前端控制器
* @author YWH
*/
<#if restControllerStyle>
@RestController
<#else>
@Controller
</#if>
@RequestMapping("<#if controllerMappingHyphenStyle??>${table.controllerName}<#else>${controllerMappingHyphen}</#if>")
<#if superControllerClass??>
public class ${table.controllerName} extends ${superControllerClass}<${table.serviceName},${table.entityName}> {
<#else>
public class ${table.controllerName} {
</#if>
private static final Logger log = LoggerFactory.getLogger(${table.controllerName}.class);
@Autowired
private ${table.serviceName} service;
}
Написать автоматически сгенерированный код
Далее мы можем написать свой собственный класс инструментов для генерации кода по официально предоставленным примерам.Создаем класс CodeGenerator под utils.Я не буду вводить подробный код, вы можете прочитать его по официальной документации (есть Запости адрес) , хотя сгенерированный код пуст, но, поскольку он наследует классы, предоставляемые MybatisPlus, у нас уже есть большое количество интерфейсов CRUD для использования, конкретные интерфейсы CRUD могут ссылаться наОфициальный CRUD-интерфейс MybatisPlus
package com.ywh.common.utils;
/**
* CreateTime: 2018-12-16 13:52
* ClassName: CodeGenerator
* Package: com.ywh.common.utils
* Describe:
* MybatisPlus的代码生成器
*
* @author YWH
*/
public class CodeGenerator {
/**
* 获取控制台上的内容
* @param tip 控制台输入的内容
* @return
*/
public static String scanner(String tip){
Scanner scanner = new Scanner(System.in);
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("请输入" + tip + ":");
System.out.println(stringBuilder.toString());
if(scanner.hasNext()){
String ipt = scanner.next();
if(StringUtils.isNotEmpty(ipt)){
//输入的不是空就返回
return ipt;
}
}
throw new MybatisPlusException("请输入正确的" + tip +"! ");
}
public static void main(String[] args) {
ResourceBundle resource = ResourceBundle.getBundle("myBatisPlus");
String outPutDir = resource.getString("outputDir");
Boolean fileOverride = false;
if("true".equals(resource.getString("fileOverride"))){
fileOverride = true;
}
String url = resource.getString("url");
String driverClass = resource.getString("driverClass");
String userName = resource.getString("userName");
String passWord = resource.getString("passWord");
String setParent = resource.getString("setParent");
//代码生成器
。。。。。。。由于代码过长,具体代码请前往github查看
}
}
Эффект следующий: