Java 如何使用SpringJDBCTemplate将Blob数据读入字符串对象

Java 如何使用SpringJDBCTemplate将Blob数据读入字符串对象,java,spring,spring-boot,spring-jdbc,jdbctemplate,Java,Spring,Spring Boot,Spring Jdbc,Jdbctemplate,我试图使用SpringJDBCTemplate从表中读取blob数据 List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql); for(Map<String, Object> row:rows){ row.get("OPERATION_NAME"); row.get("REQUEST_MESSAGE"); // this is blob } List rows=jdbc

我试图使用SpringJDBCTemplate从表中读取blob数据

List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

for(Map<String, Object> row:rows){
    row.get("OPERATION_NAME");
    row.get("REQUEST_MESSAGE"); // this is blob
}
List rows=jdbcTemplate.queryForList(sql);
用于(地图行:行){
获取(“操作名称”);
get(“REQUEST_MESSAGE”);//这是blob
}

如何将blob读入Java字符串对象?

您可以尝试从数据库中检索blob,如下所示

String retrieveBlobAsString = null;
Blob b = row.get("REQUEST_MESSAGE");//cast with (Blob) if required. Blob from resultSet as rs.getBlob(index). 
InputStream bis = b.getBinaryStream();
ObjectInputStream ois = new ObjectInputStream(bis);
retrieveBlobAsString = (String) ois.readObject();

您可以尝试从数据库中检索blob,如下所示

String retrieveBlobAsString = null;
Blob b = row.get("REQUEST_MESSAGE");//cast with (Blob) if required. Blob from resultSet as rs.getBlob(index). 
InputStream bis = b.getBinaryStream();
ObjectInputStream ois = new ObjectInputStream(bis);
retrieveBlobAsString = (String) ois.readObject();

这似乎很管用-

LobHandler lobHandler = new DefaultLobHandler();
List<FrontendData> frontEndDataList = jdbcTemplate.query(getResponseQuery(sessionId), new RowMapper() {
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                // TODO Auto-generated method stub

                FrontendData frontEndData = new FrontendData();
                String operationName = rs.getString("OPERATION_NAME");
                frontEndData.setApiName(operationName);
                byte[] requestData = lobHandler.getBlobAsBytes(rs,"RESPONSE_MESSAGE");
                frontEndData.setResponse(new String(requestData));


                return frontEndData;
            }});
LobHandler-LobHandler=新的DefaultLobHandler();
List frontEndDataList=jdbcTemplate.query(getResponseQuery(sessionId),new RowMapper(){
@凌驾
公共对象mapRow(ResultSet rs,int rowNum)引发SQLException{
//TODO自动生成的方法存根
FrontendData FrontendData=新的FrontendData();
字符串操作名=rs.getString(“操作名”);
frontEndData.setApiName(操作名称);
byte[]requestData=lobHandler.getBlobAsBytes(rs,“响应消息”);
setResponse(新字符串(requestData));
返回前端数据;
}});

这似乎效果不错-

LobHandler lobHandler = new DefaultLobHandler();
List<FrontendData> frontEndDataList = jdbcTemplate.query(getResponseQuery(sessionId), new RowMapper() {
            @Override
            public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
                // TODO Auto-generated method stub

                FrontendData frontEndData = new FrontendData();
                String operationName = rs.getString("OPERATION_NAME");
                frontEndData.setApiName(operationName);
                byte[] requestData = lobHandler.getBlobAsBytes(rs,"RESPONSE_MESSAGE");
                frontEndData.setResponse(new String(requestData));


                return frontEndData;
            }});
LobHandler-LobHandler=新的DefaultLobHandler();
List frontEndDataList=jdbcTemplate.query(getResponseQuery(sessionId),new RowMapper(){
@凌驾
公共对象mapRow(ResultSet rs,int rowNum)引发SQLException{
//TODO自动生成的方法存根
FrontendData FrontendData=新的FrontendData();
字符串操作名=rs.getString(“操作名”);
frontEndData.setApiName(操作名称);
byte[]requestData=lobHandler.getBlobAsBytes(rs,“响应消息”);
setResponse(新字符串(requestData));
返回前端数据;
}});

另一种方法是使用java.sql.ResultSet getBytes()将BLOB列转换为字符串对象

List<ModelClass> hulaList = jdbcTemplate.query(sql,
    new RowMapper<ModelClass>() {
        @Override
        public ModelClass mapRow(ResultSet rs, int rowNum) throws SQLException {
            ModelClass model = new ModelClass();
            model.setOperationName(rs.getString("OPERATION_NAME"));
            byte[] byteArr = rs.getBytes("REQUEST_MESSAGE");
            model.setRequestMessage(new String(byteArr));
            return model;
        }
});
List hulist=jdbcTemplate.query(sql、,
新的行映射器(){
@凌驾
公共模型类mapRow(ResultSet rs,int rowNum)引发SQLException{
ModelClass模型=新的ModelClass();
model.setOperationName(rs.getString(“操作名称”);
byte[]byteArr=rs.getBytes(“请求消息”);
setRequestMessage(新字符串(byteArr));
收益模型;
}
});

另一种方法是使用java.sql.ResultSet getBytes()将BLOB列转换为字符串对象

List<ModelClass> hulaList = jdbcTemplate.query(sql,
    new RowMapper<ModelClass>() {
        @Override
        public ModelClass mapRow(ResultSet rs, int rowNum) throws SQLException {
            ModelClass model = new ModelClass();
            model.setOperationName(rs.getString("OPERATION_NAME"));
            byte[] byteArr = rs.getBytes("REQUEST_MESSAGE");
            model.setRequestMessage(new String(byteArr));
            return model;
        }
});
List hulist=jdbcTemplate.query(sql、,
新的行映射器(){
@凌驾
公共模型类mapRow(ResultSet rs,int rowNum)引发SQLException{
ModelClass模型=新的ModelClass();
model.setOperationName(rs.getString(“操作名称”);
byte[]byteArr=rs.getBytes(“请求消息”);
setRequestMessage(新字符串(byteArr));
收益模型;
}
});

Java 8+语法:

List<MyObject> results = jdbcTemplate.query(
    "SELECT x,y FROM ... ",
    (rs, n) -> {
        MyObject o = new MyObject();
        o.setX(rs.getString("x"));
        o.setY(rs.getBytes("y")); // <-- a BLOB
        return o;
    }
);
List results=jdbcTemplate.query(
“从…”中选择x,y,
(rs,n)->{
MyObject o=新的MyObject();
o、 setX(rs.getString(“x”));
o、 setY(rs.getBytes(“y”);//rs.getBytes(1));

Java 8+语法:

List<MyObject> results = jdbcTemplate.query(
    "SELECT x,y FROM ... ",
    (rs, n) -> {
        MyObject o = new MyObject();
        o.setX(rs.getString("x"));
        o.setY(rs.getBytes("y")); // <-- a BLOB
        return o;
    }
);
List results=jdbcTemplate.query(
“从…”中选择x,y,
(rs,n)->{
MyObject o=新的MyObject();
o、 setX(rs.getString(“x”));
o、 setY(rs.getBytes(“y”);//rs.getBytes(1));

当我试图用一个Blob进行强制转换时,出现了以下异常-由:java.lang.ClassCastException引起:[B不能强制转换为java.sql.BLOB我想我们只需要在使用oracle数据类型BLOB时强制转换。但是由于我们使用的是java.sql包中的BLOB,所以我认为不需要强制转换。可能是,您可以尝试删除强制转换并查看其是否有效吗?谢谢Aditya。此语句无效=BLOB=row.get(“请求\消息”);并引发相同的错误。如果我没有强制转换,我需要某种方法将该对象转换为InputStream。当我尝试使用Blob强制转换时,出现以下异常-由:java.lang.ClassCastException引起:[B不能强制转换为java.sql.BLOB我想我们只需要在使用oracle数据类型BLOB时强制转换。但是由于我们使用的是java.sql包中的BLOB,所以我认为不需要强制转换。可能是,您可以尝试删除强制转换并查看其是否有效吗?谢谢Aditya。此语句无效=BLOB=row.get(“请求\消息”);并抛出相同的错误。如果我没有强制转换,我需要某种方法将对象转换为InputStream。