工作笔记1 将Oracle数据转换到标准格式的sqlite文件中

前言

在工作中遇到这样 的问题,要将OA 中存储的数据取出,同时将该数据写入到sqlite数据库中。

OA中的数据信息如图所示,将数据内容取出同时,要根据该字段对应的字段名称写入到另一个sqlite数据库中,目标生成的sqlite数据库的db文件如图:

准备工作:OA上要有相关的标准内容同时要先创建好sqlite数据库中的相关字段内容,具体方法暂时先不做赘述。要想实现将OA(Oracle) 数据按sqlite标准生成对应的db文件,大体思路如下;

解决思路:

具体实现与部分代码

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文件后还需要进行加密与压缩,具体形式见 下一篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以按照以下步骤将读取csv文件数据导入SQLite: 1. 打开CSV文件并读取数据。可以使用Python的csv模块或者pandas模块来读取CSV文件数据。 2. 连接到SQLite数据库。可以使用Pythonsqlite3模块来连接到SQLite数据库。 3. 创建表格。根据CSV文件数据结构,在SQLite数据创建一个表格来存储数据。 4. 将CSV文件数据插入到SQLite表格。使用INSERT INTO语句将CSV文件数据插入到SQLite表格。 以下是Python代码示例: ```python import csv import sqlite3 import pandas as pd # 打开CSV文件并读取数据 with open('data.csv', 'r') as csv_file: csv_reader = csv.reader(csv_file) data = [row for row in csv_reader] # 连接到SQLite数据库 conn = sqlite3.connect('data.db') c = conn.cursor() # 创建表格 c.execute('''CREATE TABLE IF NOT EXISTS my_table (id INTEGER PRIMARY KEY, name TEXT, age INTEGER, city TEXT)''') # 将CSV文件数据插入到SQLite表格 for row in data: c.execute("INSERT INTO my_table (name, age, city) VALUES (?, ?, ?)", (row[0], row[1], row[2])) # 提交更改并关闭连接 conn.commit() conn.close() ``` 另外,如果你使用pandas模块来读取CSV文件数据,可以使用to_sql()方法将数据直接导入到SQLite数据,如下所示: ```python import pandas as pd import sqlite3 # 读取CSV文件数据 data = pd.read_csv('data.csv') # 连接到SQLite数据库 conn = sqlite3.connect('data.db') # 将数据导入到SQLite数据 data.to_sql('my_table', conn, if_exists='replace', index=False) # 关闭连接 conn.close() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值