Java中如何将JSON对象转换为ResultSet及Java8升级后JDBC ODBC桥替代方案
JSON转ResultSet实现方案
是可以直接将JSON对象转换为标准ResultSet对象的,推荐使用JDK自带的离线CachedRowSet实现,无需引入额外的重型依赖,具体实现逻辑如下:
- 先解析JSON数据,提取表头字段列表、所有行的数据集合
- 初始化
CachedRowSet实例,配置列名、列类型等元数据 - 遍历所有行数据,依次写入
CachedRowSet中,最终返回的实例本身就是ResultSet的子类,可直接对接原有遗留代码
参考代码示例:
import com.sun.rowset.CachedRowSetImpl; import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.RowSetMetaDataImpl; import java.sql.Types; import java.util.List; import java.util.Map; public class JsonToResultSetConverter { public CachedRowSet convert(List<String> headerList, List<Map<String, Object>> jsonRowList) throws Exception { CachedRowSet rowSet = new CachedRowSetImpl(); // 配置ResultSet元数据 RowSetMetaDataImpl metaData = new RowSetMetaDataImpl(); metaData.setColumnCount(headerList.size()); for (int i = 0; i < headerList.size(); i++) { metaData.setColumnName(i + 1, headerList.get(i)); // 可根据JSON值的实际类型调整列类型,比如日期、数字对应不同的Types枚举值 metaData.setColumnType(i + 1, Types.VARCHAR); } rowSet.setMetaData(metaData); // 填充行数据 for (Map<String, Object> row : jsonRowList) { rowSet.moveToInsertRow(); for (int i = 0; i < headerList.size(); i++) { rowSet.updateObject(i + 1, row.get(headerList.get(i))); } rowSet.insertRow(); } // 指针移到第一行之前,兼容原有ResultSet遍历逻辑 rowSet.beforeFirst(); return rowSet; } }
如果运行环境不支持com.sun.rowset.CachedRowSetImpl,可以替换为Apache Commons DbUtils提供的ResultSetImpl实现,逻辑完全一致。
更优的替代方案(无需JSON转换中间环节)
直接从Excel文件生成ResultSet,省去JSON转换的性能损耗和类型丢失风险,推荐以下几种实现方式:
- Apache POI + CachedRowSet:用POI读取Excel的单元格数据,直接填充到上述的
CachedRowSet中,适合需要自定义Excel解析逻辑的场景,整体改造成本很低 - Excel专用JDBC驱动:直接使用现成的开源Excel JDBC驱动(比如xlsjdbc、ucanaccess),仅需要替换原有JDBC连接配置为Excel文件路径,执行查询即可直接拿到标准
ResultSet,原有代码几乎不需要修改 - 嵌入式内存数据库中转:将Excel数据导入到H2、SQLite等嵌入式内存库的临时表中,再通过JDBC查询拿到
ResultSet,适合需要对Excel数据做复杂过滤、关联计算的场景
适配注意事项
- 所有方案返回的都是
java.sql.ResultSet接口的标准实现,原有依赖ResultSet的业务逻辑不需要做任何修改 - 要注意Excel单元格类型和
ResultSet列类型的匹配,避免调用getInt、getDate等类型方法时出现转换异常
内容的提问来源于stack exchange,提问作者Shiva
相关产品推荐
相关产品推荐

