jdbcTemplate獲取mysql的blob

java使用jdbcTemplate操作mysql數據庫,遇到blob字段,正常讀取出來是blob的地址,而不是blob的內容。

下面採用2中方式讀取blob的內容:

1、以二進制數組形式讀取blob,適用於文本數據

public void testJdbc()
	{
		ApplicationContext ctx = new ClassPathXmlApplicationContext("restlet-servlet.xml");
		JdbcTemplate jdbcTemplate = (JdbcTemplate)ctx.getBean("jdbcTemplate");
		String sql = "select * from violation_redis t where t.id < 10";
		final LobHandler lobHandler=new DefaultLobHandler();  
		@SuppressWarnings("unchecked")
		List<Map<String,String>> list = jdbcTemplate.query(sql,new RowMapper(){
			public Object mapRow(ResultSet rs, int rowNum) throws SQLException 
			{
				//以二進制的數組方式獲得Blob數據,第二個參數3是指blob字段在結果集的位置
				byte[] attach = lobHandler.getBlobAsBytes(rs, 3);
				//非blob子彈獲取
				String key = rs.getString("vio_key");
				String strAttach = new String(attach);
				p(key + "==" + strAttach);
				Map<String,String> map = new HashMap<String,String>();
				map.put("vio_key", key);
				map.put("vio_info", strAttach);
				return map;
			}
		});
		p(list);
	}

2、流模式讀取blob:

public void getBlob(OutputStream  out)
{
		String sql = "select * from violation_redis t where t.id < 10";
		final LobHandler lobHandler=new DefaultLobHandler();  
		List<Map<String,String>> list = jdbcTemplate.query(sql,new RowMapper(){
			public Object mapRow(ResultSet rs, int rowNum) throws SQLException 
			{
				//以二進制的數組方式獲得Blob數據
				InputStream is = lobHandler.getBlobAsBinaryStream(rs, 2);
				if(is != null){
				//利用spring的工具類將輸入流的數據複製到輸出流中
				FileCopyUtils.copy(is, out);
			}
		});
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章