需要把String类型数据转换成Reader,然后再使用setCharacterStream插入数据库中。
例如下例中,要插入String longStr,则先转换成Byte[],再ByteArrayInputStream,最后InputStreamReader。
添加或更新clob型数据,如下所示(以更新为例):
PreparedStatement pstmt=conn.prepareStatement(“update tablename set column1=? “+条件语句);
byte[] bytes_zyjs = longStr.getBytes();
ByteArrayInputStream baisss = new ByteArrayInputStrea(bytes_zyjs);
InputStreamReader bais = new InputStreamReader(baisss);
pstmt.setCharacterStream(1,bais,bytes_zyjs.length);
pstmt.executeUpdate();
但是如上方式写入汉字就会产生乱码,于是查看资料得知,上述方法多用于oracle下,而mysql下使用的是setBinaryStream方法,只要传入位置,inputstream,和长度即可。示例如下:
byte[] cert_dataBytes = cert_data.getBytes();
ByteArrayInputStream bais1 = new ByteArrayInputStream(cert_dataBytes);
byte[] prikey_dataBytes = prikey_data.getBytes();
ByteArrayInputStream bais2 = new ByteArrayInputStream(prikey_dataBytes);
String sql = "insert into cert_data values(?,?,?)";
PreparedStatement pstm = null;
try {
conn.setAutoCommit(false);
pstm = conn.prepareCall(sql);
pstm.setInt(1,cert_sn);
pstm.setBinaryStream(2, bais1,cert_dataBytes.length);//使用二进制读取,可以直接写入汉字,否则容易产生乱码
pstm.setBinaryStream(3, bais2, prikey_dataBytes.length);
pstm.executeUpdate();
conn.commit();
conn.setAutoCommit(true);
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
if(pstm != null)
pstm.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
//从数据库中读取Blob类型数据后,要转换成String类型,即转换成InputStream,再从InputStream转成byte[],再到String即可。如下:
//把数据库中blob类型转换成String类型
public String convertBlobToString(Blob blob){
String result = "";
try {
ByteArrayInputStream msgContent =(ByteArrayInputStream) blob.getBinaryStream();
byte[] byte_data = new byte[msgContent.available()];
msgContent.read(byte_data, 0,byte_data.length);
result = new String(byte_data);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return result;
}
2批量插入 带blob类型的实体类
public void insertBatchList(ArrayList list) {
Connection conn = null;
PreparedStatement stmt = null;
MetadataMapVo vo = null;
try {
conn = DAOUtils.getDBConnection(JNDINames.CRM_DATASOURCE, this);
stmt = conn.prepareStatement(DAOSQLUtils.getFilterSQL(SQL_INSERT));
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
vo = (MetadataMapVo) list.get(i);
int index = 1;
stmt.setString( index++, ((MetadataMapVo)vo).getId() );
stmt.setString( index++, ((MetadataMapVo)vo).getInterc_type());
stmt.setString( index++, ((MetadataMapVo)vo).getInterc_metadata_id() );
stmt.setString( index++, ((MetadataMapVo)vo).getSource_type() );
stmt.setString( index++, ((MetadataMapVo)vo).getSource_id() );
stmt.setString( index++, ((MetadataMapVo)vo).getTarget_type() );
stmt.setString( index++, ((MetadataMapVo)vo).getTarget_id() );
String desc =((MetadataMapVo)vo).getDescription();
if(!StringUtil.isEmptyOrNull(desc)){
ByteArrayInputStream is = new ByteArrayInputStream(desc.getBytes());
stmt.setBinaryStream( index++, is,desc.getBytes().length);
}else{
stmt.setString( index++, null);
}
stmt.setString( index++, ((MetadataMapVo)vo).getRequeir_file_path() );
stmt.setString( index++, ((MetadataMapVo)vo).getStatus());
stmt.addBatch();
}
stmt.executeBatch();
}
} catch (SQLException se) {
Debug.print(SQL_INSERT, this);
throw new DAOSystemException("SQLException while insert sql:\n" + SQL_INSERT, se);
} finally {
DAOUtils.closeStatement(stmt, this);
DAOUtils.closeConnection(conn, this);
}
}
查询带blob类型的实体类
private String convertBLOBtoString(Object blobContent) {
try {
Class clazz = blobContent.getClass();
Method method = clazz.getMethod("getBinaryStream",new Class[] {});
InputStream is = (InputStream) method.invoke(blobContent,new Object[] {});
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i=-1;
while((i=is.read())!=-1){
baos.write(i);
}
return baos.toString();
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
private Map rowToMap(ResultSet rs) throws Exception {
Map result = new HashMap();
ResultSetMetaData rsmd = rs.getMetaData();
int cols = rsmd.getColumnCount();
String type="";
for (int i = 1; i <= cols; i++) {
if(rsmd.getColumnName(i).toUpperCase().equals("SOURCE_TYPE")){
type = rs.getString(i);
}
if(rsmd.getColumnName(i).toUpperCase().equals("DESCRIPTION")){
result.put(rsmd.getColumnName(i).toLowerCase(), this.convertBLOBtoString(rs.getBlob(i)));;
}else{
result.put(rsmd.getColumnName(i).toLowerCase(), rs.getString(i));
}
}
if(!type.equals("")){
if("4".equals(type.trim())||"6".equals(type.trim())){
String xml=(String) result.get("description");
Document doc =DocumentHelper.parseText(xml);
Element root = doc.getRootElement();
String cal_function = root.attributeValue("cal_function");
String require_des = root.attributeValue("require_des");
result.put("cal_function", cal_function);
result.put("require_des", require_des);
}
}
return result;
}
@Override
public List getBooldData(Map map) throws Exception {
Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null;
List<Map<String,String>> list = null;
String whereCond ="";
try {
whereCond =" where a.interc_type='"+map.get("interc_type")+"' and a.interc_metadata_id='"+map.get("interc_metadata_id")+"'";
conn = DAOUtils.getDBConnection(JNDINames.CRM_DATASOURCE, this);
stmt = conn.prepareStatement(DAOSQLUtils.getFilterSQL(SELECT_SQL + whereCond));
rs = stmt.executeQuery();
Map<String, String> m = null;
list = new ArrayList<Map<String,String>>();
while(rs.next()){
list.add(this.rowToMap(rs));
}
} catch (SQLException se) {
Debug.print(SELECT_SQL + whereCond, this);
throw new DAOSystemException("SQLException while getting sql:\n" + SELECT_SQL + whereCond, se);
} finally {
DAOUtils.closeResultSet(rs, this);
DAOUtils.closeStatement(stmt, this);
DAOUtils.closeConnection(conn, this);
}
System.out.println();
System.out.println(list.size());
return list;
}
分享到:
相关推荐
分享在JAVA中Blob转换成String实例
最近开发遇到blob类型转换为String,一时犯难。所以总结了一段代码与之分享。亲测
### Java中SQLite数据库BLOB数据类型的存取 #### 背景与问题描述 在Java中操作SQLite数据库时,BLOB(Binary Large Object)类型的数据处理是较为常见的需求之一,尤其是在需要存储图片、文档等二进制文件的情况下。...
`BLOB`类型是关系型数据库中用于存储大量二进制数据的一种数据类型。它适用于存储诸如图片、声音文件、视频等多媒体数据以及文本文件等非结构化的数据。由于`BLOB`类型数据通常较大,因此在进行读取时需要注意性能...
JAVA 中 SQLlite 数据库 BLOB 数据类型的存取 JAVA 中 SQLlite 数据库 BLOB 数据类型的存取是指在 JAVA 语言中使用 SQLlite 数据库来存储和读取大型二进制对象(BLOB),以便实现文件存储和读取的功能。本文将详细...
首先,`String`是Java中表示文本的基本数据类型,它以Unicode字符集存储数据。在处理字符串时,我们通常会用到`StringBuilder`或`StringBuffer`类来构建和操作字符串,尤其是涉及到大量字符串拼接时,以避免不必要的...
在这种情况下,`BLOB`(Binary Large Object)数据类型是MySQL数据库用来存储大对象的理想选择。本文将详细介绍如何在JSP页面上实现`BLOB`类型数据的上传,并将其存储到MySQL数据库中。 首先,理解`BLOB`类型:`...
Java 数据类型和 MySql 数据类型对应一览 在 Java 编程语言中,数据类型是指变量或函数可以持有的值的类型。 MySql 数据库也具有其自己的数据类型,用于存储和管理数据。在本文中,我们将对 Java 数据类型和 MySql ...
BLOB 数据类型可以存储大量的二进制数据,但其长度不能超过 65535 字节。 将 BLOB 转换为文件 将 BLOB 转换为文件可以使用 Java 语言来实现。首先,我们需要使用 JDBC 连接 MySQL 数据库,然后使用 ...
kettle通过java代码将数据库blob 字段抽取到本地文件
在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常在数据库中使用,如SQL Server和Oracle。本教程将详细解释如何将Byte数组转换为Blob对象,并将其存储到数据库中,特别关注图像...
在处理CLOB类型时,MyBatis需要将Java对象中的String或Reader类型数据转换为CLOB,以便存储到数据库中。 1. **CLOB类型数据的插入** 当你需要将一个字符串或者Reader对象插入到CLOB字段时,MyBatis默认可能无法...
通过了解这些数据类型之间的对应关系,开发者可以更好地将 Java 应用程序中的数据转换为适合存储在数据库中的格式,反之亦然,从而实现高效的数据交换和处理。同时,XML 文件的使用使得这些映射关系可以被结构化地...
在 Java 应用程序中,通常需要将 Java 数据类型转换为 MySQL 数据类型进行数据库交互。例如,使用 Java 的 `PreparedStatement` 设置参数时,可能需要将 `java.sql.Date` 转换为 `DATE` 类型,或者将 `String` 转换...
在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常被用在数据库中存储图片、文件等非文本信息。本教程将深入讲解如何使用Java处理Blob字段,以便将图片或文件保存到数据库中。这个...
### MySQL与Java数据类型对应详解 #### 概述 在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应...
在实际开发过程中,经常需要将图片等二进制文件存储到数据库中,此时 Blob 成为了常用的数据类型之一。 1. **存储图片至数据库** - **步骤一**:获取图片文件。 - **步骤二**:创建 `FileInputStream` 读取图片...
在XX.hbm.xml文件中,我们需要将图片类型的列属属性类型改成type="org.springframework.orm.hibernate3.support.BlobByteArrayType",因为采用Hibernate转换时会自动将Blob类型转换成String类型。在Bean中,我们需要...
BLOB是数据库系统中用于存储大量二进制数据的数据类型,如图片、音频或视频文件。 首先,`InfoJdbcDaoImpl.java`可能是一个实现了DAO(Data Access Object)设计模式的类,用于与数据库进行交互。在这个场景下,它...