X

Mybatis Generator自动生成Kotlin文件

很早就用过Mybatis Generator,一直觉得没什么可分享的,直到今天工作又要重新配置Mybatis Generator,遇到各种问题各种坑,忍无可忍只能写篇博客压压惊。

之前经常在Maven和Java环境下使用mbg,而且连接的数据库大部分是MySQL 5系,而这一次不仅要将语言切换成kotlin,还要对应Gradle以及MySQL 8系。因此总结下需求即是: 在IntelliJ + Kotlin + Gradle + MySQL8的环境下使用Mybatis Generator自动生成Kotlin文件(包括Entity以及Dao等)。

第一步:配置Gradle

编写build.gradle.kts文件。注意,由于是kotlin项目,所以我在这里使用了kts后缀的的gradle文件。这里简单说下kts文件,传统的gradle采用的是groovy语言,而Gradle实际上也支持使用Kotlin来编写Gradle构建脚本,常见的构建脚本是.gradle结尾,而Koltin语法编写的脚本则是.gradle.kts。以下代码即是用kotlin编写的build.gradle.kts。这里没有什么可解释的内容,参考注释,照抄即可。

plugins {
    id("com.thinkimi.gradle.MybatisGenerator") version "2.2"
}

mybatisGenerator {
    verbose = true
    configFile = "src/main/resources/generatorConfig.xml" // 指定mbg配置文件的路径

    dependencies {
        mybatisGenerator("com.itfsw:mybatis-generator-plugin:1.3.7")
        mybatisGenerator("org.mybatis.generator:mybatis-generator-core:1.4.0")
        mybatisGenerator("mysql:mysql-connector-java")
    }
}

configurations {
    mybatisGenerator
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.mybatis.generator:mybatis-generator-core:1.4.0")
    implementation("mysql:mysql-connector-java")
}

第二步:编写mbg配置文件

编写generatorConfig.xml文件。这里比较关键的设置是targetRuntime=”MyBatis3Kotlin”,这是输出kotlin代码的关键。需要注意的是,要使用MyBatis3Kotlin属性必须导入mbg1.4及以上版本才可以。参考:Mybatis-generator升级信息 。除此之外可参考代码中注释。

<?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"/>
  <!--因为要生成kotlin文件,所以这里targetRuntime要设置为MyBatis3Kotlin  -->
  <context id="mbg" targetRuntime="MyBatis3Kotlin">  
    <!-- 配置数据库连接信息,信息读取来源是generator.properties,当然也可以直接将值填在下面 -->
    <jdbcConnection driverClass="${jdbc.driverClass}"
                    connectionURL="${jdbc.connectionURL}"
                    userId="${jdbc.userId}"
                    password="${jdbc.password}">
      <!--解决mysql驱动升级到8.0后不生成指定数据库代码的问题-->
      <property name="nullCatalogMeansCurrent" value="true" />
    </jdbcConnection>

    <!-- 设置Entity类的包名以及输出目录 -->
    <javaModelGenerator
      targetPackage="com.my.package.entity"
      targetProject="src/main/kotlin" />

    <!-- 设置DAO类的包名以及输出目录 -->
    <javaClientGenerator
      targetPackage="com.my.package.dao"
      targetProject="src/main/kotlin" 
      type="ANNOTATEDMAPPER"/>

    <!-- 设置需要生成的相关表 -->
    <table tableName="tableName1" />
    <table tableName="tableName2" />
  </context>
</generatorConfiguration>

接下来是数据库配置信息generator.properties。这里唯一需要注意的是jdbc.driverClass,如果你使用的是8系的MySQL,驱动类要设置为com.mysql.cj.jdbc.Driver,如果是5系或之前的MySQL,驱动类则是com.mysql.jdbc.Driver

jdbc.driverClass=com.mysql.cj.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://localhost:3306/myDB?characterEncoding=utf-8
jdbc.userId=root
jdbc.password=root

第三步:编写执行类

object Generator {
    @Throws(Exception::class)
    @JvmStatic
    fun main(args: Array<String>) {
        // 执行过程中的警告信息
        val warnings: List<String> = ArrayList()
        // 是否覆盖已有文件
        val overwrite = true
        // 从generatorConfig.xml中读取mbg配置信息
        val inputStream = Generator::class.java.getResourceAsStream("/generatorConfig.xml")
        val cp = ConfigurationParser(warnings)
        val config: Configuration = cp.parseConfiguration(inputStream)
        inputStream.close()
        val callback = DefaultShellCallback(overwrite)
        // 创建MyBatisGenerator对象
        val myBatisGenerator = MyBatisGenerator(config, callback, warnings)
        // 执行
        myBatisGenerator.generate(null)
        // 打印警告信息
        for (warning in warnings) {
            println(warning)
        }
    }
}

至此,mbg导入工作已经完成。执行上面的main方法,我们需要的文件就可以自动生成。最后再总结下今天遇到的问题:

1、unable to load authentication plugin ‘caching_sha2_password’. (MySQL):这个是驱动的问题,当MySQL升到8系之后,我们的驱动也应该换成com.mysql.cj.jdbc.Driver,如果是5系或之前的MySQL,驱动类则是com.mysql.jdbc.Driver

2、java.lang.classnotfoundexception: com.mysql.cj.jdbc.driver:这个是gradle中引入依赖版本的问题,implementation(“mysql:mysql-connector-java”),在springboot中,如果依赖后面不加版本号的话,系统会为我们导入最新版本,如果你想指定版本,一要要使用8以上的版本才会包含com.mysql.cj.jdbc.driver这个驱动。我使用的版本是mysql:mysql-connector-java:8.0.22

3、mybatis generator communications link failure:这个是数据库连接的问题。实际上与上两个问题是配套出现的,当依赖和驱动都设置正确后,此问题也会随之解决。另外出现此问题也有可能是数据库连接地址不正确导致。

4、cause: targetruntime in context XXX is invalid:这个问题在上文中也讲过,由于我是用的targetRuntime是”MyBatis3Kotlin”,而MyBatis3Kotlin是在mbg1.4才加入的,所以要将mbg的依赖版本升级到1.4或以上才可以。如果你使用其他的targetRuntime也出现此问题,大概率也是版本问题,升级到最新版本应该可以解决。

使用Mybatis Generator自动生成Kotlin文件的内容基本上总结完了,但是还剩下一个问题,即生成的kotlin类文件中的内容可能不是我们想要的,或者格式与我们的期待有些出入,这就需要我们根据需求去重新配置generatorConfig.xml,如果有时间,我会再开一篇博客去详细说明下generatorConfig.xml中的各种配置。

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/mybatis-generator自动生成kotlin文件/
Categories: java系统开发
kwantong:

View Comments (2)