使用JDBC读取和插入XMLTYPE类型的数据库字段

news/2024/5/19 0:49:19 标签: jdbc, 数据库, exception, string, null, query
 
通过JDBC读取和插入XMLTYPE类型字段
 
package com.xxxxxxt.xxk.xmltype;
 
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
 
import oracle.jdbc.OracleResultSet;
import oracle.otnsamples.eis.DBConException;
import oracle.otnsamples.eis.DBException;
import oracle.sql.CLOB;
import oracle.sql.OPAQUE;
import oracle.xdb.XMLType;
 
/**
 * -- Create table
 *
 * @version0.1 create table T_XMLTYPE ( C_XMLTYP xmltype ) ;
 *
 * @author Administrator
 *
 */
public class TestXMLType {
 
       public static void main(String[] args) {
 
              ArrayList param = new ArrayList();
              StringBuffer str = new StringBuffer("");
 
              str.append("INSERT INTO T_XMLTYPE");
              str.append("(C_XMLTYP)");
              str.append("values(sys.XMLTYPE.createXML(?))");
 
              StringBuffer xmlnews = new StringBuffer();
 
              xmlnews
                            .append("<NewsItem xmlns=/"http://www.oracle.com/NewsItem.xsd/"");
              xmlnews
                            .append(" xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/"");
              xmlnews
                            .append(" xsi:schemaLocation=/"http://www.oracle.com/NewsItem.xsd ");
              xmlnews.append(" http://www.oracle.com/NewsItem.xsd/">");
              xmlnews.append("<title>");
              xmlnews.append("标题");
              xmlnews.append("</title>");
              xmlnews.append("<description>");
              xmlnews.append("描述");
              xmlnews.append("</description>");
              xmlnews.append("<entered_date>");
              xmlnews.append("录入日期");
              xmlnews.append("</entered_date>");
              xmlnews.append("<expiry_date>");
              xmlnews.append("过期日期");
              xmlnews.append("</expiry_date>");
              xmlnews.append("<imagepointer>");
              xmlnews.append("图像");
              xmlnews.append("</imagepointer>");
              xmlnews.append("<typeid>");
              xmlnews.append("类型");
              xmlnews.append("</typeid></NewsItem>");
 
              param.add(xmlnews.toString());
 
              // 测试插入新项目
              TestXMLType xmltest = new TestXMLType();
              try {
                     xmltest.insertItem(str.toString(), param);
              } catch (Exception e) {
                     e.printStackTrace();
              }
 
              try {
                     ArrayList aList = xmltest.editItem(
                                   "SELECT C_XMLTYP FROM T_XMLTYPE WHERE ROWNUM = 1", null);
                     System.out.println(aList.get(0));
              } catch (Exception e) {
                     e.printStackTrace();
              }
 
       }
 
       /**
        * 插入新项目
        *
        * @param query
        * @param params
        * @throws Exception
        */
       public void insertItem(String query, ArrayList params) throws Exception {
 
              CLOB clob = null;
 
              // Initialize statement Object
              PreparedStatement pstmt = null;
              Connection con = null;
 
              try {
                     con = getConnection();
 
                     pstmt = con.prepareStatement(query);
 
                     if (params != null) {
                            for (int i = 0; i < params.size(); i++) {
 
                                   clob = this.getCLOB((String) params.get(i), con);
                                   pstmt.setObject((i + 1), clob);
 
                            }
                     }
 
                     pstmt.execute();
 
                     pstmt.close();
 
              } finally {
 
                     if (pstmt != null) {
                            pstmt.close();
                     }
 
                     if (clob != null) {
                            freeCLOB(clob);
                     }
 
                     releaseConnection(con);
 
              }
       }
 
       /**
        * 读取内容
        *
        * @param query
        * @param params
        * @return
        * @throws Exception
        */
       public ArrayList editItem(String query, ArrayList params) throws Exception {
              Connection con = null;
 
              ResultSet rs = null;
 
              ArrayList data = new ArrayList();
              try {
                     con = getConnection();
 
                     PreparedStatement pst = con.prepareStatement(query);
 
                     if (params != null) {
                            for (int i = 0; i < params.size(); i++) {
                                   pst.setObject(i + 1, params.get(i));
                            }
                     }
 
                     rs = pst.executeQuery();
 
                     while (rs.next()) {
                            OracleResultSet ors = (OracleResultSet) rs;
                            OPAQUE op = ors.getOPAQUE(1);
                            XMLType xml = XMLType.createXML(op);
 
                            data.add(xml.getStringVal());
                     }
 
                     pst.close();
 
                     return data;
 
              } catch (Exception e) {
                     throw e;
              } finally {
 
                     releaseConnection(con); // Releases the connection
 
              }
       }
 
       /**
        * 释放临时CLOB文件
        *
        * @param clob
        * @throws DBException
        */
       private void freeCLOB(CLOB clob) throws DBException {
              try {
                     clob.freeTemporary();
              } catch (SQLException sqlexp) {
                     throw new DBException(sqlexp.getMessage());
              }
       }
 
       /**
        * 释放连接
        *
        * @param conn
        * @throws DBConException
        */
       private void releaseConnection(Connection conn) throws Exception {
              try {
                     if (conn != null || !conn.isClosed()) {
                            conn.close();
                     }
              } catch (SQLException ex) {
                     throw new Exception("不能关闭数据库连接。" + ex.getMessage());
              }
       }
 
       /**
        * 获取连接
        *
        * @return
        * @throws Exception
        */
       private Connection getConnection() throws Exception {
              String user = "DSS_SYYB";
              String password = "DSS_SYYB";
              String driver = "oracle.jdbc.driver.OracleDriver";
              String url = "jdbc:oracle:thin:@192.168.131.229:1521:orcl";
              Connection c = null;
 
              Class.forName(driver).newInstance();
              c = DriverManager.getConnection(url, user, password);
              return c;
 
       }
 
       /**
        * 获取CLOB数据类型
        *
        * @param clobData
        * @param conn
        * @return
        * @throws Exception
        */
       private CLOB getCLOB(String clobData, Connection conn) throws Exception {
              CLOB tempClob = null;
 
              try {
                     // 创建新的临时CLOB
                     tempClob = CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION);
 
                     // 以读写模式打开临时CLOB
                     tempClob.open(CLOB.MODE_READWRITE);
 
                     // 获取输出流用来写入
                     Writer tempClobWriter = tempClob.getCharacterOutputStream();
 
                     // 将字符数据写到临时clob中
                     tempClobWriter.write(clobData);
 
                     // 刷新和关闭
                     tempClobWriter.flush();
                     tempClobWriter.close();
 
                     // 关闭临时clob
                     tempClob.close();
 
                     return tempClob;
              } catch (Exception exp) {
                     tempClob.freeTemporary();
                     throw new Exception("Exception thrown in getCLOB method "
                                   + "of DBBroker class of given status : " + exp.getMessage());
              }
       }
}
 
遇到的问题
java.lang.NoSuchMethodError: oracle.jdbc.internal.OracleConnection.getProtocolType()Ljava/lang/String;
此问题是由于JDBC驱动的问题造成的,使用与数据库相对应的JDBC驱动。
 
 
还需要导入xdb.jar和xmlparserv2.jar这两个包。
 
OracleTypes.OPAQUE类型是一种用户定义的抽象类型,用来匹配XMLTYPE这种类型。

http://www.niftyadmin.cn/n/1140347.html

相关文章

关于XA

XA接口标准是事务处理系统与数据库服务器的事务管理接口&#xff0c;CICS事务所作的数据库修改在事务提交&#xff08;COMMIT&#xff09;或回撤&#xff08;ROLLBACK&#xff09;时由事务处理器通过XA接口向数据库服务器发出提交或回撤请求。由于网络通讯故障随时可能发生&…

深度剖析CPython解释器[转]

系列文章&#xff0c;剖析的很详细,备忘 https://www.cnblogs.com/traditional/tag/%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90CPython%E8%A7%A3%E9%87%8A%E5%99%A8/default.html?page2

最近的安排

手头的项目终于告一段落&#xff0c;最近给自己定了一个目标。熟悉workflow&#xff0c;SOA和DSL

conda 安装gcc

conda环境中安装gcc 2022-07-29 02:40:01 安装gcc7&#xff1a; conda install -c gouarin gcc-7 安装gcc6&#xff1a; conda install -c omgarcia gcc-6

关于Oracle 顽固的KILLED 状态的SESSION的处理

最近在执行一个大业务量的存储过程&#xff0c;中间中断&#xff0c;造成了对某个表的锁。这时我再想修改存储过程&#xff0c;则因为这个锁的存在&#xff0c;一直在等待。 在pl/sql developer中将这个session的状态设置为KILLED&#xff0c;结果等了半天也没有被PMON给清除掉…

pl/sql最差实践一文终于发表了

http://publish.itpub.net/db/2008-06-26/200806261516185.shtml

dev2dev的未来

在dev2dev做了两年多的版主&#xff0c;从bea论坛上学习到了不少知识&#xff0c;也认识了一些朋友&#xff0c;自从bea被oracle收购&#xff0c;对于bea论坛的发展越来越没有信心&#xff0c;7月1日后得知dev2dev将要被并入Oracle开发者网站&#xff0c;觉得这对dev2dev来说&a…

tomcat安装windows服务

在tomcat安装目录/bin/ 执行service.bat install/remove [服务名] 来创建服务 如果创建服务出错&#xff0c;则可能是服务已经存在&#xff0c;因为tomcat创建的服务名都为Apache Tomcat 这时修改service.bat中的set PR_DISPLAYNAMEApache Tomcat4 和 SERVICE_NAME即可。