编程那点事编程那点事

专注编程入门及提高
探究程序员职业规划之道!

解决mybatis generator 生成mapper.xml时代码重复问题

通过使用Mybatis Generator,我们可以快速生成数据库已有表的增删改查方法,极大的提高开发效率。

关于如何配置MyBatis自动生成代码,可以看下本站的这篇文章:mybatis逆向工厂:利用mybatis-generator-core生成商城系统的部分代码

最近,通过使用MyBatis Generator生成的代码在运行的时候报了类似如下错误:

Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.codingwhy.mapper.TbOrderMapper.BaseResultMap
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:782)
at org.apache.ibatis.session.Configuration$StrictMap.put(Configuration.java:754)
at org.apache.ibatis.session.Configuration.addResultMap(Configuration.java:536)
at org.apache.ibatis.builder.MapperBuilderAssistant.addResultMap(MapperBuilderAssistant.java:207)
at org.apache.ibatis.builder.ResultMapResolver.resolve(ResultMapResolver.java:47)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:284)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElement(XMLMapperBuilder.java:251)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.resultMapElements(XMLMapperBuilder.java:243)
at org.apache.ibatis.builder.xml.XMLMapperBuilder.configurationElement(XMLMapperBuilder.java:116)
... 228 more

百度了下,其实就是重复定义了id,如下图所示(我在重新生成代码前,已经把自动生成的代码删掉了,所以不存在追加的问题)

195819123.png

为避免浪费大家时间,我介绍下jar包的版本号

org.mybatis.generator:1.4.0

mysql-connector-java:5.1.32

代码生成的配置文件代码如下:

<?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>
    <!--<classPathEntry location="F:/Repository/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar" />-->
    <classPathEntry location="F:/Repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar" />
    <context id="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/javamall?serverTimezone=UTC" userId="root" password="root">
        </jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.codingwhy.pojo" targetProject="E:\Java\javamall\javamall.manager\javamall.manager.pojo\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.codingwhy.mapper" targetProject="E:\Java\javamall\javamall.manager\javamall.manager.mapper\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.codingwhy.mapper" targetProject="E:\Java\javamall\javamall.manager\javamall.manager.mapper\src\main\java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table schema="" tableName="tb_content"></table>
        <table schema="" tableName="tb_content_category"></table>
        <table schema="" tableName="tb_item"></table>
        <table schema="" tableName="tb_item_cat"></table>
        <table schema="" tableName="tb_item_desc"></table>
        <table schema="" tableName="tb_item_param"></table>
        <table schema="" tableName="tb_item_param_item"></table>
        <table schema="" tableName="tb_order"></table>
        <table schema="" tableName="tb_order_item"></table>
        <table schema="" tableName="tb_order_shipping"></table>
        <table schema="" tableName="tb_user"></table>
    </context>
</generatorConfiguration>

我是怎么解决的呢?

我把代码

<classPathEntry location="F:/Repository/mysql/mysql-connector-java/8.0.18/mysql-connector-java-8.0.18.jar" />

改成了

<classPathEntry location="F:/Repository/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar" />

再生成问题就解决了

然后网上的话还有其他的解决方法

1、是mybatis-generator-core的代码,这个的话,我自己是不推荐的

2、修改schema属性

200525280.png

也有人反映schema="root"并没有解决问题,有人改成了catalog,就可以了,反正我改来改去是没解决问题,通过降低mysql的版本解决的。

未经允许不得转载: 技术文章 » Java编程 » 解决mybatis generator 生成mapper.xml时代码重复问题