‘壹’ String 转Clob mysql springMVC
既然你是从数据库取出CLOB字段,那么不用resultset那是用什么取出的。
如果从数据库里面取出的是CLOB字段,为什么会变成String类型呢。
String转CLOB,下面是个例子
public class TestDB {
public static void main(String[] args) {
try {
/** Loading the driver*/
Class.forName("com.oracle.jdbc.Driver");
/** Getting Connection*/
Connection con = DriverManager.getConnection("jdbc:oracle://localhost:3306/test","test","test");
PreparedStatement pstmt = con.prepareStatement("insert into Emp(id,name,description)values(?,?,?)");
pstmt.setInt(1,5);
pstmt.setString(2,"Das");
// Create a big CLOB value...AND inserting as a CLOB
StringBuffer sb = new StringBuffer(400000);
sb.append("This is the Example of CLOB ..");
String clobValue = sb.toString();
pstmt.setString(3, clobValue);
int i= pstmt.executeUpdate();
System.out.println("Done Inserted");
pstmt.close();
con.close();
// Retrive CLOB values
Connection con = DriverManager.getConnection("jdbc:oracle://localhost:3306/test","test","test");
PreparedStatement pstmt = con.prepareStatement("select * from Emp where id=5");
ResultSet rs = pstmt.executeQuery();
Reader instream = null;
int chunkSize;
if(rs.next()){
String name = rs.getString("name");
java.sql.Clob clob = result.getClob("description")
StringBuffer sb1 = new StringBuffer();
chunkSize = ((oracle.sql.CLOB)clob).getChunkSize();
instream = clob.getCharacterStream();
BufferedReader in = new BufferedReader(instream);
String line = null;
while ((line = in.readLine()) != null) {
sb1.append(line);
}
if(in != null){
in.close();
}
String clobdata = sb1.toString(); // this is the clob data converted into string
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
‘贰’ java 处理 oracle clob类型 字段
猪哥解答:
呵呵,从你的代码里没看出大问题,你遇到的那个问题出现的情况通常是:在事务里的不同地方对同一个表的同一条数据进行update操作。
而解决的方式一般是两条update合并成1条,或者强制设定事务的隔离级别,你这个代码不完整,我也不知道该给你往哪里加东西。
不过有一个小问题你得先调整一下:
Writer outstream = clob.getCharacterOutputStream();
if (content != null) {
// outstream.write(content);
outstream.write(content.toCharArray(),0,content.toCharArray().length);
outstream.flush();
outstream.close();
}
你的这段代理里这句话Writer outstream = clob.getCharacterOutputStream();应该拿到if(content!=null)里面,按照你原来的写法,如果那个if条件不满足,那么这个输出流就不会关闭了,这个也许是引起问题的关键吧。
如果不行的话,你就把完整的代码贴上吧,你这个异常要看整个事务是怎么写的。
‘叁’ sql如何添加有Clob的字段
CLOB这个类型就是使用CHAR来保存数据的,把nvarchar类型数据插入到oracle对应的CLOB类型中只要加个to_char()转换下就可以了
‘肆’ java读取clob
这是oracle按照jdbc规范所实现的jdbc驱动,是oracle的东西.
不管怎么用,你都要把oracle提供的jdbc驱动下载下来,然后可以使用javac -classpath选项加载该jar文件,或者在集成开发环境中设置编译环境。
‘伍’ String 转化为 java.io.Clob 对象
要先将原来的数据的clob字段置为空,然后更新,用这个:
conn = DAOFactory.getInstance().getConnection();
// 事务处理
conn.setAutoCommit(false);
// 先把clob字段content置空,content为clob字段
String sql = "update " + table + " set content=empty_clob()";
stmt = conn.createStatement();
stmt.executeUpdate(sql);
// 从数据库中取出插入的clob字段
sql = "select content from " + table + " for update";
rs = stmt.executeQuery(sql);
if(rs.next()) {
// 给clob数据重新赋值,然后更新到数据库中
Clob clob = rs.getClob(1);
clob.setString(1, content);
sql = "update " + table + " set content=? where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setClob(1, clob);
pstmt.setString(2, id);
pstmt.executeUpdate();
}
// 事务提交
conn.commit();
conn.setAutoCommit(true);
补充:
Clob有点特殊,它是一个数据库相关的接口,没法实例化, 你可以通过SerialClob来实例化,这个我没用过。
api上这样写到:
public SerialClob(char[] ch)
throws SerialException,
SQLException按照给定 char 数组的序列化形式构造一个 SerialClob 对象。
新的 SerialClob 对象使用 char 数组中的数据进行初始化,因此允许未连接 RowSet 对象无需接触数据源即可建立序列化的 Clob 对象。
参数:
ch - 表示要序列化的 Clob 对象的 char 数组
你试试吧
‘陆’ 如何把clob类型数据变成string类型的数据
给你段参考代码,读取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();
}
}
‘柒’ JAVA读取Oracle数据库Clob字段转换成String问题
如果使用oracle的话,直接将clob字段读取为string;也就是下面这一行:
clob
=
(oracle.sql.clob)
rs.getobject(1);
可以直接写成
string
str
=
rs.getstring(1);
‘捌’ java 大字符串转为二进制流存入CLOB字段 JDBC方法
我以前写程序发现:
oracle的数据库BLOB不能用来存储字符,改用NCLOB就OK了。
BLOB:用来存储无结构的二进制数据
CLOB:存储单字节字符数据。(别用来存中文喔。。。)
NCLOB:用来存储定宽多字节字符数据。
‘玖’ oracle数据库CLOB类型怎么转换为String
给你段参考代码,读取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();
}
}