Java操作DB2 XML数据实践

简介:
自学了90分钟的DB2 XQuery,还不很熟悉,就要在项目中用了,心里很不踏实,还是先跑个CRUD的Demo看看,以免走弯路。
 
代码很粗糙,主要目的是看看JDBC是否能很好的执行这种新SQL,呵呵。
 
另外,在此之前,看到Oracle老大已经开始实现一个操作XML数据的规范,目前还没有正式出台,希望Sun能尽快跟进,将标准的API接口定出来,以支持广大的Java社区。项目有期限,我们也没时间等Sun给我们做好任何东西,自己动手实现吧。
 
下面是我做的一个Demo,希望能给正在研究这一块的朋友一点参考,XQuery SQL代码参考了DB2官方文档。
 
一、实现一个简单的数据库工具
import java.sql.*; 

/** 
* 简单的数据连接工具 
* File: DBUtils.java 
* User: leizhimin 
* Date: 2008-3-18 15:19:12 
*/
 
public  class DBUtils { 
     public  static  final String url =  "jdbc:db2://192.168.3.143:50000/lavasoft"; 
    public static final String username = "lavasoft"
    public static final String password = "lavasoftdb2"
    public static final String driverClassName = "com.ibm.db2.jcc.DB2Driver"

    /** 
     * 获取数据库连接Connection 
     * 
     * @return 数据库连接Connection 
     */
 
    public static Connection makeConnection() { 
        Connection conn = null
        try { 
            Class.forName(driverClassName); 
        } catch (ClassNotFoundException e) { 
            e.printStackTrace(); 
        } 
        try { 
            conn = DriverManager.getConnection(url, username, password); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
        return conn; 
    } 

    public static void main(String args[]) { 
        testConnection(); 
    } 

    /** 
     * 测试连接方法 
     */
 
    public static void testConnection() { 
        Connection conn = makeConnection(); 
        try { 
            Statement stmt = conn.createStatement(); 
            ResultSet rs = stmt.executeQuery("SELECT * FROM DM_HYML"); 
            while (rs.next()) { 
                String s1 = rs.getString(1); 
                String s2 = rs.getString(2); 
                System.out.println(s1 + s2); 
            } 
            rs.close(); 
            stmt.close(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } finally { 
            try { 
                conn.close(); 
            } catch (SQLException e) { 
                e.printStackTrace(); 
            } 
        } 
    } 
}
 
二、写一个简单的测试类执行各种XQuery SQL
 
import com.topsoft.icib.common.utils.DBUtils; 

import java.sql.*; 
import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.IOException; 

/** 
* DB2 XML数据操作测试 
* File: TestXMLDAO.java 
* User: leizhimin 
* Date: 2008-3-18 16:33:51 
*/
 
public  class TestDB2XML { 

     /** 
     * 预删除表Customer 
     * 
     * @throws SQLException 
     */
 
     public  static  void testDropXMLTable()  throws SQLException { 
        String drop_sql =  "DROP TABLE Customer"
        Connection conn = DBUtils.makeConnection(); 
        Statement stmt = conn.createStatement(); 
        stmt.executeUpdate(drop_sql); 
        stmt.close(); 
        conn.close(); 
    } 

     /** 
     * 创建表 
     * 
     * @throws SQLException 
     */
 
     public  static  void testCreateXMLTable()  throws SQLException { 
        String ct_sql =  "CREATE TABLE Customer (Cid BIGINT NOT NULL PRIMARY KEY, Info XML)"
        Connection conn = DBUtils.makeConnection(); 
        Statement stmt = conn.createStatement(); 
        stmt.executeUpdate(ct_sql); 
        stmt.close(); 
        conn.close(); 
    } 

     /** 
     * 插入数据 
     * 
     * @throws SQLException 
     * @throws IOException 
     */
 
     public  static  void testInsertXMLTable()  throws SQLException, IOException { 
        String xml =  "<customerinfo xmlns=\"http://posample.org\" Cid=\"1000\">\n" + 
                "<name>Robert Shoemaker</name>\n" + 
                "<addr country=\"Canada\">\n" + 
                "<street>1596 Baseline</street>\n" + 
                "<city>zhengzhou</city>\n" + 
                "<prov-state>Ontario</prov-state>\n" + 
                "<pcode-zip>N8X 7F8</pcode-zip>\n" + 
                "</addr>\n" + 
                "<phone type=\"work\">905-555-2937</phone>\n" + 
                "</customerinfo>"
        String ins_sql = "INSERT INTO CUSTOMER (CID, INFO) VALUES (1000, ?)"
        Connection conn = DBUtils.makeConnection(); 
        conn.setAutoCommit(false); 
        PreparedStatement pstmt = conn.prepareStatement(ins_sql); 
        byte[] b = xml.getBytes(); 
        InputStream ins = new ByteArrayInputStream(b); 
        pstmt.setBinaryStream(1, ins, b.length); 
        pstmt.executeUpdate(); 
        conn.commit(); 
        ins.close(); 
        pstmt.close(); 
        conn.close(); 
    } 

    /** 
     * XQuery查询数据 
     * 
     * @throws SQLException 
     */
 
    public static void testQueryXMLTable() throws SQLException { 
        String query_sql = "SELECT XMLQUERY (\n" + 
                "'declare default element namespace \"http://posample.org\";\n" + 
                "for $d in $doc/customerinfo\n" + 
                "return <out>{$d/name}</out>'\n" + 
                "passing INFO as \"doc\")\n" + 
                "FROM Customer as c\n" + 
                "WHERE XMLEXISTS ('declare default element namespace \"http://posample.org\";\n" + 
                "$i/customerinfo/addr[city=\"zhengzhou\"]' passing c.INFO as \"i\")"
        Connection conn = DBUtils.makeConnection(); 
        Statement stmt = conn.createStatement(); 
        ResultSet rs = stmt.executeQuery(query_sql); 
        StringBuffer xmls = new StringBuffer(); 
        while (rs.next()) { 
            xmls.append(rs.getString(1)).append("\n"); 
        } 
        System.out.println(xmls.toString()); 
        stmt.close(); 
        conn.close(); 
    } 

    /** 
     * XQuery更新数据 
     * 
     * @throws SQLException 
     * @throws IOException 
     */
 
    public static void testUpdateXMLTable() throws SQLException, IOException { 
        String xml = "<customerinfo xmlns=\"http://posample.org\" Cid=\"1002\">\n" + 
                "<name>Jim Noodle</name>\n" + 
                "<addr country=\"Canada\">\n" + 
                "<street>1150 Maple Drive</street>\n" + 
                "<city>Newtown</city>\n" + 
                "<prov-state>Ontario</prov-state>\n" + 
                "<pcode-zip>Z9Z 2P2</pcode-zip>\n" + 
                "</addr>\n" + 
                "<phone type=\"work\">905-555-7258</phone>\n" + 
                "</customerinfo>"
        String up_sql = "UPDATE customer SET info =?" + 
                "WHERE XMLEXISTS (\n" + 
                "'declare default element namespace \"http://posample.org\";\n" + 
                "$doc/customerinfo[@Cid = 1000]'\n" + 
                "passing INFO as \"doc\")"

        Connection conn = DBUtils.makeConnection(); 
        conn.setAutoCommit(false); 
        PreparedStatement pstmt = conn.prepareStatement(up_sql); 
        byte[] b = xml.getBytes(); 
        InputStream ins = new ByteArrayInputStream(b); 
        pstmt.setBinaryStream(1, ins, b.length); 
        pstmt.executeUpdate(); 
        conn.commit(); 
        ins.close(); 
        pstmt.close(); 
        conn.close(); 
    } 

    /** 
     * 查询xml列数据,用于验证 
     * 
     * @throws SQLException 
     */
 
    public static void testQueryXMLColumn() throws SQLException { 
        String query_sql = "SELECT INFO FROM Customer"
        Connection conn = DBUtils.makeConnection(); 
        Statement stmt = conn.createStatement(); 
        ResultSet rs = stmt.executeQuery(query_sql); 
        StringBuffer xmls = new StringBuffer(); 
        while (rs.next()) { 
            xmls.append(rs.getString(1)).append("\n"); 
        } 
        System.out.println(xmls.toString()); 
        stmt.close(); 
        conn.close(); 
    } 

    /** 
     * 测试入口,方法组调用 
     * 
     * @param rags 
     * @throws Exception 
     */
 
    public static void main(String rags[]) throws Exception { 
        testDropXMLTable(); 
        testCreateXMLTable(); 
        testInsertXMLTable(); 
        testQueryXMLTable(); 
        testUpdateXMLTable(); 
        testQueryXMLColumn(); 
    } 
}
 
三、运行结果
 
< out  xmlns ="http://posample.org" > < name >Robert Shoemaker </ name > </ out > 

< customerinfo  xmlns ="http://posample.org"  Cid ="1002" > < name >Jim Noodle </ name > < addr  country ="Canada" > < street >1150 Maple Drive </ street > < city >Newtown </ city > < prov-state >Ontario </ prov-state > < pcode-zip >Z9Z 2P2 </ pcode-zip > </ addr > < phone  type ="work" >905-555-7258 </ phone > </ customerinfo > 


Process finished with exit code 0 
 
呵呵,终于看到运行结果了。。。
 

本文转自 leizhimin 51CTO博客,原文链接:http://blog.51cto.com/lavasoft/66556,如需转载请自行联系原作者
相关文章
|
12天前
|
分布式计算 DataWorks Java
DataWorks操作报错合集之在使用MaxCompute的Java SDK创建函数时,出现找不到文件资源的情况,是BUG吗
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
26 0
|
1天前
|
SQL Java
java处理数据查看范围
java处理数据查看范围
|
1天前
|
Java API
Java操作elasticsearch
Java操作elasticsearch
7 0
|
1天前
|
NoSQL Java Redis
在Java中操作Redis
在Java中操作Redis
6 0
|
1天前
|
SQL Java 关系型数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
【JAVA基础篇教学】第十六篇:Java连接和操作MySQL数据库
|
1天前
|
Oracle 关系型数据库 Java
java操作多数据源将oracle数据同步达梦数据库
java操作多数据源将oracle数据同步达梦数据库
|
2天前
|
Java Android开发
java利用xml-rpc协议操作wordpress博客
java利用xml-rpc协议操作wordpress博客
|
2天前
|
XML 前端开发 数据格式
BeautifulSoup 是一个 Python 库,用于从 HTML 和 XML 文件中提取数据
BeautifulSoup 是 Python 的一个库,用于解析 HTML 和 XML 文件,即使在格式不规范的情况下也能有效工作。通过创建 BeautifulSoup 对象并使用方法如 find_all 和 get,可以方便地提取和查找文档中的信息。以下是一段示例代码,展示如何安装库、解析 HTML 数据以及打印段落、链接和特定类名的元素。BeautifulSoup 还支持更复杂的查询和文档修改功能。
8 1
|
2天前
|
XML JavaScript Java
详解Java解析XML的四种方法
详解Java解析XML的四种方法
|
3天前
|
SQL Java 数据库连接
Java数据库编程实践:连接与操作数据库
Java数据库编程实践:连接与操作数据库
9 0