ITPub博客

首页 > Linux操作系统 > Linux操作系统 > xml的数据存储(oracle)

xml的数据存储(oracle)

原创 Linux操作系统 作者:piliskys 时间:2008-01-12 00:00:00 0 删除 编辑
blog是越来越不想更新了,好像天天没什么新得,加之好的东西真是难写,天天做的事也只是一些重复琐碎之事,感觉没有记录的必要。但,人总是要做些事情,很多时候,简简单单才是真嘛,今天就补上一篇,技术含量不高,只是一思考问题的思路而以,希望对某些人能有所帮助。 最近忙于一些数据接口,采用xml文件进行交互,很多时候要将文件内容进行保存,其中感觉XML的字段与数据库中字段对应比较繁琐,因此想写一方法进行XML与数据库表对应的保存思路:XML文件格式如下,
xml version="1.0" encoding="GBK"?>
<rootVo>
<properties>
<!--身份证件号码-->
<cell name="idno" value=""/>
<!--纳税人姓名-->
<cell name="taxPayerName" value=""/>
<!--身份证件类型代码-->
<cell name="idtypecode" value=""/>
<!--县区局机关代码-->
<cell name="LevyOrgcode" value=""/>
<!--纳税人识别号-->
<cell name="TaxRegCode" value="11"/>
<!--企业名称-->
<cell name="EnterpriseName" value=""/>
properties>
<arrayList name="VoArrayList">
<vo>
<!--税目代码-->
<cell name="taxitemcode" value=""/>
<!--境内年所得额-->
<cell name="yearincomein" value=""/>
<!--境外年所得额-->
<cell name="yearincomeout" value=""/>
<!--应纳税额-->
<cell name="taxdue" value=""/>
<!--已缴(扣)税额-->
<cell name="taxpayed" value=""/>
<!--抵扣税额-->
<cell name="taxdeduct" value=""/>
<!--应补(退)税额-->
<cell name="TaxFinal" value=""/>
<!--税种代码-->
<cell name="taxtypecode" value=""/>
vo>
<vo>
<!--税目代码-->
<cell name="taxitemcode" value=""/>
<!--境内年所得额-->
<cell name="yearincomein" value=""/>
<!--境外年所得额-->
<cell name="yearincomeout" value=""/>
<!--应纳税额-->
<cell name="taxdue" value=""/>
<!--已缴(扣)税额-->
<cell name="taxpayed" value=""/>
<!--抵扣税额-->
<cell name="taxdeduct" value=""/>
<!--应补(退)税额-->
<cell name="TaxFinal" value=""/>
<!--税种代码-->
<cell name="taxtypecode" value=""/>
vo>
arrayList>
rootVo>
将XML中的内容转化为一Map,外层字段直接与Map对应,里层arrayList 中NAME作为MAP的KEY,LIST作为其中内容,LIST由XML内层的MAP组成,此方法代码将XML中的内容转化为一Map,外层字段直接与Map对应,里层arrayList 中NAME作为MAP的KEY,LIST作为其中内容,LIST由XML内层的MAP组成,此方法代码略~ 然后定义一方法, boolean storeMap(Map in, String tableName) 其中in中的key为全小写,与数据库对应, tableName为要插入的表名,如in中的key不在表字段中,进行忽略。代码如下:
/**
* 把map中的值保存入数据库,确保map中的key都是数据库字段,且全为小写
*
* @param in
* @param tableName 表名
* @return
* @throws SQLException
*/
public static boolean storeMap(Map in, String tableName) throws Exception {
String sqlcol = "SELECT case n" +
" when t.data_type= 'VARCHAR2' then 'String' n" +
" when t.data_type= 'DATE' then 'Timestamp' n" +
" when t.data_type= 'CHAR' then 'String' n" +
" when t.data_type= 'NUMBER' and nvl(t.DATA_SCALE,0)>0 then 'Double' n" +
" when t.data_type= 'NUMBER' and nvl(t.DATA_SCALE,0)=0 then 'Long' n" +
" when t.data_type= 'LONG' then 'Long' n" +
" else t.data_type end case , n" +
" nvl(t.DATA_SCALE,0) SCALE, n" +
" decode(t.DATA_TYPE,'DATE',21,'NUMBER',T.DATA_PRECISION,t.DATA_LENGTH) LENG, n" +
" lower(t.column_name) coll n" +
" n" +
" from user_tab_columns tn" +
" where t.TABLE_NAME = upper( '" + tableName + "' )";

try {
List colList = SqlQuery.perform(sqlcol);
Map colMap = new HashMap();
//初始化表字段对应的类型
for (int i = 0; i Map colone = (Map) colList.get(i);
colMap.put(colone.get("coll").toString(), colone.get("case").toString());
}
//拼出sql语句
StringBuffer mainsql = new StringBuffer();
mainsql.append("insert into " + tableName + "(");
StringBuffer valuesql = new StringBuffer();
valuesql.append(" values(");
Object[] inset = in.keySet().toArray();
for (int j = 0; j if (null != colMap.get(inset[j].toString().toLowerCase())) {
mainsql.append(inset[j] + ",");
valuesql.append("?,");
}
}

mainsql.delete(mainsql.length() - 1, mainsql.length());
valuesql.delete(valuesql.length() - 1, valuesql.length());
mainsql.append(")").append(valuesql).append(")");
//----------------------------拼sql完成
log.debug("mainsql=" + mainsql);
Connection connection;
try {
connection = //取得数据库联接
} catch (HibernateException e) {
throw new SQLException("取数据库连接出错!");
}

PreparedStatement pt = null;

pt = connection.prepareStatement(mainsql.toString());
int j = 0;
for (int i = 0; i
Object oj;
if (null != colMap.get(inset[i].toString().toLowerCase())) {
j++;
oj = getStoreObject(colMap.get(inset[i].toString().toLowerCase()).toString(), in.get(inset[i]));
pt.setObject(j, oj);
}
}

int flag = pt.executeUpdate();
connection.commit();
if (flag > 0)
return true;
else
return false;

} catch (SQLException e) {
log.debug("error=" + e);
throw new SQLException("取得表信息失败");
} catch (Exception e) {
throw new Exception(e);
}

}

/**
* 得到正确的返回类型值
*
* @param stype
* @param obj
* @return
*/
private static Object getStoreObject(String stype, Object obj) {
Object obj1;
if (null == obj || obj.toString().equals(""))
return null;
if (obj instanceof String) {
if (stype.equals("Timestamp")) {
if ((obj.toString().length()) > 12)
obj1 = TimeUtil.getTimeOfTimeStr(obj.toString(), "yyyy-MM-dd hh:mm:ss.0");
else
obj1 = TimeUtil.getTimeOfTimeStr(obj.toString(), "yyyy-MM-dd");
return obj1;
}
if (stype.equals("Long")) {
obj1 = Long.valueOf(obj.toString());

}
if (stype.equals("Double")) {
obj1 = Double.valueOf(obj.toString());

} else
obj1 = obj;
return obj1;
} else
return obj;

}程序比较简单,主要是通过MAP中的内容与数据库对比,拼出插入的SQL,且通过数据库表得到字段的类型。 OVER~~

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/134308/viewspace-140603/,如需转载,请注明出处,否则将追究法律责任。

上一篇: plsql随机数
请登录后发表评论 登录
全部评论

注册时间:2008-01-14

  • 博文量
    68
  • 访问量
    163647