这个小东西设计很简单,就是用java的反射原理。因为有各种各样的文件接口要做,所以就想做一个通用型的。即将数据先入中间表,然后再通过程序将数据写入文件。
1 使用的实体类package com.ai.fileupload;public class ReportFileRecord {
public String field_1;
public String field_10;
public String field_11;
public String field_12;
public String field_13;
public String field_14;
public String field_15;
public String field_16;
public String field_17;
public String field_18;
public String field_19;
public String field_2;
public String field_20;
public String field_21;
public String field_22;
public String field_23;
public String field_24;
public String field_25;
public String field_26;
public String field_27;
public String field_28;
public String field_29;
public String field_3;
public String field_30;
public String field_31;
public String field_32;
public String field_33;
public String field_4;
public String field_5;
public String field_6;
public String field_7;
public String field_8;
public String field_9; public String getField_1() {
return field_1;
} public String getField_10() {
return field_10;
} public String getField_11() {
return field_11;
} public String getField_12() {
return field_12;
} public String getField_13() {
return field_13;
} public String getField_14() {
return field_14;
} public String getField_15() {
return field_15;
} public String getField_16() {
return field_16;
} public String getField_17() {
return field_17;
} public String getField_18() {
return field_18;
} public String getField_19() {
return field_19;
} public String getField_2() {
return field_2;
} public String getField_20() {
return field_20;
} public String getField_21() {
return field_21;
} public String getField_22() {
return field_22;
} public String getField_23() {
return field_23;
} public String getField_24() {
return field_24;
} public String getField_25() {
return field_25;
} public String getField_26() {
return field_26;
} public String getField_27() {
return field_27;
} public String getField_28() {
return field_28;
} public String getField_29() {
return field_29;
} public String getField_3() {
return field_3;
} public String getField_30() {
return field_30;
} public String getField_31() {
return field_31;
} public String getField_32() {
return field_32;
} public String getField_33() {
return field_33;
} public String getField_4() {
return field_4;
} public String getField_5() {
return field_5;
} public String getField_6() {
return field_6;
} public String getField_7() {
return field_7;
} public String getField_8() {
return field_8;
} public String getField_9() {
return field_9;
} public void setField_1(String field_1) {
this.field_1 = field_1;
} public void setField_10(String field_10) {
this.field_10 = field_10;
} public void setField_11(String field_11) {
this.field_11 = field_11;
} public void setField_12(String field_12) {
this.field_12 = field_12;
} public void setField_13(String field_13) {
this.field_13 = field_13;
} public void setField_14(String field_14) {
this.field_14 = field_14;
} public void setField_15(String field_15) {
this.field_15 = field_15;
} public void setField_16(String field_16) {
this.field_16 = field_16;
} public void setField_17(String field_17) {
this.field_17 = field_17;
} public void setField_18(String field_18) {
this.field_18 = field_18;
} public void setField_19(String field_19) {
this.field_19 = field_19;
} public void setField_2(String field_2) {
this.field_2 = field_2;
} public void setField_20(String field_20) {
this.field_20 = field_20;
} public void setField_21(String field_21) {
this.field_21 = field_21;
} public void setField_22(String field_22) {
this.field_22 = field_22;
} public void setField_23(String field_23) {
this.field_23 = field_23;
} public void setField_24(String field_24) {
this.field_24 = field_24;
} public void setField_25(String field_25) {
this.field_25 = field_25;
} public void setField_26(String field_26) {
this.field_26 = field_26;
} public void setField_27(String field_27) {
this.field_27 = field_27;
} public void setField_28(String field_28) {
this.field_28 = field_28;
} public void setField_29(String field_29) {
this.field_29 = field_29;
} public void setField_3(String field_3) {
this.field_3 = field_3;
} public void setField_30(String field_30) {
this.field_30 = field_30;
} public void setField_31(String field_31) {
this.field_31 = field_31;
} public void setField_32(String field_32) {
this.field_32 = field_32;
} public void setField_33(String field_33) {
this.field_33 = field_33;
} public void setField_4(String field_4) {
this.field_4 = field_4;
} public void setField_5(String field_5) {
this.field_5 = field_5;
} public void setField_6(String field_6) {
this.field_6 = field_6;
} public void setField_7(String field_7) {
this.field_7 = field_7;
} public void setField_8(String field_8) {
this.field_8 = field_8;
} public void setField_9(String field_9) {
this.field_9 = field_9;
}
}2 db配置

解决方案 »

  1.   

    基本就是通过每一个字段配置组装一个sql,然后再执行这个sql。

    public List<ReportFileRecord> getreFileRecords(String sql) {
    return this.getSqlMapClientTemplate().queryForList(
    "files.getreFileRecords", sql);
    }sql形式如下select main_prov            as field_1,service_code         as field_2,service_name         as field_3,corp_code            as field_4,corp_name            as field_5,code_type            as field_6,code_run_prov        as field_7,code_run_type        as field_8,result_status        as field_9 from file_int_1092 a where  a.deal_frequency='DAY'这样问题就来了。之前只有一个文件配置的时候没有问题。但当配置了多个的时候,因为每个表的字段数不同,比如如果第一次执行的是个9个字段的值,第二个文件有10个字段,则生成第二个文件的时候,第10个字段就取不到值。而如果第一次执行的是9个字段,而第二个是8个字段,则又会报“Check the result mapping for the 'field_10' property”的错误,找不到第10个字段。
      

  2.   

    报错应该是“Check the result mapping for the 'field_9' property”的错误,找不到第9个字段。
      

  3.   

    [2011-11-02 10:04:43] [Connection] [DEBUG] : {conn-100054} Preparing Statement:   select eoms_flow_no         as field_1,flow_no              as field_2,accept_time          as field_3,send_limit           as field_4,desc_type            as field_5,accept_area          as field_6,service_no           as field_7,vip_level            as field_8,user_brand           as field_9,accept_detail        as field_10,repeat_type          as field_11,complain_type        as field_12,complain_county      as field_13,complain_area        as field_14,cover_scene          as field_15,longitude            as field_16,latitude             as field_17,term_type            as field_18,sp_code              as field_19,service_code         as field_20,group_id             as field_21,group_name           as field_22,group_type           as field_23,deal_content         as field_24,duty_cause           as field_25,eoms_deal_content    as field_26,eoms_duty_cause      as field_27,resolve_type         as field_28,deal_op              as field_29,deal_status          as field_30,archive_time         as field_31,full_type            as field_32,audit_type           as field_33 from file_int_eoms_003 a where  a.deal_frequency='DAY'  :main
    [2011-11-02 10:04:43] [PreparedStatement] [DEBUG] : {pstm-100055} Executing Statement:   select eoms_flow_no         as field_1,flow_no              as field_2,accept_time          as field_3,send_limit           as field_4,desc_type            as field_5,accept_area          as field_6,service_no           as field_7,vip_level            as field_8,user_brand           as field_9,accept_detail        as field_10,repeat_type          as field_11,complain_type        as field_12,complain_county      as field_13,complain_area        as field_14,cover_scene          as field_15,longitude            as field_16,latitude             as field_17,term_type            as field_18,sp_code              as field_19,service_code         as field_20,group_id             as field_21,group_name           as field_22,group_type           as field_23,deal_content         as field_24,duty_cause           as field_25,eoms_deal_content    as field_26,eoms_duty_cause      as field_27,resolve_type         as field_28,deal_op              as field_29,deal_status          as field_30,archive_time         as field_31,full_type            as field_32,audit_type           as field_33 from file_int_eoms_003 a where  a.deal_frequency='DAY'  :main
    [2011-11-02 10:04:43] [PreparedStatement] [DEBUG] : {pstm-100055} Parameters: []:main
    [2011-11-02 10:04:43] [PreparedStatement] [DEBUG] : {pstm-100055} Types: []:main
    [2011-11-02 10:04:43] [ResultSet] [DEBUG] : {rset-100056} ResultSet:main
    [2011-11-02 10:04:43] [ResultSet] [DEBUG] : {rset-100056} Header: [FIELD_1, FIELD_2, FIELD_3, FIELD_4, FIELD_5, FIELD_6, FIELD_7, FIELD_8, FIELD_9, FIELD_10, FIELD_11, FIELD_12, FIELD_13, FIELD_14, FIELD_15, FIELD_16, FIELD_17, FIELD_18, FIELD_19, FIELD_20, FIELD_21, FIELD_22]:main
    [2011-11-02 10:04:43] [ResultSet] [DEBUG] : {rset-100056} Result: [$, 201104230910731, 2011-04-23 21:15:11, 2011-05-03 21:15:11, 010101010102, 888, 13984869269, 0, 5, 1、故障地点:宝山南路金融巷 2、故障时间:近一段时间 3、手机信号:“无” 4、拨号提示音:仅限紧急呼叫 5、周围客户使用情况:“不正常” 6、是否有重新开机关机测试:“有”7、换机换卡情况:卡在别人手机上“不能用”;手机插上别人的卡“不能用” 8、是否重复投诉:“不是”;  10、具体故障描述:用户表示在住宅室内手机上直接无信号显示,无法正常实使用手机,请核实(专席), 否, $, 0, 宝山南路金融巷, $, $, $, -, 0, $, 0, null]:main
    [2011-11-02 10:04:43] [ReportServiceImpl] [DEBUG] : 获取记录行数为 1:main
    [2011-11-02 10:04:43] [ReportServiceImpl] [DEBUG] : 判断行间分隔符是否为回车true:main
    -------------------------------------------
    命名sql里边有33个字段的,resultSet里边却只有22个。
      

  4.   

    [2011-11-02 17:27:43] [Connection] [DEBUG] : {conn-100021} Preparing Statement:   select main_prov            as field_1,service_code         as field_2,service_name         as field_3,corp_code            as field_4,corp_name            as field_5,code_type            as field_6,code_run_prov        as field_7,code_run_type        as field_8,result_status        as field_9 from file_int_1092 a where  a.deal_frequency='DAY'  :main
    [2011-11-02 17:27:43] [PreparedStatement] [DEBUG] : {pstm-100022} Executing Statement:   select main_prov            as field_1,service_code         as field_2,service_name         as field_3,corp_code            as field_4,corp_name            as field_5,code_type            as field_6,code_run_prov        as field_7,code_run_type        as field_8,result_status        as field_9 from file_int_1092 a where  a.deal_frequency='DAY'  :main
    [2011-11-02 17:27:43] [PreparedStatement] [DEBUG] : {pstm-100022} Parameters: []:main
    [2011-11-02 17:27:43] [PreparedStatement] [DEBUG] : {pstm-100022} Types: []:main
    [2011-11-02 17:27:43] [SqlExecutor] [DEBUG] : execute ps is org.apache.commons.dbcp.DelegatingPreparedStatement@123a389:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : {rset-100023} ResultSet:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    [2011-11-02 17:27:43] [ResultSet] [DEBUG] : 通过日志代理打印日志:main
    Exception in thread "main" org.springframework.jdbc.BadSqlGrammarException: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:   
    --- The error occurred in conf/ibatis/ibatis-files.xml.  
    --- The error occurred while applying a result map.  
    --- Check the files.getreFileRecords-AutoResultMap.  
    --- Check the result mapping for the 'field_10' property.  
    --- Cause: java.sql.SQLException: 列名无效
    Caused by: com.ibatis.common.jdbc.exception.NestedSQLException:   
    --- The error occurred in conf/ibatis/ibatis-files.xml.  
    --- The error occurred while applying a result map.  
    --- Check the files.getreFileRecords-AutoResultMap.  
    --- Check the result mapping for the 'field_10' property.  
    --- Cause: java.sql.SQLException: 列名无效
    at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:239)
    at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryForList(MappedStatement.java:158)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:567)
    at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForList(SqlMapExecutorDelegate.java:541)
    at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForList(SqlMapSessionImpl.java:118)
    at org.springframework.orm.ibatis.SqlMapClientTemplate$3.doInSqlMapClient(SqlMapClientTemplate.java:268)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:193)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:219)
    at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:266)
    at com.ai.fileupload.dao.ibatis.UploadFilesDaoImpl.getreFileRecords(UploadFilesDaoImpl.java:36)
    at com.ai.fileupload.service.impl.ReportServiceImpl.getReportFileRecords(ReportServiceImpl.java:86)
    at com.ai.fileupload.service.impl.ReportServiceImpl.dealFile(ReportServiceImpl.java:335)
    at com.ai.fileupload.service.impl.ReportServiceImpl.generateFiles(ReportServiceImpl.java:158)
    at com.ai.fileupload.DoReportFiles.main(DoReportFiles.java:22)
    Caused by: java.sql.SQLException: 列名无效
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3661)
    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2575)
    at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:424)
    at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:224)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.ibatis.common.jdbc.logging.ResultSetLogProxy.invoke(ResultSetLogProxy.java:48)
    at $Proxy2.getString(Unknown Source)
    at com.ibatis.sqlmap.engine.type.StringTypeHandler.getResult(StringTypeHandler.java:35)
    at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getPrimitiveResultMappingValue(ResultMap.java:619)
    at com.ibatis.sqlmap.engine.mapping.result.ResultMap.getResults(ResultMap.java:345)
    at com.ibatis.sqlmap.engine.mapping.result.AutoResultMap.getResults(AutoResultMap.java:47)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:476)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:376)
    at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:231)
    at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteQuery(MappedStatement.java:269)
    at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeQueryWithCallback(MappedStatement.java:225)
    ... 13 more
      

  5.   

    又得自问自答了,对ibatis理解不是太深。最后针对一个实体类与多个数据表映射这种情况,用了最原始的jdbc来处理。