通过使用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,如下图所示(我在重新生成代码前,已经把自动生成的代码删掉了,所以不存在追加的问题)
为避免浪费大家时间,我介绍下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属性
也有人反映schema="root"并没有解决问题,有人改成了catalog,就可以了,反正我改来改去是没解决问题,通过降低mysql的版本解决的。