mysql数据库clob类型数据_Java对Oracle中Clob类型数据的读取和写入详解

fff6c98081bf8904098fb5e1bd59ff4b.gif

Java对Oracle中Clob数据类型是不能够直接插入的,但是可以通过流的形式对clob类型数据写入或者读取,网上代码并不算特别多,讲的也不是很清楚,我对网上资料进行了整理和总结,具体看代码:

写入clob数据

import java.io.Writer;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

public class TestClobIn {

public static void main(String args[]){

String data="this is a long passage";

Writer outStream = null;

//通过JDBC获得数据库连接

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ewins", "scott", "tiger");

con.setAutoCommit(false);

Statement st = con.createStatement();

//插入一个空对象empty_clob(),这个是必须的

st.executeUpdate("insert into TESTCLOB(ID, NAME, CLOBATTR)values(2,'thename', empty_clob())");

//锁定数据行进行更新,注意“for update”语句,这里不用for update锁定不可以插入clob

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1 for update");

if (rs.next()){

//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB

oracle.sql.CLOB clob = (oracle.sql.CLOB) rs.getClob("CLOBATTR");

outStream = clob.getCharacterOutputStream();

//data是传入的字符串,定义:String data

char[] c = data.toCharArray();

outStream.write(c, 0, c.length);

}

outStream.flush();

outStream.close();

con.commit();

con.close();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

读取clob数据

import java.io.InputStream;

import java.io.Reader;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.Statement;

public class TestClobOut {

public static void main(String args[]){

String data;

Reader inStream=null;

//获得数据库连接

Connection con = ConnectionFactory.getConnection();//ConnectionFactory类是另外定义的,不必纠结

con.setAutoCommit(false);

Statement st = con.createStatement();

//不需要“for update”

ResultSet rs = st.executeQuery("select CLOBATTR from TESTCLOB where ID=1");

if (rs.next()){

java.sql.Clob clob = rs.getClob("CLOBATTR");

inStream = clob.getCharacterStream();

char[] c = new char[(int) clob.length()];

inStream.read(c);

//data是读出并需要返回的数据,类型是String

data = new String(c);

inStream.close();

}

inStream.close();

con.commit();

con.close();

}

}

对比我们可以看出,无论出库入库,都要对clob数据类型进行查询操作,写入clob数据相对来说更复杂一点,需要先插入empty_clob() 值,然后使用带“for update”的查询语句锁定更新行,最后实例化输出流并对clob类型字段数据进行写入操作;读取clob相对轻松一些,利用 getCharacterStream方法得到输入流,从数据库中clob字段下,直接将数据读取出来。

fff6c98081bf8904098fb5e1bd59ff4b.gif

转载请注明来源网站:www.itxm.cn谢谢!

分享到:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用 SqlSugar 进行批量插入实体时,如果要插入 OracleClob 类型数据,可以按照以下步骤进行操作: 1. 在实体类定义一个属性,类型为 string,用于存储 Clob 数据。 ```csharp public class MyEntity { public int Id { get; set; } public string Name { get; set; } public string Description { get; set; } public string ClobData { get; set; } // 用于存储 Clob 数据 } ``` 2. 在执行批量插入操作时,将 Clob 数据转换为 OracleClob 类型,并设置到实体的 ClobData 属性。可以使用 SqlSugar 提供的 ToOracleClob 方法进行转换。 ```csharp var entities = new List<MyEntity> { new MyEntity { Id = 1, Name = "Entity 1", Description = "Description 1", ClobData = "Clob Data 1" }, new MyEntity { Id = 2, Name = "Entity 2", Description = "Description 2", ClobData = "Clob Data 2" }, // ... }; using (var db = new SqlSugarClient(connectionString)) { var insertable = db.Insertable(entities); foreach (var entity in entities) { // 将 ClobData 转换为 OracleClob 类型,并设置到实体的 ClobData 属性 insertable = insertable.SetInsertIdentity().InsertColumns(it => it.Name, it => it.Description, it => it.ClobData.ToOracleClob()); } var result = await insertable.ExecuteCommandAsync(); } ``` 注意:在使用 ToOracleClob 方法时,需要在 SqlSugar 的连接字符串指定 Oracle 数据库的 ProviderName,例如: ```csharp var db = new SqlSugarClient(new ConnectionConfig { ConnectionString = connStr, DbType = DbType.Oracle, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute, ProviderName = "Oracle.ManagedDataAccess.Client" }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值