Заметки об исследовании Spring Boot (3) Интеграция MyBatis + Druid

Spring Boot MyBatis

Заметки об исследовании Spring Boot (3) Интеграция MyBatis + Druid


0. Описание окружающей среды

  • MyBatis Generator 1.3.6
  • MySQL 5.7.17
  • Драйвер: mysql-connector-java-5.1.2.jar

1. MyBatis Generator

MyBatis GeneratorЭто инструмент, который автоматически генерирует модель, дао и картограф при использовании фреймворка mybatis, что значительно сокращает время ручного кодирования бизнес-разработчиков.

Мы будем использовать этот инструмент для автоматизации того, что необходимо для создания M-уровня в среде MVC.

2. Создайте локальную базу данных

Создайте таблицу в локальной базе данных

1# 创建数据库
2CREATE DATABASE LEARNING CHARACTER SET utf8;
3
4USE LEARNING;
5
6# 创建表结构
7CREATE TABLE ACCOUNT_INFO(
8    ACCOUNT_ID INTEGER PRIMARY KEY AUTO_INCREMENT,
9    NAME VARCHAR(50),
10    PWD VARCHAR(50),
11    BALANCE INTEGER
12);
13
14# 插入一条数据
15INSERT INTO ACCOUNT_INFO VALUES(NULL,'root','root',100);

3. Использование генератора MyBatis

ссылка на скачивание:

Если вы пользователь Windows, вы можете выбрать независимую от платформы версию при загрузке mysql-connector.

Поместите загруженный пакет jar драйвера MySQL в каталог lib генератора,

убедисьmybatis-generator-core-1.3.6.jarа такжеmysql-connector-java-5.1.2.jarв том же каталоге.

Подготовьте файл конфигурации configuration.xml со следующим содержимым:

1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE generatorConfiguration
3  PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
4  "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
5
6<generatorConfiguration>
7     <!-- 配置驱动jar包路径.用了相对路径 -->
8    <classPathEntry location="mysql-connector-java-5.1.2.jar" />
9
10    <context id="DB2Tables" targetRuntime="MyBatis3">
11        <!-- 为了防止生成的代码中有很多注释,比较难看,加入下面的配置控制 -->
12        <commentGenerator>
13            <property name="suppressDate" value="true" />
14            <property name="suppressAllComments" value="true" />
15        </commentGenerator>
16         <!-- 数据库连接 -->
17        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
18            connectionURL="jdbc:mysql://localhost/LEARNING" userId="root"
19            password="********">
20            <property name="remarks" value="true" />
21        </jdbcConnection>
22
23        <javaTypeResolver>
24            <property name="forceBigDecimals" value="false" />
25        </javaTypeResolver>
26        <!-- 数据表对应的model 层  -->
27        <javaModelGenerator targetPackage="com.zdran.springboot.dao"
28            targetProject="D:\bxwzh">
29            <property name="enableSubPackages" value="true" />
30        </javaModelGenerator>
31        <!-- sql mapper 隐射配置文件 -->
32        <sqlMapGenerator targetPackage="com.zdran.springboot.mapping"
33            targetProject="D:\bxwzh">
34            <property name="enableSubPackages" value="true" />
35        </sqlMapGenerator>
36        <!-- 在ibatis2 中是dao层,但在mybatis3中,其实就是mapper接口 -->
37        <javaClientGenerator type="XMLMAPPER"
38            targetPackage="com.zdran.springboot.mapper" targetProject="D:\bxwzh">
39            <property name="enableSubPackages" value="true" />
40        </javaClientGenerator>
41
42    <!-- 要对哪些数据表进行生成操作,必须要有一个. -->
43    <table tableName="ACCOUNT_INFO" domainObjectName="AccountInfo"></table>
44    </context>
45</generatorConfiguration>

Примечание. Пароль к базе данных необходимо изменить на свой. targetProject="D:\bxwzh, этот каталог должен быть как можно более пустым"

Выполните следующую команду в каталоге lib генератора:

1java -jar mybatis-generator-core-1.3.6.jar -configfile configuration.xml  -overwrite
2
3出现:MyBatis Generator finished successfully. 就说明成功了。

Мы напрямую копируем каталог com в каталог проекта

В новом каталоге ресурсов mybaits, затем сопоставьте папку со следующими mybaits.

Структура нашего проекта теперь выглядит так:


项目结构

Добавьте зависимость mybaits:

1<!--springBoot和mybatis继承-->
2<dependency>
3    <groupId>org.mybatis.spring.boot</groupId>
4    <artifactId>mybatis-spring-boot-starter</artifactId>
5    <version>1.3.2</version>
6    <!-- 移除 logging -->
7    <exclusions>
8        <exclusion>
9            <groupId>org.springframework.boot</groupId>
10            <artifactId>spring-boot-starter-logging</artifactId>
11        </exclusion>
12    </exclusions>
13</dependency>
14<!-- mysql 驱动-->
15<dependency>
16    <groupId>mysql</groupId>
17    <artifactId>mysql-connector-java</artifactId>
18    <version>5.1.2</version>
19</dependency>

4. Добавьте конфигурацию MyBatis

Добавьте следующую конфигурацию в файл конфигурации:

1mybatis:
2  mapperLocations: classpath:mybatis/mapping/*.xml
3  typeAliasesPackage: com.zdran.springboot.dao
4
5spring:
6    datasource:
7        name: test
8        url: jdbc:mysql://localhost:3306/LEARNING
9        username: root
10        password: ********
11        driver-class-name: com.mysql.jdbc.Driver

5. Проверьте это

Добавьте путь сканирования пакета в класс SpringbootApplication.

1
2/**
3 * 启动程序
4 * Create by zdRan on 2018/6/28
5 *
6 * @author cm.zdran@gmail.com
7 */
8@SpringBootApplication
9@MapperScan(basePackages = "com.zdran.springboot.mapper")
10public class SpringbootApplication {
11
12    public static void main(String[] args) {
13        SpringApplication.run(SpringbootApplication.class, args);
14    }
15}
16

Затем мы реализуем интерфейс для запроса информации об учетной записи на основе имени. Создайте соответствующий контроллер, сервис и т.д.

Реализация сервисного уровня:

1/**
2 * Create by ranzd on 2018/7/2
3 *
4 * @author cm.zdran@gmail.com
5 */
6@Service
7public class AccountServiceImpl implements AccountService {
8    @Autowired
9    AccountInfoMapper accountInfoMapper;
10
11    @Override
12    public AccountInfo queryByName(String name) {
13        AccountInfoExample example = new AccountInfoExample();
14        example.createCriteria().andNameEqualTo(name);
15        List<AccountInfo> accountInfoList = accountInfoMapper.selectByExample(example);
16        if (accountInfoList != null && accountInfoList.size() != 0) {
17            return accountInfoList.get(0);
18        }
19        return null;
20    }
21}

Реализация уровня контроллера:

1/**
2 * Create by ranzd on 2018/7/3
3 *
4 * @author cm.zdran@gmail.com
5 */
6@RestController
7@RequestMapping("/account")
8public class AccountController {
9    private Logger logger = LoggerFactory.getLogger(AccountController.class);
10
11    @Autowired
12    AccountService accountService;
13
14    @GetMapping("/get/{name}")
15    public AccountInfo getAccountByName(@PathVariable String name) {
16        logger.info("根据姓名获取账号信息。入参:name:{}", name);
17        AccountInfo accountInfo = accountService.queryByName(name);
18        if (accountInfo == null) {
19            logger.info("根据姓名获取账号信息。获取失败");
20        }
21        logger.info("根据姓名获取账号信息。出参:accountInfo:{}", accountInfo.22    [native code]
23}">toString());
24        return accountInfo;
25    }
26}

запустить его, посетитьhttp://localhost:9090/learning/account/get/root

Имя пользователя root в конце URL-адреса

5. Интеграция друида

Описанный выше метод настройки является самым простым методом настройки. Существует также метод настройки, который часто используется в производственных средах.

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

1<dependency>
2    <groupId>com.alibaba</groupId>
3    <artifactId>druid</artifactId>
4    <version>1.1.1</version>
5</dependency>

Добавление конфигурации друида

1
2spring:
3    datasource:
4        url: jdbc:mysql://localhost:3306/LEARNING
5        username: root
6        password: ********
7        driver-class-name: com.mysql.jdbc.Driver
8        initialSize: 5
9        minIdle: 5
10        maxActive: 10
11        maxWait: 10000
12        timeBetweenEvictionRunsMillis: 60000
13        minEvictableIdleTimeMillis: 300000
14        testOnBorrow: false
15        testOnReturn: false
16        testWhileIdle: true
17        keepAlive: true
18        removeAbandoned: true
19        removeAbandonedTimeout: 80
20        logAbandoned: true
21        poolPreparedStatements: true
22        maxPoolPreparedStatementPerConnectionSize: 20
23        filters: stat,slf4j,wall

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

1<!-- 为了方便使用@ConfigurationProperties注解 -->
2<dependency>
3    <groupId>org.springframework.boot</groupId>
4    <artifactId>spring-boot-configuration-processor</artifactId>
5    <optional>true</optional>
6</dependency>

Создать класс чтения файла конфигурации друида

1/**
2 * Create by ranzd on 2018/7/3
3 *
4 * @author cm.zdran@gmail.com
5 */
6@Configuration
7@ConfigurationProperties(prefix = "spring.datasource")
8public class DruidDataSourceProperties {
9
10    private String driverClassName;
11    private String url;
12    private String username;
13    private String password;
14
15    private int initialSize;
16    private int minIdle;
17    private int maxActive;
18    private long maxWait;
19    private long timeBetweenEvictionRunsMillis;
20    private long minEvictableIdleTimeMillis;
21    private boolean testOnBorrow;
22    private boolean testOnReturn;
23    private boolean testWhileIdle;
24    private boolean keepAlive;
25    private boolean removeAbandoned;
26    private int removeAbandonedTimeout;
27    private boolean logAbandoned;
28    private boolean poolPreparedStatements;
29    private int maxPoolPreparedStatementPerConnectionSize;
30    private String filters;
31
32    //省略了所有属性的 get 、set方法
33}
34

В приведенном выше коде отсутствуют методы get и set для всех свойств. В вашем локальном коде должны быть методы get и set.

Удалите конфигурацию mybaits в yml:

1mybatis:
2  mapperLocations: classpath:mybatis/mapping/*.xml
3  typeAliasesPackage: com.zdran.springboot.dao
4

Удалите аннотацию MapperScan в классе SpringbootApplication.

1@MapperScan(basePackages = "com.zdran.springboot.mapper")

Создайте класс конфигурации для mybaits:

1/**
2 * Create by ranzd on 2018/7/3
3 *
4 * @author cm.zdran@gmail.com
5 */
6@Configuration
7@EnableTransactionManagement
8@MapperScan(
9        basePackages = "com.zdran.springboot.mapper", 
10        sqlSessionFactoryRef = "learningSqlSessionFactory")
11public class MyBatisConfig {
12    private Logger logger = LoggerFactory.getLogger(MyBatisConfig.class);
13
14    @Autowired
15    DruidDataSourceProperties druidDataSourceProperties;
16
17    @Bean(name = "learningSqlSessionFactory")
18    @Primary
19    public SqlSessionFactory learningSqlSessionFactory() throws Exception {
20        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
21        sessionFactory.setDataSource(getDruidDataSource());
22        sessionFactory.setTypeAliasesPackage("com.zdran.springboot.dao");
23        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
24                .getResources("classpath:/mybatis/mapping/*.xml"));
25        return sessionFactory.getObject();
26    }
27
28    @Bean(name = "learningDataSource")
29    public DataSource getDruidDataSource() {
30        DruidDataSource druidDataSource = new DruidDataSource();
31        druidDataSource.setDriverClassName(druidDataSourceProperties.getDriverClassName());
32        druidDataSource.setUrl(druidDataSourceProperties.getUrl());
33        druidDataSource.setUsername(druidDataSourceProperties.getUsername());
34        druidDataSource.setPassword(druidDataSourceProperties.getPassword());
35        druidDataSource.setInitialSize(druidDataSourceProperties.getInitialSize());
36        druidDataSource.setMinIdle(druidDataSourceProperties.getMinIdle());
37        druidDataSource.setMaxActive(druidDataSourceProperties.getMaxActive());
38        druidDataSource.setMaxWait(druidDataSourceProperties.getMaxWait());
39        druidDataSource.setTimeBetweenEvictionRunsMillis(
40            druidDataSourceProperties.getTimeBetweenEvictionRunsMillis());
41        druidDataSource.setMinEvictableIdleTimeMillis(
42            druidDataSourceProperties.getMinEvictableIdleTimeMillis());
43        druidDataSource.setTestOnBorrow(druidDataSourceProperties.isTestOnBorrow());
44        druidDataSource.setTestOnReturn(druidDataSourceProperties.isTestOnReturn());
45        druidDataSource.setTestWhileIdle(druidDataSourceProperties.isTestWhileIdle());
46        druidDataSource.setKeepAlive(druidDataSourceProperties.isKeepAlive());
47        druidDataSource.setRemoveAbandoned(druidDataSourceProperties.isRemoveAbandoned());
48        druidDataSource.setRemoveAbandonedTimeout(
49            druidDataSourceProperties.getRemoveAbandonedTimeout());
50        druidDataSource.setLogAbandoned(druidDataSourceProperties.isLogAbandoned());
51
52        druidDataSource.setPoolPreparedStatements(
53            druidDataSourceProperties.isPoolPreparedStatements());
54        druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(
55            druidDataSourceProperties.getMaxPoolPreparedStatementPerConnectionSize());
56        try {
57            druidDataSource.setFilters(druidDataSourceProperties.getFilters());
58            druidDataSource.init();
59        } catch (SQLException e) {
60            logger.error("数据源初始化失败", e);
61        }
62        return druidDataSource;
63    }
64}
65

ОК! Перезапустите, чтобы протестировать интерфейс прямо сейчас.

Пожалуйста, укажите источник
Ссылка на эту статью:Этот курс.com/20180703.Контракт…