`

java String与Blob类型数据转换

阅读更多
需要把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

    分享在JAVA中Blob转换成String实例

    BLOB与String互转

    最近开发遇到blob类型转换为String,一时犯难。所以总结了一段代码与之分享。亲测

    java中sqllite数据库blob数据类型的存取.docx

    ### Java中SQLite数据库BLOB数据类型的存取 #### 背景与问题描述 在Java中操作SQLite数据库时,BLOB(Binary Large Object)类型的数据处理是较为常见的需求之一,尤其是在需要存储图片、文档等二进制文件的情况下。...

    java读取大字段blob类型

    `BLOB`类型是关系型数据库中用于存储大量二进制数据的一种数据类型。它适用于存储诸如图片、声音文件、视频等多媒体数据以及文本文件等非结构化的数据。由于`BLOB`类型数据通常较大,因此在进行读取时需要注意性能...

    JAVA中SQLlite数据库BLOB数据类型的存取.docx

    JAVA 中 SQLlite 数据库 BLOB 数据类型的存取 JAVA 中 SQLlite 数据库 BLOB 数据类型的存取是指在 JAVA 语言中使用 SQLlite 数据库来存储和读取大型二进制对象(BLOB),以便实现文件存储和读取的功能。本文将详细...

    string与blob的写入与读出

    首先,`String`是Java中表示文本的基本数据类型,它以Unicode字符集存储数据。在处理字符串时,我们通常会用到`StringBuilder`或`StringBuffer`类来构建和操作字符串,尤其是涉及到大量字符串拼接时,以避免不必要的...

    实现blob类型数据上传至MySQL数据库.rar

    在这种情况下,`BLOB`(Binary Large Object)数据类型是MySQL数据库用来存储大对象的理想选择。本文将详细介绍如何在JSP页面上实现`BLOB`类型数据的上传,并将其存储到MySQL数据库中。 首先,理解`BLOB`类型:`...

    Java数据类型和MySql数据类型对应一览

    Java 数据类型和 MySql 数据类型对应一览 在 Java 编程语言中,数据类型是指变量或函数可以持有的值的类型。 MySql 数据库也具有其自己的数据类型,用于存储和管理数据。在本文中,我们将对 Java 数据类型和 MySql ...

    mysql blob to 向 file转换

    BLOB 数据类型可以存储大量的二进制数据,但其长度不能超过 65535 字节。 将 BLOB 转换为文件 将 BLOB 转换为文件可以使用 Java 语言来实现。首先,我们需要使用 JDBC 连接 MySQL 数据库,然后使用 ...

    kettle通过java代码将数据库blob 字段抽取到本地文件

    kettle通过java代码将数据库blob 字段抽取到本地文件

    [java]将Byte存入blob.rar

    在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常在数据库中使用,如SQL Server和Oracle。本教程将详细解释如何将Byte数组转换为Blob对象,并将其存储到数据库中,特别关注图像...

    mybatis 对clob类型转换

    在处理CLOB类型时,MyBatis需要将Java对象中的String或Reader类型数据转换为CLOB,以便存储到数据库中。 1. **CLOB类型数据的插入** 当你需要将一个字符串或者Reader对象插入到CLOB字段时,MyBatis默认可能无法...

    Oracle9i数据类型Java数据类型Schema类型对比.doc

    通过了解这些数据类型之间的对应关系,开发者可以更好地将 Java 应用程序中的数据转换为适合存储在数据库中的格式,反之亦然,从而实现高效的数据交换和处理。同时,XML 文件的使用使得这些映射关系可以被结构化地...

    Java中数据类型和MYSQL中数据类型的对比

    在 Java 应用程序中,通常需要将 Java 数据类型转换为 MySQL 数据类型进行数据库交互。例如,使用 Java 的 `PreparedStatement` 设置参数时,可能需要将 `java.sql.Date` 转换为 `DATE` 类型,或者将 `String` 转换...

    java,Blob字段操作,将图片或者文件保存到数据库中.zip

    在Java编程中,Blob(Binary Large Object)是用于存储大量二进制数据的数据类型,常被用在数据库中存储图片、文件等非文本信息。本教程将深入讲解如何使用Java处理Blob字段,以便将图片或文件保存到数据库中。这个...

    MySql于Java数据类型对应列表

    ### MySQL与Java数据类型对应详解 #### 概述 在进行数据库操作时,尤其是在使用Java进行MySQL数据库开发的过程中,正确地映射数据类型是至关重要的一步。本文将详细介绍MySQL中的各种数据类型及其在Java中的对应...

    Java存取OracleBlob字段,图片存储,Blob和BLOB的问题,Clob,oracle.docx

    在实际开发过程中,经常需要将图片等二进制文件存储到数据库中,此时 Blob 成为了常用的数据类型之一。 1. **存储图片至数据库** - **步骤一**:获取图片文件。 - **步骤二**:创建 `FileInputStream` 读取图片...

    对blob大数据的操作——图片上传与显示*(自己实践可用)

    在XX.hbm.xml文件中,我们需要将图片类型的列属属性类型改成type="org.springframework.orm.hibernate3.support.BlobByteArrayType",因为采用Hibernate转换时会自动将Blob类型转换成String类型。在Bean中,我们需要...

    strus+spring保存文件为blob类型

    BLOB是数据库系统中用于存储大量二进制数据的数据类型,如图片、音频或视频文件。 首先,`InfoJdbcDaoImpl.java`可能是一个实现了DAO(Data Access Object)设计模式的类,用于与数据库进行交互。在这个场景下,它...

Global site tag (gtag.js) - Google Analytics