侧边栏壁纸
博主头像
fastjrun博主等级

前大厂工程师,长期从事 Java 开发,架构设计,容器化等相关工作,精通java,熟练使用maven、jenkins等devops相关工具链,擅长容器化方案规划、设计和落地。

  • 累计撰写 70 篇文章
  • 累计创建 47 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

基于h2数据库使用mybatis-generator-maven-plugin生成代码实践-注解版

fastjrun
2022-02-02 / 0 评论 / 0 点赞 / 661 阅读 / 6,165 字 / 正在检测是否收录...

背景

在一般用到mybatis的项目中,大家一般都习惯用mybatis-generator直连数据库来生成mapper文件和java代码,然后再根据实际情况对项目中已有的mapper文件和java代码进行调整,这样做可能会存在2个问题:

  • 在把生成的mapper文件和java代码整合到到原项目的过程中,有可能会出错
  • 直连的数据库有可能还没有更新schema,导致生成的mapper文件和java代码还不是预期的

因此,我们把mybatis-generator生成的mapper文件和java代码直接作为一个单独的模块来维护,输出一个jar包即可。以maven工程为例,其它项目只需要以dependency的方式引入并直接使用即可,避免了调整过程中可能出错的环节;另外,我们把数据库最新的schema先导入h2,然后再用mybatis-generator连接到h2,生成mapper文件和java代码,这样就保证了每次生成的代码都是我们所期望的,而且这个过程我们不再需要连接实际的数据库,随时随地生成mapper文件和java代码。

接下来我们简单介绍一下如何使用快嘉mbg-archetype快速生成这样的一个模块和这个模块的基本使用方法。该模块从1.1版本开始,默认生成mybatis注解代码。如仍需mapper定义文件,调整mybatis-generator.xml中的相应参数即可。

1.环境准备

版本
开发机OSwin10
JDK1.8+
MavenMaven 3.3.9+

2.使用快嘉mbg脚手架生成一个新项目

脚手架声明:
com.fastjrun.archetype:mbg-archetype:1.2
脚手架参数:

  • groupId:pom坐标
  • artifactId:pom坐标,这个值同时会影响到工程下pom.xml中的artifactId、pom中引用的插件mybatis-generator-maven-plugin的配置sqlFile和链接的h2库名称、该工程下的sql文件名。
  • version:pom坐标
  • package:生成代码包名前缀
    选择合适的参数,在任一目录下执行脚手1考如下示例命令,示例命令会在当前执行目录生成一个mbgdemo文件夹)
mvn archetype:generate -U -B -DgroupId=com.fastjrun.share -DartifactId=mbgdemo -Dpackage="com.fastjrun.share.mbgdemo" -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=com.fastjrun.archetype -DarchetypeArtifactId=mbg-archetype -DarchetypeVersion=1.2 -U

mbgdemo目录下文件组织结构

│  pom.xml
│
└─src
    └─main
        ├─java
        │      don't kill me.info
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

=======================================================================

3.将mbgdemo.sql修改成你工程的建库sql,可在本工程下生成mybatis相关entity和mapper代码

新打开一个term窗口,并进入mbgdemo目录,执行mvn clean package就可以在target目录生成mbgdemo-1.0-SNAPSHOT.jar后,该jar里已经包含了mybatis的entity和mapper代码,该jar可以提供给其他模块以dependency的方式引入并直接使用。

具体配置详见 src/main/resources/mybatis-generator.xml,可参考(MyBatis GeneratorXML Configuration File Reference)进行调整

<?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>

    <!-- !!!! Driver Class Path !!!! -->
    <context id="context" targetRuntime="MyBatis3">
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <!-- !!!! Database Configurations !!!! -->
        <jdbcConnection driverClass="org.h2.Driver"
                        connectionURL="jdbc:h2:mem:mbgdemo;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE"
                        userId="sa"
                        password="sa"/>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- !!!! Model Configurations !!!! -->
        <javaModelGenerator targetPackage="com.fastjrun.share.mbgdemo.entity"
                            targetProject="${targetJavaProject}">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- !!!! Mapper XML Configurations !!!! -->
        <sqlMapGenerator targetPackage="mappers"
                         targetProject="${targetResourcesProject}">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- !!!! Mapper Interface Configurations !!!! when type in
        XMLMAPPER:生成xml文件
        ANNOTATEDMAPPER: 生成注解,忽略xml文件
        -->
        <javaClientGenerator targetPackage="com.fastjrun.share.mbgdemo.mapper"
                             targetProject="${targetJavaProject}" type="ANNOTATEDMAPPER">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- !!!! Table Configurations !!!! -->
        <table tableName="t_user"
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false" >
        </table>
        <table tableName="t_user_login"/>
    </context>
</generatorConfiguration>

注意:mybatis-generator的覆盖只针对以上配置文件中出现的table节点有效,以上面配置文件为例:如果第一次代码生成同时配置了t_user和t_user_login,第二次代码生成只配置了t_user,则t_user相关java代码和xml配置文件会被覆盖,而t_user_login相关java代码和xml配置文件将会保留不会被处理,本示例工程提供了一种解决方案,在生成代码之前,使用maven-clean-plugin同时删除了src/main/java/下所有java代码和src/main/resources下的mappers目录。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-clean-plugin</artifactId>
    <version>${maven-clean-plugin.version}</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*</include>
                </includes>
               <useDefaultExcludes>true</useDefaultExcludes>
               <!--对这些文件不清理-->
               <excludes>
                   <exclude>*.info</exclude>
               </excludes>
            </fileset>
            <fileset>
                <directory>src/main/resources</directory>
                <includes>
                    <include>mappers/</include>
                </includes>
            </fileset>
        </filesets>
    </configuration>
</plugin>

4.下面演示一下定制化maven-clean-plugin取得的效果

新打开一个term窗口,并进入mbgdemo目录

cd mbgdemo
mvn clean generate-sources

这时候mbgdemo目录下文件组织结构,这是mybatis-generator新生成代码的时候,这时还没有编译

│  pom.xml
│
└─src
    └─main
        ├─java
        │  │  don't kill me.info
        │  │
        │  └─com
        │      └─fastjrun
        │          └─share
        │              └─mbgdemo
        │                  ├─entity
        │                  │      TUser.java
        │                  │      TUserLogin.java
        │                  │      TUserLoginExample.java
        │                  │
        │                  └─mapper
        │                          TUserLoginMapper.java
        │                          TUserLoginSqlProvider.java
        │                          TUserMapper.java
        │                          TUserSqlProvider.java
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

接下来执行mvn clean,会发现mbgdemo还原到了初始化的时候,文件组织结构又变如下

│  pom.xml
│
└─src
    └─main
        ├─java
        │      don't kill me.info
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

使用H2数据库的一些注意事项

  • 用mysqldump导出demo.sql结构,参考命令 mysqldump -uroot -p123456 -d demo> demo.sql
  • 用导出的demo.sql替换项目中的mbgdemo.sql
  • Date字段不能为“0000-00-00 00:00:00”,建议替换为“1970-01-01 08:00:01”
  • 无论字段还是表级别,h2都不支持CHARSET=utf8类似字段,可以全部替换为空字符
  • h2不支持显示声明USING BTREE ,可以全部替换为空字符
  • h2表级别只支持COMMENT和ENGINE两个属性,且COMMENT要在ENGINE之前
  • h2要求全库索引名称全库唯一,这样就需要处理数据库中所有重复的索引名称,如DEMO_INDEX一共出现了4次,依次调整为DEMO_INDEX、DEMO_INDEX2、DEMO_INDEX3和DEMO_INDEX4

原型源码地址:

0

评论区