点击打开链接https://blog.youkuaiyun.com/dingsai88/article/details/51252272
如果指定的oracle数据库下的多个表空间存在同一张表时,必须要指定schema的值,否则要出现生成的代码和Mapper.xml文件中出现重复的代码和配置,然后导致项目在启动时出现以下错误:
Caused by: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.tyky.mapper.TSysUserMapper.BaseResultMap
此错误是说明在逆向工程生成的xxxMapper.xml文件中出现了多个<resultMap id="BaseResultMap" type="xxx" >,正常情况下一个mapper.xml文件中只会出现一个<resultMap id="BaseResultMap" type="xxx" >标签。
要避免此错误的产生,需要在Mybatis逆向工程的generatorConfig.xml中配置指定要生成代码的table时使用以下配置:
<!-- 指定数据库表 -->
<table schema="dzjc_zhejiang" tableName="t_sys_user"></table>
其中的 schema="dzjc_zhejiang"就是指定oralce的表空间,避免其他表空间下有同名的表时对逆向工程生成的代码产生干扰。
经测试 , 如果数据库是Oracle SqlServer需要去掉schema 属性 , MySql则不需要去掉 !!!
另,如果项目启动过程中报以下错误:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
解决方法:在maven工程下的pom.xml中添加以下配置:
<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
关于oracle表名区分大小写的问题
oracle不是区分大小写的,是建表的时候是没有去掉双引号。
CREATE TABLE TableName(id number); //虽然写的时候是有大写和小写,但是在数据库里面是不区分的。
select * from tablename; //这样是可以的
SELECT * FROM TABLENAME; //这样写也不会有问题
SELECT * FROM TableName; //都没问题
CREATE TABLE "TableName"("id" number); // 如果创建表的时候是这样写的,那么就必须严格区分大小写
SELECT * FROM "TableName"; //不仅要区分大小写而且要加双引号,以便和上面的第三种查询方式区分开。
所以问题不在于oracle,而是你的同事创建表的时候没有去掉双引号。
与其改sql还不如把表改过来......