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);
}
});
}