因维护老项目,项目中没有逆向工程生成工具,只能自己添加,但是前任设计数据
库表结构略显与众不同,导致我陷入半天。
参考:generatorConfig.xml配置格式
背景:
数据库:Oracle
先看下表结构:
image.png
- 问题1
之前创建表结构时,前任的创建表语句中的表名和字段名都是加引号的,因为Oracle是区分大小写的,我推测,他是想要表名和字段名可以展示为小写原始状态,才会这么做,这就导致了我们写sql语句的时候,要这样写:表名和列名都要加引号
SELECT a."bean_name", a."method_name" , a.* FROM "sys_async_task" a ;
所以在逆向工程的表配置中要加上delimitIdentifiers= true 和 delimitAllColumns=true 配置。
<table tableName= "sys_async_task" domainObjectName="SysAsyncTask"
delimitIdentifiers="true" delimitAllColumns="true"
enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
</table>
可以理解为:
delimitIdentifiers=true :生成的文件中,表名会被标识符引起来(Oracle是双引号,Mysql是反引号)
delimitAllColumns=true : 生成的文件中,列名会被标识符引起来(Oracle是双引号,Mysql是反引号)
-
效果如下:
image.png
这样修改后,我们就可以生成一个mapper.xml文件了,但是好戏才刚刚开始!
-
问题2
当我们开始使用mapper.xml时,会发现一个jdbcType=OTHER的陌生情况
如果我们不做更改继续使用时(以Insert为例),就会有如下情况报错:
-
执行语句:
image.png - 报错信息:
Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.
Cause: java.sql.SQLException: 无效的列类型: 1111",
报错原因就是因为OTHER类型的字段值有空值/null的存在,如果jdbcType=VARCHAR就不会出现这种情况,所以我们就要把OTHER类型转变为VARCHAR;
- 方法:
修改generatorConfig.xml中的<table>配置:
<table tableName= "sys_async_task" delimitIdentifiers="true" delimitAllColumns="true" domainObjectName="SysAsyncTask" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<columnOverride column="bean_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="method_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="parameter_names" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="parameter_types" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="data_type" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="data_type_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="data_code" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="data_title" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="data_content" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_state" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_group_type" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_group_name" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_group_code" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_send_type" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_exc_hand" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_stop_interval" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="created_by" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="updated_by" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="arguments" javaType="java.lang.String" jdbcType="VARCHAR" />
<columnOverride column="at_stack_trace" javaType="java.lang.String" jdbcType="VARCHAR" />
</table>
-
生成mapper.xml样式:
image.png
这样就可正常使用逆向工程生成的文件了。
如果你比较了解逆向工程文件的配置,这些问题估计就迎刃而解,洒洒水一样简单,经过此次入坑后,可以增加自己的解决同种问题的思路,使自己更快更高效的发现问题并解决问题。希望本篇文档对大家有所帮助。
以上仅是个人观点,如表述有问题,请指出,共同进步!
网友评论