/*
* Copyright 2008 biaoping.yin
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.frameworkset.derby;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.SQLException;
import javax.transaction.RollbackException;
import org.junit.BeforeClass;
import org.junit.Test;
import com.frameworkset.common.poolman.CallableDBUtil;
import com.frameworkset.common.poolman.DBUtil;
import com.frameworkset.common.poolman.PreparedDBUtil;
import com.frameworkset.common.poolman.Record;
import com.frameworkset.common.poolman.handle.NullRowHandler;
import com.frameworkset.orm.transaction.TransactionManager;
/**
* <p>
* Title: TestDBUtilLob.java
* </p>
*
* <p>
* Description:
* </p>
*
* <p>
* Copyright: Copyright (c) 2007
* </p>
*
* @Date 2010-1-25 下午03:11:00
* @author biaoping.yin
* @version 1.0
*/
public class TestDBUtilLob
{
@Test
public void test()
{
String droptableinfo = "" + " drop table cim_datacache";
String createtableinfo = " CREATE TABLE cim_datacache " + "(" + " PLUGINID VARCHAR(200),"
+ "CATEGORY VARCHAR(200)," + " DATA_CACHE LONG VARCHAR FOR BIT DATA," + " CACHEID BIGINT,"
+ "PRIMARY KEY(CACHEID)" + ")";
// String addpk =
// "ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)";
CallableDBUtil dbutil = new CallableDBUtil();
try
{
// CallableDBUtil dbutil_ = new CallableDBUtil();
dbutil.prepareCallable("derby", droptableinfo);
dbutil.executeCallable();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
dbutil.prepareCallable("derby", createtableinfo);
dbutil.executeCallable();
// dbutil.prepareCallable("derby",addpk);
//
// dbutil.executeCallable();
}
catch (Exception e)
{
}
}
@BeforeClass
public static void createTable()
{
String droptableinfo = "" + " drop table TABLEINFO ";
String createtableinfo = " CREATE TABLE TABLEINFO " + "("
+ " TABLE_NAME VARCHAR(255) NOT NULL," + "TABLE_ID_NAME VARCHAR(255),"
+ "TABLE_ID_INCREMENT int DEFAULT 1,"
+ "TABLE_ID_VALUE int DEFAULT 0," + "TABLE_ID_GENERATOR VARCHAR(255),"
+ "TABLE_ID_TYPE VARCHAR(255)," + "TABLE_ID_PREFIX VARCHAR(255)" + ")";
String addpk = "ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)";
// " COMMENT ON TABLE TABLEINFO IS ''表信息维护对象'';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_NAME IS ''表名称''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_NAME IS ''表的主键名称''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_INCREMENT IS ''表的主键递增量缺省为1''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_VALUE IS ''主键当前值:缺省为0''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_GENERATOR IS ''自定义表主键生成机制"+
// "必需从"+
// "com.frameworkset.common.poolman.sql.PrimaryKey集成''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_TYPE IS ''主键类型(string,int)''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_PREFIX IS ''类型为string的主键前缀,可指定可不指定,缺省值为空''';"+
// " execute immediate 'CREATE UNIQUE INDEX PK_TABLEINFO0 ON TABLEINFO(TABLE_NAME)';"+
// " execute immediate 'ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)';"
// +
// " exception" +
// " when others then " +
// " execute immediate 'CREATE TABLE TABLEINFO ( TABLE_NAME VARCHAR2(255) NOT NULL,TABLE_ID_NAME VARCHAR2(255),TABLE_ID_INCREMENT NUMBER(5) DEFAULT 1,TABLE_ID_VALUE NUMBER(20) DEFAULT 0,TABLE_ID_GENERATOR VARCHAR2(255),TABLE_ID_TYPE VARCHAR2(255),TABLE_ID_PREFIX VARCHAR2(255))';"
// +
// " execute immediate 'COMMENT ON TABLE TABLEINFO IS ''表信息维护对象''';" +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_NAME IS ''表名称''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_NAME IS ''表的主键名称''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_INCREMENT IS ''表的主键递增量缺省为1''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_VALUE IS ''主键当前值:缺省为0''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_GENERATOR IS ''自定义表主键生成机制必需从com.frameworkset.common.poolman.sql.PrimaryKey集成''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_TYPE IS ''主键类型(string,int)''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_PREFIX IS ''类型为string的主键前缀,可指定可不指定,缺省值为空''';"
// +
// " execute immediate 'CREATE UNIQUE INDEX PK_TABLEINFO0 ON TABLEINFO(TABLE_NAME)';"
// +
// " execute immediate 'ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)';"
// +
// " end;";
// String tableinfo = "begin " +
// " execute immediate 'drop table TABLEINFO cascade constraints';"+
// " execute immediate 'CREATE TABLE TABLEINFO "+
// "("+
// " TABLE_NAME VARCHAR2(255) NOT NULL,"+
// "TABLE_ID_NAME VARCHAR2(255),"+
// "TABLE_ID_INCREMENT NUMBER(5) DEFAULT 1,"+
// "TABLE_ID_VALUE NUMBER(20) DEFAULT 0,"+
// "TABLE_ID_GENERATOR VARCHAR2(255),"+
// "TABLE_ID_TYPE VARCHAR2(255),"+
// "TABLE_ID_PREFIX VARCHAR2(255)"+
// ")';"+
// " execute immediate 'COMMENT ON TABLE TABLEINFO IS ''表信息维护对象''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_NAME IS ''表名称''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_NAME IS ''表的主键名称''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_INCREMENT IS ''表的主键递增量缺省为1''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_VALUE IS ''主键当前值:缺省为0''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_GENERATOR IS ''自定义表主键生成机制"+
// "必需从"+
// "com.frameworkset.common.poolman.sql.PrimaryKey集成''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_TYPE IS ''主键类型(string,int)''';"+
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_PREFIX IS ''类型为string的主键前缀,可指定可不指定,缺省值为空''';"+
// " execute immediate 'CREATE UNIQUE INDEX PK_TABLEINFO0 ON TABLEINFO(TABLE_NAME)';"+
// " execute immediate 'ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)';"
// +
// " exception" +
// " when others then " +
// " execute immediate 'CREATE TABLE TABLEINFO ( TABLE_NAME VARCHAR2(255) NOT NULL,TABLE_ID_NAME VARCHAR2(255),TABLE_ID_INCREMENT NUMBER(5) DEFAULT 1,TABLE_ID_VALUE NUMBER(20) DEFAULT 0,TABLE_ID_GENERATOR VARCHAR2(255),TABLE_ID_TYPE VARCHAR2(255),TABLE_ID_PREFIX VARCHAR2(255))';"
// +
// " execute immediate 'COMMENT ON TABLE TABLEINFO IS ''表信息维护对象''';" +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_NAME IS ''表名称''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_NAME IS ''表的主键名称''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_INCREMENT IS ''表的主键递增量缺省为1''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_VALUE IS ''主键当前值:缺省为0''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_GENERATOR IS ''自定义表主键生成机制必需从com.frameworkset.common.poolman.sql.PrimaryKey集成''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_TYPE IS ''主键类型(string,int)''';"
// +
// " execute immediate 'COMMENT ON COLUMN TABLEINFO.TABLE_ID_PREFIX IS ''类型为string的主键前缀,可指定可不指定,缺省值为空''';"
// +
// " execute immediate 'CREATE UNIQUE INDEX PK_TABLEINFO0 ON TABLEINFO(TABLE_NAME)';"
// +
// " execute immediate 'ALTER TABLE TABLEINFO ADD CONSTRAINT PK_TABLEINFO0 PRIMARY KEY (TABLE_NAME)';"
// +
// " end;";
String proce = "CREATE OR REPLACE PROCEDURE tt"
+ " AS "
+ "begin "
+ "execute immediate 'drop table test'; "
+ "execute immediate 'create table test(id number(10),blobname blob,clobname clob)'; "
+ "execute immediate 'delete from TABLEINFO where table_name=''test'''; "
+ "execute immediate 'INSERT INTO TABLEINFO ( TABLE_NAME, TABLE_ID_NAME, TABLE_ID_INCREMENT, TABLE_ID_VALUE,"
+ "TABLE_ID_GENERATOR, TABLE_ID_TYPE, TABLE_ID_PREFIX ) VALUES ("
+ "''test'', ''id'', 1, 0, NULL, ''int'', NULL)'; "
+ "commit; "
+ "EXCEPTION "
+ "when others then "
+ "execute immediate 'create table test(id number(10),blobname blob,clobname clob)'; "
+ "execute immediate 'delete from TABLEINFO where table_name=''test'''; "
+ "execute immediate 'INSERT INTO TABLEINFO ( TABLE_NAME, TABLE_ID_NAME, TABLE_ID_INCREMENT, TABLE_ID_VALUE,"
+ "TABLE_ID_GENERATOR, TABLE_ID_TYPE, TABLE_ID_PREFIX ) VALUES ("
+ "''test'', ''id'', 1, 0, NULL, ''int'', NULL)'; " + "commit;" + "END;";
// String proce = "{begin "+
// "execute immediate 'drop table test'; "+
// "execute immediate 'create table test(id number(10),blobname blob,clobname clob)'; "+
// "EXCEPTION "+
// "when others then "+
// "execute immediate 'create table test(id number(10),blobname blob,clobname clob)'; "+
// "END;}";
CallableDBUtil dbutil = new CallableDBUtil();
try
{
// CallableDBUtil dbutil_ = new CallableDBUtil();
dbutil.prepareCallable("derby", droptableinfo);
dbutil.executeCallable();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
dbutil.prepareCallable("derby", createtableinfo);
dbutil.executeCallable();
dbutil.prepareCallable("derby", addpk);
dbutil.executeCallable();
try
{
String droptest = "drop table test";
dbutil.prepareCallable("derby", droptest);
dbutil.executeCallable();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
String createtest = "create table test(id int,blobname blob,clobname clob)";
// String proce_tt =
// "CREATE PROCEDURE tt"+
// "" +
// "begin null; end;";
//
dbutil.prepareCallable("derby", createtest);
dbutil.executeCallable();
}
catch (SQLException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
// try
// {
// dbutil.prepareCallable("derby",proce);
// dbutil.executeCallable();
// }
// catch (SQLException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// dbutil.execute(proce);
// CallableDBUtil dbutil_ = new CallableDBUtil();
// dbutil_.prepareCallable("{call tt()}");
//
// dbutil_.executeCallable();
// dbutil.prepareCallable(proce);
// try
// {
// dbutil.executeCallable();
// }
// catch (SQLException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
// @Test
// public void testBlobWrite()
// {
//
// }
/**
* 第一种插入blob字段的方法,通用的模式
*
* @throws Exception
*/
@Test
public void testBlobWrite() throws Exception
{
PreparedDBUtil dbUtil = new PreparedDBUtil();
try
{
dbUtil.preparedInsert("derby", "insert into test(id,blobname) values(?,?)");
dbUtil.setString(1, DBUtil.getNextStringPrimaryKey("test"));
dbUtil.setBlob(2, new java.io.File("d:/dominspector.rar"));// 直接将文件存储到大字段中
dbUtil.executePrepared();
}
catch (Exception e)
{
// TODO Auto-generated catch block
throw e;
}
finally
{
}
}
//
/**
* 针对oracle Blob字段的插入操作
*/
@Test
public void testBigBlobWrite() throws Exception
{
PreparedDBUtil dbUtil = new PreparedDBUtil();
TransactionManager tm = new TransactionManager();
try
{
// 启动事务
tm.begin();
// 先插入一条记录,blob字段初始化为empty_lob
dbUtil.preparedInsert("derby", "insert into test(id,blobname) values(?,?)");
String id = DBUtil.getNextStringPrimaryKey("test");
dbUtil.setString(1, id);
dbUtil.setNull(2, java.sql.Types.BLOB);// 先设置空的blob字段
dbUtil.executePrepared();
// 查找刚才的插入的记录,修改blob字段的值为一个文件
dbUtil = new PreparedDBUtil();
dbUtil.preparedUpdate("derby", "update test set blobname =? where id = ?");
dbUtil.setBlob(1, new java.io.File("d:/dominspector.rar"));
dbUtil.setString(2, id);
dbUtil.executePrepared();
// BLOB blob = (BLOB)dbUtil.getBlob(0, "blobname");
// if(blob != null)
// {
// DBUtil.updateBLOB(blob, new java.io.File("d:/dominspector.rar"));
// }
tm.commit();
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
try
{
tm.rollback();
}
catch (RollbackException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
throw e;
}
finally
{
tm = null;
dbUtil = null;
}
}
//
//
/**
* 大字段的读取
*/
@Test
public void testBlobRead() throws Exception
{
// TransactionManager tm = new TransactionManager();
DBUtil dbUtil = new DBUtil();
try
{
// 查询大字段内容并且将大字段存放到文件中
// dbUtil.preparedSelect("derby", "select id,blobname from test");
dbUtil.executeSelectWithRowHandler("derby", "select id,blobname from test", new NullRowHandler()
{
@Override
public void handleRow(Record origine) throws Exception
{
origine.getFile("blobname", new java.io.File("f:/dominspector_" + origine.getRowid() + ".rar"));
}
});
System.out.println("testClobRead dbUtil.size():" + dbUtil.size());
}
catch (Exception e)
{
// TODO Auto-generated catch block
throw e;
}
finally
{
}
}
@Test
public void testDB()
{
/**
* String select_sql = "select t.attachcontent from "+"fc_attach t where attachid='" + attachid+ "' for update";
rs = stmt.executeQuery(select_sql);
BLOB blob = null;
if (rs.next()) {
blob = (BLOB) rs.getBlob("attachcontent");
outStream = blob.setBinaryStream(0);
byte[] chunk = new byte[blob.getChunkSize()];
int i = -1;
while ((i = filecontent.read(chunk)) != -1) {
outStream.write(chunk, 0, i);
}
}
outStream.flush();
outStream.close();
*/
// TransactionManager tm = new TransactionManager();
PreparedDBUtil dbUtil = new PreparedDBUtil();
TransactionManager tm = new TransactionManager();
try
{
// 查询大字段内容并且将大字段存放到文件中
// dbUtil.preparedSelect("derby", "select id,blobname from test");
tm.begin();
//
// dbUtil.executeSelectWithRowHandler("derby", "select t.attachcontent from "+"fc_attach t where attachid='1' for update", new NullRowHandler()
// {
//
// @Override
// public void handleRow(Record origine) throws Exception
// {
// Blob blb = origine.getBlob("attachcontent");
// OutputStream out = blb.setBinaryStream(0);
//// ...
//
// }
// });
dbUtil.preparedSelect("derby", "select t.attachcontent from "+"fc_attach t where attachid=? for update");
dbUtil.setInt(1, 1);
dbUtil.executePreparedWithRowHandler(new NullRowHandler()
{
@Override
public void handleRow(Record origine) throws Exception
{
Blob blb = origine.getBlob("attachcontent");
OutputStream out = blb.setBinaryStream(0);
// ...
}
});
tm.commit();
System.out.println("testClobRead dbUtil.size():" + dbUtil.size());
}
catch (Exception e)
{
// TODO Auto-generated catch block
// throw e;
try {
tm.rollback();
} catch (RollbackException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
finally
{
}
}
//
/**
* clob字段的写入
*/
@Test
public void testClobWrite() throws Exception
{
PreparedDBUtil dbUtil = new PreparedDBUtil();
try
{
dbUtil.preparedInsert("derby", "insert into test(id,clobname) values(?,?)");
dbUtil.setString(1, DBUtil.getNextStringPrimaryKey("test"));
dbUtil.setClob(2, "clobvalue");// 直接将字符串存储到clob字段中
dbUtil.executePrepared();
}
catch (Exception e)
{
// TODO Auto-generated catch block
// e.printStackTrace();
throw e;
}
finally
{
}
}
/**
* 针对oracle Clob字段的插入操作
*/
@Test
public void testBigClobWrite() throws Exception
{
PreparedDBUtil dbUtil = new PreparedDBUtil();
TransactionManager tm = new TransactionManager();
try
{
// 启动事务
tm.begin();
// 先插入一条记录,blob字段初始化为empty_lob
dbUtil.preparedInsert("derby", "insert into test(id,clobname) values(?,?)");
String id = DBUtil.getNextStringPrimaryKey("test");
dbUtil.setString(1, id);
dbUtil.setNull(2, java.sql.Types.CLOB);// 先设置空的blob字段
dbUtil.executePrepared();
// 查找刚才的插入的记录,修改blob字段的值为一个文件
dbUtil = new PreparedDBUtil();
dbUtil.preparedUpdate("derby", "update test set clobname =? where id = ?");
dbUtil.setClob(1, new java.io.File("d:\\route.txt"));
dbUtil.setString(2, id);
dbUtil.executePrepared();
// CLOB clob = (CLOB)dbUtil.getClob(0, "clobname");
// if(clob != null)
// {
// DBUtil.updateCLOB(clob, new java.io.File("d:\\route.txt"));
// }
tm.commit();
}
catch (Exception e)
{
// TODO Auto-generated catch block
// e.printStackTrace();
try
{
tm.rollback();
}
catch (RollbackException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
throw e;
}
finally
{
tm = null;
dbUtil = null;
}
}
//
/**
* clob字段的读取
*/
@Test
public void testClobRead() throws Exception
{
PreparedDBUtil dbUtil = new PreparedDBUtil();
try
{
// 查询大字段内容并且将大字段存放到文件中
// dbUtil.preparedSelect( "derby", "select id,clobname from test");
dbUtil.executeSelectWithRowHandler("derby", "select id,clobname from test", new NullRowHandler()
{
@Override
public void handleRow(Record origine) throws Exception
{
origine.getFile("clobname", new java.io.File("f:/route" + origine.getRowid() + ".txt"));
}
});
System.out.println("testClobRead dbUtil.size():" + dbUtil.size());
// for(int i = 0; i < dbUtil.size(); i ++)
// {
//
// dbUtil.getFile(i, "clobname", new java.io.File("d:/route" + i +
// ".txt")); //读取clob字段到文件中
// // String clobvalue = dbUtil.getString(i,
// "clobname");//获取clob字段到字符串变量中
// // Clob clob = dbUtil.getClob(i,
// "clobname");//获取clob字段值到clob类型变量中
// }
}
catch (Exception e)
{
// TODO Auto-generated catch block
// e.printStackTrace();
throw e;
}
finally
{
dbUtil = null;
}
}
}