【数据采集】关于接口中遇到的问题

一、连接SQL Server数据库

  • 连接sql Server数据库需要导入sqljdbc.jar包。
  • 使用com.microsoft.sqlserver.jdbc.SQLServerDriver驱动。
  • 连接数据库url为jdbc:sqlserver:localhost:1433;DatabaseName=student

二、对JDBC执行结果的遍历与判断

--------参考 execute、executeUpdate、executeQuery三者的区别(及返回值)

1、boolean execute(String sql)

允许执行查询语句、更新语句、DDL语句。

返回值为true时,表示执行的是查询语句,可以通过getResultSet方法获取结果;返回值为false时,执行的是更新语句或DDL语句,getUpdateCount方法获取更新的记录数量。

public static void main(String[] args) {  
    Connection conn = null;  
    Statement stm = null;  
    ResultSet rs = null;  
    try {  
         Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
         conn = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=Test;user=sa;password=sasa");  
         stm = conn.createStatement();  
         boolean ret = stm.execute("select * from stuinfo");  
         if(ret){  
             rs = stm.getResultSet();  
             while(rs.next()){  
                 System.out.println("姓名:"+rs.getString("stuName")+"\t年龄:"+rs.getString("stuScore"));  
             }  
         }  
         ret = stm.execute("update stuinfo set stuScore=62 where stuname='张三'");  
         int count = stm.getUpdateCount();  
         if(!ret){  
             System.out.println(count+"条数据修改成功!");  
         }  
    } catch (ClassNotFoundException e) {  
         e.printStackTrace();  
    } catch (SQLException e) {  
         e.printStackTrace();  
    }    
 }
2、int executeUpdate(String sql)

执行给定 SQL 语句,该语句可能为 INSERT、UPDATE 或 DELETE 语句,或者不返回任何内容的 SQL 语句(如 SQL DDL 语句)。

返回值是更新的记录数量。0是没有更新,大于0是更新数量。

3、ResultSet executeQuery(String sql)

执行给定的 SQL 语句,该语句返回单个 ResultSet 对象。

【execute是executeUpdate与executeQuery的综合。】

三、使用UUID生成SM4密钥

  • UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。UUID 是指通用唯一识别码(Universally Unique Identifier)。
  • SM4密钥长度为16个字节。

使用UUID生成SM4密钥的代码如下:

UUID.randomUUID().toString().replace("-", "").toLowerCase().substring(0, 16)

四、SM2加密密文byte[]与String转换问题

SM2使用公钥加密后,生成byte[]类型的密文,转换为String类型并不能直接用过toString()方法,应该使用Base64编码后转为String,具体代码如下:

    byte[] encryptKey = new byte[100000];
    String encKey = "";
    try {
        encryptKey = SM2Utils.encrypt(Base64.decode(DataConstant.PUBKS.getBytes()), sm4.getSecretKey().getBytes());
        encKey = new String(Base64.encode(encryptKey));
        System.out.println("SM4加密后密钥:"+encKey);
    } catch (IOException e) {
        e.printStackTrace();
    }

解密时也应先使用Base64解码后,再使用SM2的私钥解密。

    String decKey = new String(SM2Utils.decrypt(Base64.decode(prikS.getBytes()), Base64.decode(encKey.getBytes())));

五、解析XML格式的字符串

需求为解密文件内容后,将数据封装为指定格式。

String xmlDoc=“<table><record><numsourceid>31231415</numsourceid><hospital_code>42507230900</hospital_code><update_time>2018-09-12 00:00:00.0</update_time><create_time>2018-09-12 00:00:00.0</create_time><release_time>2018-09-12 00:00:00.0</release_time><end_time>2018-09-12 00:00:00.0</end_time><ordernumtype>1</ordernumtype><is_special>1</is_special><source_status>1</source_status><is_advantage>1</is_advantage><advantage_abort_time>2018-09-12 00:00:00.0</advantage_abort_time><is_temporary>1</is_temporary><dept1id>2356</dept1id><dept1name>内科</dept1name><dept2id>11231</dept2id><dept2name>胸内科</dept2name><dept_shenkang_id>12414</dept_shenkang_id><doctorid>312313</doctorid><doctor_name>陈XX</doctor_name><doctor_level>2</doctor_level><start_date>2018-09-12 00:00:00.0</start_date><end_date>2018-09-12 00:00:00.0</end_date><schedule_status>2</schedule_status><is_changediagtag>1</is_changediagtag><visit_cost>6.00</visit_cost><schedule_update_time>2018-09-12 00:00:00.0</schedule_update_time></record></table>”

public String xmlElements(String xmlDoc) {

        StringBuffer datastr = null;
        //删除字符串中的换行符
        if (xmlDoc!=null && !xmlDoc.equals("")) {
            Pattern p = Pattern.compile("\r|\n");
            Matcher m = p.matcher(xmlDoc);
            xmlDoc = m.replaceAll("");
        }

        StringReader read = new StringReader(xmlDoc);
        //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
        InputSource source = new InputSource(read);
        //创建一个新的SAXBuilder
        SAXBuilder sb = new SAXBuilder();
        try {
            //通过输入源构造一个Document
            Document doc = sb.build(source);

            //取的根元素<table>
            Element root = doc.getRootElement();

            //得到根元素所有子元素的集合<record>
            List recordList = root.getChildren();

            //获得XML中的命名空间(XML中未定义可不写)
            Namespace ns = root.getNamespace();

            datastr =new StringBuffer();
           
            for(int i=0;i<recordList.size();i++){
                Element et = (Element) recordList.get(i);//循环依次得到子元素
                //依次获取单个<record>标签
                List childElement = et.getChildren();
                //遍历<record>中子元素
                for (int j = 0; j < childElement.size(); j++) {
                    Element child = (Element)childElement.get(j);
                    String str = child.getText();
                    if(j != childElement.size()-1){
                        str += "!@!";
                    }
                    datastr.append(str);
                }
                datastr.append("^&^");
               
            }
           System.out.println(datastr);
            
        } catch (JDOMException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        } catch (IOException e) {
            // TODO 自动生成 catch 块
            e.printStackTrace();
        }    
        return datastr.toString();
    }

/*
输出结果:
31231415!@!42507230900!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!1!@!1!@!1!@!1!@!2018-09-12 00:00:00.0!@!1!@!2356!@!内科!@!11231!@!胸内科!@!12414!@!312313!@!陈XX!@!2!@!2018-09-12 00:00:00.0!@!2018-09-12 00:00:00.0!@!2!@!1!@!6.00!@!2018-09-12 00:00:00.0^&^
*/
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容