关于MySQL Java Driver 的useOldAliasMetadataBehavior参数

来源:互联网 发布:mac系统支持steam吗 编辑:程序博客网 时间:2024/06/15 19:25

之前做的个人征信报送项目,需要从上游抽取数据。只是其他银行都用oracle或者DB2数据库,而这个银行用的mysql数据库,导致数据源获取不到。

以下是配置文件:

<executeUnit name="ImportPayPlan" describe="导入还款计划" allowManualExecute="true" executeClass="com.amarsoft.app.pbc.icr.dataimport.ICRImportUnit"><property name="unit.recordSet" value="datasource:ndb:icr_data:select * from ICR_PAYPLAN:etc/icr_are.xml:," /><property name="com.amarsoft.are.dpx.recordset.UpdateDBHandler.table" value="ICR_PAYPLAN" /><property name="com.amarsoft.are.dpx.recordset.UpdateDBHandler.keyColumns" value="AccountNo,PayDate" /><property name="com.amarsoft.are.dpx.recordset.UpdateDBHandler.checkDBRecord" value="true" /><property name="com.amarsoft.are.dpx.recordset.UpdateDBHandler.startSql" value="delete from ICR_PAYPLAN" /><property name="com.amarsoft.app.pbc.icr.dataimport.ICRDataSourceProvider.dataSource"value="datasource:db:icr139:select CP.PAY_LOAN_NUM as AccountNo{#贷款业务号}, CD.CURRENT_END_DATE as PayDate{#应还款日期},'' as PeriodpayDate{#宽限期最后一天},CD.CURRENT_PRINCIPAL as PayCorp{#应还本金},CD.CURRENT_INTEREST as PayInte{#应还利息},CD.pri_penalty_int as PayCorpFine{#应还本金罚息},CD.int_penalty_int as PayInteFine{#应还利息罚息},RL.REPAYING_DATE as ActualPayDate{#实际还款日期},CD.repayed_principal as ActualCorp{#实还本金},CD.repayed_interest as ActualInte{#实还利息},CD.repayed_pri_penalty_int as ActualCorpFine{#实还本金罚息},CD.repayed_int_penalty_int as ActualInteFine{#实还利息罚息},CD.STATUS as PayOffStatus{#本期结清标志}from CREDIT_REPAYING_PLAN_DETAIL CDinner join CREDIT_REPAYING_PLAN CP on CP.REPAYING_PLAN_ID = CD.REPAYING_PLAN_IDinner join CREDIT_REPAYING_DETAIL RD on RD.REPAYING_PLAN_DETAIL_ID = CD.REPAYING_PLAN_DETAIL_IDinner join REPAY_LOAN RL on RL.REPAY_LOAN_ID = RD.REPAY_LOAN_IDwhere (CD.STATUS <> '2' and CD.CURRENT_END_DATE < '{$ARE.startDate}') or (CD.CURRENT_END_DATE >= '{$ARE.startDate}' and CD.CURRENT_END_DATE <= '{$ARE.endDate}')" /></executeUnit>

后来发现,只有当前面的字段名改成固定值,比如

select '35462346732' as AccountNo{#贷款业务号}
才能获取到数据。


进一步发现,数据源获取的不是别名,而是前面的字段名,无法匹配我们的表结构,导致数据源为空。

问题反馈给公司支持中心,发来邮件,可使用useOldAliasMetadataBehavior参数,数据库配置文件如下:

<resource type="jdbc" encrypt="false" name="icr139"><driver>com.mysql.jdbc.Driver</driver><url>jdbc:mysql://115.159.0.139:4001/db_icr?useOldAliasMetadataBehavior=true</url><!-- url="jdbc:mysql://10.0.100.19:4001/db_tafa" 115.159.0.139/> --><user>ht_release</user><password>gFY44zRyXc</password><logWriter>system.err</logWriter><loginTimeout>0</loginTimeout><maxActive>20</maxActive><maxIdle>20</maxIdle><maxWait>3000</maxWait></resource>

问题完美解决!


注意事项:

1、对于5.1.6版本,亲测useOldAliasMetadataBehavior这个参数不起作用,对于5.1.32版本,working,所以先检查驱动版本。

2、useOldAliasMetadataBehavior这个参数的意思是,使用别名作为返回的key的名称,如select id as 'ID' from dual,使用ID而不是id。

3、如此MyBatis才会working的更好

4、如果你用apache DbUtils,最好设置上这个对数,对于spring JdbcTemplate没测过。

0 0