1. 程式人生 > 實用技巧 >關於tk.MyBatis+HikariCP的自動生成程式碼流程

關於tk.MyBatis+HikariCP的自動生成程式碼流程

SpringBoot的初始Web搭建我就不多說了,在此基礎上進行使用hikari連線池的使用及tk.mybatis自動生成程式碼的實踐踩坑如下:

  說明:1.我的主檔案入口地址為:package com.funtl.hello.spring.boot

     2.指定生成的Mapper繼承模板介面地址為:com.tk.mybatis.mapper.MyMapper

     3.generatorConfig.xml 配置介面地址為:main/resources/generator/generatorConfig.xml

     4.application.yml地址為:main\resources\application.yml

     5.jdbc.properties 連線資料庫配置地址為:main\resources\jdbc.properties

  整體目錄結構如下:

  

一、pom的配置如下:

  

  SpringBoot搭建Web專案確實很爽,但是也存在一些很尷尬的問題,比如版本更新太快,很多外掛都對應不上版本,導致在初學情況下很多問題根本解決不了

  

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation
="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.funtl</groupId> <artifactId>hello-spring-boot</artifactId> <version>1.0.0-SNAPSHOT</version> <name>hello-spring-boot</name> <description>Demo project for
Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>${hikaricp.version}</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>org.apache.tomcat</groupId> <artifactId>tomcat-jdbc</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>2.1.5</version> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.3.5</version> <configuration> <configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile> <overwrite>true</overwrite> <verbose>true</verbose> </configuration> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper</artifactId> <version>4.1.4</version> </dependency> </dependencies> </plugin> </plugins> </build> </project>

二、application.yml配置如下:

  其中包括一些最基礎配置及hikari、mybatis的配置。

spring:
  application:
    name: hello-spring-boot0909
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/testjavadb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: Tanhao0508
    hikari:
      minimum-idle: 5
      idle-timeout: 600000
      maximum-pool-size: 10
      auto-commit: true
      pool-name: MyHikariCP
      max-lifetime: 1800000
      connection-timeout: 30000
      connection-test-query: SELECT 1
mybatis:
  type-aliases-package: com.funtl.hello.spring.boot.domain
  mapper-locations: classpath:mapper/*.xml

三、編輯生成的Mapper繼承模板介面

該介面不能被掃描到,否則會因為與原檔名衝突而導致報錯,我的路徑為:com.tk.mybatis.mapper.MyMapper
package com.tk.mybatis.mapper;

import tk.mybatis.mapper.annotation.RegisterMapper;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ExampleMapper;
import tk.mybatis.mapper.common.Marker;
import tk.mybatis.mapper.common.RowBoundsMapper;

/**
 * create by: tanhao
 * description: 自己的Mapper
 * 特別注意,該介面不能被掃描到,否則會報錯
 * create time: 2020/9/12 17:13
 * @Param: null
 * @return
 */
@RegisterMapper
public interface MyMapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker {

}

四、MyBatis 自動生成的配置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>
    <!-- 引入 application.properties -->

    <properties resource="jdbc.properties" />

    <!-- MyBatis3Simple:不生成 Example相關類及方法 defaultModelType="flat" -->
    <context id="Mysql" targetRuntime="MyBatis3Simple"  defaultModelType="flat">

        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 指定生成 Mapper 的繼承模板 -->
        <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
            <property name="mappers" value="com.tk.mybatis.mapper.MyMapper"/>
         </plugin>

        <!--注意context內的檔案要按序放-->
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>


        <!-- jdbc 連線配置 -->
        <jdbcConnection driverClass="${jdbc.driverClass}"
                        connectionURL="${jdbc.connectionURL}"
                        userId="${jdbc.username}"
                        password="${jdbc.password}">
        </jdbcConnection>

        <javaTypeResolver>
            <!-- 是否使用bigDecimal, false可自動轉化以下型別(Long, Integer, Short, etc.) -->
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- 生成實體類的包名和位置 ,targetPackage指的是包名,targetProject值得是路徑位置-->
        <!-- 對於生成的pojo所在包,pojo其實就是domain Entity-->
        <javaModelGenerator targetPackage="com.funtl.hello.spring.boot.domain"
                            targetProject="src/main/java">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>

        <!-- 對於生成的mapper.xml所在目錄 -->
        <sqlMapGenerator targetPackage="mapper"
                         targetProject="src/main/resources"/>

        <!-- 配置mapper對應的java對映  也可以叫dao層 -->
        <javaClientGenerator targetPackage="com.funtl.hello.spring.boot.mapper"
                             targetProject="src/main/java"
                             type="XMLMAPPER"/>

        <!-- table可以有多個,每個資料庫中的表都可以寫一個table,tableName表示要匹配的資料庫表,也可以在tableName屬性中通過使用%萬用字元來匹配所有資料庫表,只有匹配的表才會自動生成檔案 -->
        <table tableName="user">
            <property name = "ignoreQualifiersAtRuntime" value="true" />
            <generatedKey column="id" sqlStatement="Mysql" identity="true"/>
        </table>

    </context>
</generatorConfiguration>

  標了顏色的地方分別代表生成的Mapper、dto、dao 都需要根據自身實際情況修改。

五、jdbc.properties引數配置
jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/testjavadb?serverTimezone=UTC&generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=utf8&useSSL=false&nullCatalogMeansCurrent=true
jdbc.username: root
jdbc.password: Tanhao0508

其中需要注意的是:

nullCatalogMeansCurrent=true 如果沒配置這個引數可能會讓我們自動生成的內容與資料庫實際欄位不對應
serverTimezone=UTC 設定時差

六、重新整理下Maven倉庫的外掛依賴,然後雙擊
mybatis-generator下的mybatis-generator:generate,就可以生成對應的程式碼檔案,

七、使用測試檔案測試介面能否使用:

  需要注意的是因為主檔案入口會掃描不到mapper包,所以需要在主檔案入口加一下scan引數:

  @MapperScan(basePackages = "com.funtl.hello.spring.boot.mapper")

HelloSpringBootApplicationTests如下:
package com.funtl.hello.spring.boot;

import com.funtl.hello.spring.boot.domain.User;
import com.funtl.hello.spring.boot.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

@SpringBootTest
class HelloSpringBootApplicationTests {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void contextLoads() {
        System.out.println("Hello Spring Boot Test");
    }
    @Test
    public void TestSelectAll(){
        List<User> users = userMapper.selectAll();
        for (User user : users) {
            System.out.println(user);
        }
    }

}

八:執行HelloSpringBootApplicationTests

列印結果:

查詢成功!