/*
* 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.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;
public class TestLob {
@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("resources/lob/manager.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("resources/lob/manager.rar"));
dbUtil.setString(2, id);
dbUtil.executePrepared();
// BLOB blob = (BLOB)dbUtil.getBlob(0, "blobname");
// if(blob != null)
// {
// DBUtil.updateBLOB(blob, new java.io.File("resources/lob/manager.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();
PreparedDBUtil dbUtil = new PreparedDBUtil();
try {
//查询大字段内容并且将大字段存放到文件中
dbUtil.preparedSelect("derby", "select id,blobname from test");
dbUtil.executePreparedWithRowHandler(new NullRowHandler(){
@Override
public void handleRow(Record origine) throws Exception
{
origine.getFile("blobname", new java.io.File("resources/lob/reader/dominspector_" + origine.getRowid() +".rar"));
}});
System.out.println("testClobRead dbUtil.size():"+dbUtil.size());
} catch (Exception e) {
// TODO Auto-generated catch block
throw e;
}
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("resources/lob/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("resources/lob/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.executePreparedWithRowHandler(new NullRowHandler(){
@Override
public void handleRow(Record origine) throws Exception
{
origine.getFile("clobname", new java.io.File("resources/lob/reader/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("resources/lob/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;
}
}
public void main(String[] args)
{
// System.out.print("start.........");
// DBUtil.debugMemory();
// for(int i = 0; i < 1; i ++)
// {
// testBlobWrite();
//// testBigBlobWrite();
//// testClobWrite();
//// testBigClobWrite();
//
// }
//
//// testBlobWrite();
//// testBigBlobWrite();
// DBUtil.debugMemory();
// testBlobRead();
//// testClobRead();
// System.out.print("end.........");
// DBUtil.debugMemory();
}
}