问题复现:
- mybatis-plus代码生成器(可以在官方的文档找到demo)
- oracle数据库
现象:启用代码生成器只有目录产生了,没有实体和mapper这些
正文开始:
emmm,遇到这个问题确实是个比较头疼的事情。当我面对这一个数据表拥有50个字段的时候,我彻底放弃了手动敲实体类的想法。这时候,看到mybatis-plus文档提供了代码生成器!解决生产力的福音!然后就照着文档的代码生成器搞了起来。
一切都ok,启动,输入包名,表名,回车!
wo!多么美妙的一天啊~ 生产力又解放了呢~
如果你以为这样就结束了,那就太天真了(/黑脸)
正当我解放生产力的时候,我再次输入表名,结果这次:
????什么,之前不是用的好好的么???
尝试多遍之后我意识到这不是个简单的问题。之前ok的啊,为什么这张表不行?....
然后,有两个选择在我面前
1.手敲50个字段
2.调试这个代码生成器
作为一个懒人,肯定调试啊,还一劳永逸!
断点调试!
在源码的com.baomidou.mybatisplus.generator.config.builder
这个包下,有个这个函数getTablesInfo
来获取数据库的相应信息,然后来生成entity。当然断点打上(建议,用idea看源码的时候最好把源码下载下来,class文件毕竟没有源代码看着舒服)。
很好,找到对应oracle数据源的处理模块了,接着往下走:
运行到这里的时候我就懵了?啥,retults.next()
居然是false?这个while循环肯定执行不下去了,这个while循环就是处理需要自动生成的表的相关信息的,那都false了,还生成个锤子代码。
于是我开始了寻找这个的值为什么是false的旅途。
往上看一行,results
这个结果实质性tablesSql来的(看上图的第457行)
既然这样,再来一遍。
原来是执行了这条语句,走起,数据库执行一遍
居然真的是空的,怪不得查不到数据。
然后我好像发现了什么猫腻,看到源码有一行注释
oracle默认schema=username,这个所有的表都是用这个用户名创建的???
这时候在看一下表的相关信息:
什么!?这张表的用户是 CUX!!!那我用APPS能查到才怪呢!
改一下用户名看能不能查到数据。
还真有,那么问题到这里就清晰了,是schema用错了,才导致没有数据的........
解决方案:
在生成器的主方法中有个设置数据源的地方:
在这里填上你需要的schema就ok。最后试试:
奶思!大功告成!能够生产代码了,美滋滋。
总结:
oracle数据库还是和mysql有很大不一样的,别问我为什么用oracle,因为这是个老项目的迁移,没得法。
贴个本项目Github地址支持oracle和mysql数据库 链接