首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

MySql与Oracle数据库如何避免Clob,Blob数据类型

2012-09-25 
MySql与Oracle数据库如何处理Clob,Blob数据类型MySql与Oracle数据库如何处理Clob,Blob数据类型(1)不同数据

MySql与Oracle数据库如何处理Clob,Blob数据类型

MySql与Oracle数据库如何处理Clob,Blob数据类型

(1)不同数据库中对应clob,blob的类型:

mysql中 : clob对应text blob对应blob
db2/oracle中 clob对应clob blob对应blob

(2)domain中对应类型:
clob 对应 String?? blob 对应 byte[]
clob 对庆 java.sql.Clob blob 对应 java.sql.Blob

(3)hibernate配置文件中对应类型:
clob > clob?? blob > binay

也可以直接使用数据库提供类型,例如:oracle.sql.Clob,oracle.sql.Blob。

2、jdbc操作clob (以oracle为例)

首先操作clob/blob不像操作varchar类型那样简单,插入步骤一般为两步:第一步插入一个空值,第二步锁住此行,更新clob/blob字段.

//插入空值
conn.setAutoCommit(false);
String sql = "insert into file(name,file_content) values("jack",EMPTY_CLOB());
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.executeUpdate();
//锁住此行
String sql = "select file_content from file where name='jack' for update";
PreparedStatement pstmt = conn.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
oracle.sql.Clob clob = (oracle.sql.Clob)rs.getClob(1);
java.io.OutputStream writer = clob.getAsciiOutputStream();
byte[] temp = newFileContent.getBytes();
writer.write(temp);
writer.flush();
writer.close();
//
pstmt.close();


读取内容:
oracle.sql.Clob clob = rs.getClob("file_content");
if(null!=clob)
{
???? Reader is = clob.getCharacterStream();
???? BufferedReader br = new BufferedReader(is);
???? String s = br.readLine();
??? while (s != null)
??? {
??????? content += s + "<br>";
??????? s = br.readLine();
??? }
}

3、jdbc操作blob
conn.setAutoCommit(false);
String sql = "insert into photo(name,photo) values("jack",empty_blob());
pstmt = conn.prepareStatement(sql);
pstmt = conn.executeUpdate();
//
sql = "select photo from photo where name='jack'";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery(sql);
if(rs.next())
???? oracle.sql.Blob blob = (oracle.sql.Blob)rs.getBlob(1);
//write to a file
File file = new File("c:\\test.rar");
FileInputStream fin = new FileInputStream(file);
OutputStream out = blob.getBinaryOutputStream();
int count = -1, total = 0;
byte[] data = new Byte[blob.getBufferSize()];
while ((count = fin.read(data)) != -1)
{
???????? total += count;
???????? out.write(data, 0, count);
}


4、hibernateth处理clob

MyFile file = new Myfile();
file.setName("jack");
file.setContent(hibernate.createClob(""));
session.save(file);
session.flush();
session.refresh(file,LockMode.UPGRADE);
oracle.sql.Clob clob = (oracle.sql.Clob)file.getContent();
Writer pw = clob.getCharacterOutputStream();
pw.write(longText);//写入长文本
pw.close();
session.close();

5、使用hibernate处理blob:

原理基本相同:
Photo photo = new Photo();
photo.setName("jack");
photo.setPhoto(hibernate.createBlob(""))://放一个空值
session.save(photo);
session.flush();
//
session.refresh(photo,LockMode.UPGRADE); //锁住此对象
oracle.sql.Blob blob = photo.getPhoto();//取得此blob的指针
OutputStream out = blob.getBinaryOutputStream();???
//写入一个文件
File f = new File("c:\\test.rar");
FileInputStream fin = new FileInputStream(f);???
int count = -1, total = 0;
byte[] data = new byte[(int)fin.available()];
out.write(data);?????
fin.close();
out.close();
session.flush();

?

String DRIVER = "oracle.jdbc.driver.OracleDriver";
??? /**
???? * ORACLE连接用URL
???? */
??? private static final String URL = "jdbc:oracle:thin:@test2000:1521:orac";

??? /**
???? * 用户名
???? */
??? private static final String USER = "user";

??? /**
???? * 密码
???? */
??? private static final String PASSWORD = "pswd";

??? /**
???? * 数据库连接
???? */
??? private static Connection conn = null;

??? /**
???? * SQL语句对象
???? */
??? private static Statement stmt = null;

??? /**
???? * @roseuid 3EDA089E02BC
???? */
??? public LobPros()
??? {

??? }

??? /**
???? * 往数据库中插入一个新的CLOB对象
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04A902BC
???? */
??? public static void clobInsert(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 插入一个空的CLOB对象 */
??????????? stmt.executeUpdate("INSERT INTO TEST_CLOB VALUES ('111', EMPTY_CLOB())");
??????????? /* 查询此CLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 取出此CLOB对象 */
??????????????? oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
??????????????? /* 向CLOB对象中写入数据 */
??????????????? BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
??????????????? BufferedReader in = new BufferedReader(new FileReader(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 修改CLOB对象(是在原CLOB对象基础上进行覆盖式的修改)
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04B60367
???? */
??? public static void clobModify(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 查询CLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 获取此CLOB对象 */
??????????????? oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
??????????????? /* 进行覆盖式修改 */
??????????????? BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
??????????????? BufferedReader in = new BufferedReader(new FileReader(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 替换CLOB对象(将原CLOB对象清除,换成一个全新的CLOB对象)
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04BF01E1
???? */
??? public static void clobReplace(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 清空原CLOB对象 */
??????????? stmt.executeUpdate("UPDATE TEST_CLOB SET CLOBCOL=EMPTY_CLOB() WHERE ID='111'");
??????????? /* 查询CLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT CLOBCOL FROM TEST_CLOB WHERE ID='111' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 获取此CLOB对象 */
??????????????? oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
??????????????? /* 更新数据 */
??????????????? BufferedWriter out = new BufferedWriter(clob.getCharacterOutputStream());
??????????????? BufferedReader in = new BufferedReader(new FileReader(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * CLOB对象读取
???? *
???? * @param outfile - 输出文件名
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04D80116
???? */
??? public static void clobRead(String outfile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 查询CLOB对象 */
??????????? ResultSet rs = stmt.executeQuery("SELECT * FROM TEST_CLOB WHERE ID='111'");
??????????? while (rs.next()) {
??????????????? /* 获取CLOB对象 */
??????????????? oracle.sql.CLOB clob = (oracle.sql.CLOB)rs.getClob("CLOBCOL");
??????????????? /* 以字符形式输出 */
??????????????? BufferedReader in = new BufferedReader(clob.getCharacterStream());
??????????????? BufferedWriter out = new BufferedWriter(new FileWriter(outfile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? out.close();
??????????????? in.close();
??????????? }
??????? } catch (Exception ex) {
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 向数据库中插入一个新的BLOB对象
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04E300F6
???? */
??? public static void blobInsert(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 插入一个空的BLOB对象 */
??????????? stmt.executeUpdate("INSERT INTO TEST_BLOB VALUES ('222', EMPTY_BLOB())");
??????????? /* 查询此BLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 取出此BLOB对象 */
??????????????? oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
??????????????? /* 向BLOB对象中写入数据 */
??????????????? BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
??????????????? BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 修改BLOB对象(是在原BLOB对象基础上进行覆盖式的修改)
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA04E90106
???? */
??? public static void blobModify(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 查询BLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 取出此BLOB对象 */
??????????????? oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
??????????????? /* 向BLOB对象中写入数据 */
??????????????? BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
??????????????? BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 替换BLOB对象(将原BLOB对象清除,换成一个全新的BLOB对象)
???? *
???? * @param infile - 数据文件
???? * @throws java.lang.Exception
???? * @roseuid 3EDA0505000C
???? */
??? public static void blobReplace(String infile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 清空原BLOB对象 */
??????????? stmt.executeUpdate("UPDATE TEST_BLOB SET BLOBCOL=EMPTY_BLOB() WHERE ID='222'");
??????????? /* 查询此BLOB对象并锁定 */
??????????? ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222' FOR UPDATE");
??????????? while (rs.next()) {
??????????????? /* 取出此BLOB对象 */
??????????????? oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
??????????????? /* 向BLOB对象中写入数据 */
??????????????? BufferedOutputStream out = new BufferedOutputStream(blob.getBinaryOutputStream());
??????????????? BufferedInputStream in = new BufferedInputStream(new FileInputStream(infile));
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * BLOB对象读取
???? *
???? * @param outfile - 输出文件名
???? * @throws java.lang.Exception
???? * @roseuid 3EDA050B003B
???? */
??? public static void blobRead(String outfile) throws Exception
??? {
??????? /* 设定不自动提交 */
??????? boolean defaultCommit = conn.getAutoCommit();
??????? conn.setAutoCommit(false);

??????? try {
??????????? /* 查询BLOB对象 */
??????????? ResultSet rs = stmt.executeQuery("SELECT BLOBCOL FROM TEST_BLOB WHERE ID='222'");
??????????? while (rs.next()) {
??????????????? /* 取出此BLOB对象 */
??????????????? oracle.sql.BLOB blob = (oracle.sql.BLOB)rs.getBlob("BLOBCOL");
??????????????? /* 以二进制形式输出 */
??????????????? BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(outfile));
??????????????? BufferedInputStream in = new BufferedInputStream(blob.getBinaryStream());
??????????????? int c;
??????????????? while ((c=in.read())!=-1) {
??????????????????? out.write(c);
??????????????? }
??????????????? in.close();
??????????????? out.close();
??????????? }
??????????? /* 正式提交 */
??????????? conn.commit();
??????? } catch (Exception ex) {
??????????? /* 出错回滚 */
??????????? conn.rollback();
??????????? throw ex;
??????? }

??????? /* 恢复原提交状态 */
??????? conn.setAutoCommit(defaultCommit);
??? }

??? /**
???? * 建立测试用表格
???? * @throws Exception
???? */
??? public static void createTables() throws Exception {
??????? try {
??????????? stmt.executeUpdate("CREATE TABLE TEST_CLOB ( ID NUMBER(3), CLOBCOL CLOB)");
??????????? stmt.executeUpdate("CREATE TABLE TEST_BLOB ( ID NUMBER(3), BLOBCOL BLOB)");
??????? } catch (Exception ex) {

??????? }
??? }

??? /**
???? * @param args - 命令行参数
???? * @throws java.lang.Exception
???? * @roseuid 3EDA052002AC
???? */
??? public static void main(String[] args) throws Exception
??? {
??????? /* 装载驱动,建立数据库连接 */
??????? Class.forName(DRIVER);
??????? conn = DriverManager.getConnection(URL,USER,PASSWORD);
??????? stmt = conn.createStatement();

??????? /* 建立测试表格 */
??????? createTables();

??????? /* CLOB对象插入测试 */
??????? clobInsert("c:/clobInsert.txt");
??????? clobRead("c:/clobInsert.out");

??????? /* CLOB对象修改测试 */
??????? clobModify("c:/clobModify.txt");
??????? clobRead("c:/clobModify.out");

??????? /* CLOB对象替换测试 */
??????? clobReplace("c:/clobReplace.txt");
??????? clobRead("c:/clobReplace.out");

??????? /* BLOB对象插入测试 */
??????? blobInsert("c:/blobInsert.doc");
??????? blobRead("c:/blobInsert.out");

??????? /* BLOB对象修改测试 */
??????? blobModify("c:/blobModify.doc");
??????? blobRead("c:/blobModify.out");

??????? /* BLOB对象替换测试 */
??????? blobReplace("c:/blobReplace.doc");
??????? blobRead("c:/bolbReplace.out");

??????? /* 关闭资源退出 */
??????? conn.close();
??????? System.exit(0);
??? }
}

热点排行