前言
在工作中遇到这样 的问题,要将OA 中存储的数据取出,同时将该数据写入到sqlite数据库中。
![](https://img-blog.csdnimg.cn/img_convert/dbefc4c2812b4cb3a7bc3f5d0b40cb1f.png)
OA中的数据信息如图所示,将数据内容取出同时,要根据该字段对应的字段名称写入到另一个sqlite数据库中,目标生成的sqlite数据库的db文件如图:
![](https://img-blog.csdnimg.cn/img_convert/1b24db4404e449a7a96619c4d814f4e2.png)
准备工作:OA上要有相关的标准内容同时要先创建好sqlite数据库中的相关字段内容,具体方法暂时先不做赘述。要想实现将OA(Oracle) 数据按sqlite标准生成对应的db文件,大体思路如下;
解决思路:
![](https://img-blog.csdnimg.cn/img_convert/e262e0b38e2047eda806b95fd735a4fb.png)
具体实现与部分代码
Step1 的部分代码如下(使用Mybatis获取OA数据存到Map_OA中作为返回值):
public static Map<String,String> getOADataToMap(String id) throws Exception {
Map<String,String> mapOA = new HashMap();
SqlSessionFactory sqlSessionFactory
=new SqlSessionFactoryBuilder().build
( Resources.getResourceAsReader("Config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
String statement="ds.orm.crud.selectOAData";
mapOA =sqlSession.selectOne(statement,id);
sqlSession.close();
return mapOA;
}
Step2 的部分代码如下(直接使用DOM4J获取标准xml文件的数据存到Map_Stand中作为返回值):
public static Document load(String filename) {
Document document = null;
try {
SAXReader saxReader = new SAXReader();
document = saxReader.read(new File(filename)); // 读取XML文件,获得document对象
} catch (Exception ex) {
ex.printStackTrace();
}
return document;
}
public static Map<String, String> xmlInfor(String path, String fileName) {
// TODO Auto-generated method stub
// String path = "D:\\dbdata\\0054tzgl\\";
// String fileName = "invProjInforIndx.xml";
Document document = load(path + fileName);
Element root = document.getRootElement();
//子节点
List<Element> childElements = root.elements();
Map<String, String> mapEle = new HashMap<String, String>();
String name;
String value;
for (Element child : childElements) {
value = child.getText();
name = child.getName();
mapEle.put(name, value);
// System.out.println(name+" ---- "+value);
}
return mapEle;
}
public static void main(String[] args) {
String path = "D:\\dbdata\\zzjg\\";
String fileName = "zzjg_dwxx.xml";
Map<String, String> mapStand = new HashMap<String, String>();
mapStand = xmlInfor(path, fileName);
String name;
String value;
// 遍历子节点
for (String key : mapStand.keySet()) {
System.out.println("mapStand.key= " + key + " and value= " + mapStand.get(key));
}
}
Step3 的部分代码如下(将MapOA & MapStand 整合为 MapRes)
遍历MapStand的 key,将 MapStand 的key对应的value作为 MapRes的key,将 MapStand 的keyMapOA的key并查询 对应value作为 MapRes的value 。
public static Map<String,String> getMapRes(Map<String, String> mapStand,Map<String, String> mapOA){
String resKey="" ; String resVal="";
Map<String, String> mapRes = new HashMap<String, String>();
for(Map.Entry entry : mapStand.entrySet()){
String mapKey = (String) entry.getKey();
String mapValue = (String)entry.getValue();
resKey = String.valueOf(mapValue) ; resVal = String.valueOf(mapOA.get(mapKey)) ;
mapRes.put(resKey, resVal) ;
//java.lang.String are in module java.base of loader 'bootstrap'
System.out.println(resKey+":"+resVal);
}
return mapRes ;
}
遇见报错:
class java.math.BigDecimal cannot be cast to class java.lang.String (java.math.BigDecimal and java.lang.String are in module java.base of loader 'bootstrap')
解决方法 : 注意 valueOf & toString 使用区别
Step4 遍历 MapRes ,并将其KV对 作为输入更新已有的db文件
update hadwn_rest_gathr_tab_011 set
data_contt ='ceshi '
where lin_flag = 50300522230301 and indx_nm = '单位名称'
上述测试SQL中 data_contt 对应的值 (ceshi)就是 MapRes的value ,indx_nm对应的值 '单位名称' 就是 MapRes 的key 。其他的表名(hadwn_rest_gathr_tab_011),lin_flag(50300522230301)可以暂时看做固定值 。 部分测试代码 如下:
//connect to special path sqlite-db,and upadte it
public static void updatedb(String dbPath,String dbName,String tableName,Map<String,String> mapDb) throws Exception {
String db=dbPath+dbName;
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:" + db);
Statement state = conn.createStatement();
//hadwn_rest_gathr_tab_007,data_contt,indx_id
String value;
String indx_nm;
for (String key : mapDb.keySet()) {
indx_nm=key;
value=mapDb.get(key);
String updateSql="update "+tableName+" set data_contt ='"+value+
"' where lin_flag = 50300522230301 and indx_nm ='"+indx_nm +"'";
System.out.println("key= " + key + " and value= " + value);
System.out.println("updateSql: "+updateSql);
boolean rs = state.execute(updateSql);
// rs.close();
}
conn.close();
}
将上述代码中 输入参数的 mapDb 替换为之前生成的 MapRes 即可。
整体测试代码如下:
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Map<String, String> mapStand = new HashMap<String, String>();
Map<String, String> mapOA = new HashMap<String, String>();
Map<String, String> mapRes = new HashMap<String, String>();
SqlSessionFactory sqlSessionFactory
=new SqlSessionFactoryBuilder().build
( Resources.getResourceAsReader("Config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
String statement="ds.orm.crud.selectOAData";
// 此次手动更新 OA 中的ID查询生成对应 mapOA
mapOA =sqlSession.selectOne(statement,"1");
// System.out.println(mapOA.toString());
String path = "D:\\dbdata\\zzjg\\";
String fileName = "zzjg_dwxx.xml";
GetDomData domData = new GetDomData();
mapStand = domData.xmlInfor(path, fileName);
// System.out.println(mapStand.toString());
mapRes = getMapRes(mapStand,mapOA) ;
// System.out.println(getMapRes(mapStand,mapOA).toString());
String dbpath="D:\\dbdata\\zzjg\\2023\\202303\\";
String dbName="913400000803136982_0044_1001_20230314.db";
String tableName="hadwn_rest_gathr_tab_011";
UpdateDB dbRes = new UpdateDB() ;
dbRes.updatedb(dbpath, dbName, tableName, mapRes);
}
补充
目前先手动更新生成mapOA 时 仍然是通过手动更新 ID的方式。主要是因为要生成标准格式的db文件,需要有母公司信息,之后再新增 data_contt 的数据为空的信息。后期进行统一优化,部分代码如下
public static void apply(String oaId) throws Exception {
// TODO Auto-generated method stub
Map<String, String> mapStand = new HashMap<String, String>();
Map<String, String> mapOA = new HashMap<String, String>();
Map<String, String> mapRes = new HashMap<String, String>();
SqlSessionFactory sqlSessionFactory
=new SqlSessionFactoryBuilder().build
( Resources.getResourceAsReader("Config.xml"));
SqlSession sqlSession = sqlSessionFactory.openSession();
String statement="ds.orm.crud.selectOAData";
// 此次手动更新 OA 中的ID查询生成对应 mapOA
// String oaId = "10";
mapOA =sqlSession.selectOne(statement,oaId);
// System.out.println(mapOA.toString());
String path = "D:\\dbdata\\zzjg\\";
String fileName = "zzjg_dwxx.xml";
GetDomData domData = new GetDomData();
mapStand = domData.xmlInfor(path, fileName);
// System.out.println(mapStand.toString());
mapRes = getMapRes(mapStand,mapOA) ;
System.out.println(mapRes.toString());
String dbpath="D:\\dbdata\\zzjg\\2023\\202303\\";
String dbName="913400000803136982_0044_1001_20230314.db";
String tableName="hadwn_rest_gathr_tab_011";
CrudDB dbRes = new CrudDB() ;
String tempId = "0"+oaId ;
tempId = tempId.substring(tempId.length()-2, tempId.length()) ;
String lin_flag = "503005222303"+tempId ;
dbRes.insertdb(dbpath, dbName, tableName, lin_flag);
dbRes.updatedb(dbpath, dbName, tableName, mapRes,lin_flag);
}
生成标准名称与格式的DB文件后还需要进行加密与压缩,具体形式见 下一篇文章 。