1 |
java.sql.SQLException: not implemented by SQLite JDBC driver |
错误,或者如下错误:
1 2 3 4 5 6 7 |
2021-06-03 09:25:20.435 ERROR 15643 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'appIcon' from result set. Cause: java.sql.SQLFeatureNotSupportedException ### The error may exist in xxxx.java (best guess) ### The error may involve xxx.select ### The error occurred while handling results ### SQL: SELECT * FROM xxx WHERE id=? ### Cause: org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'appIcon' from result set. Cause: java.sql.SQLFeatureNotSupportedException] with root cause |
场景:
具体需求,要求像springboot连接mysql或者pgsql数据库一样,在application配置文件中配置sqlite数据库信息,并实现对blob类型数据(我们的库中有该类型的数据)的读写,按照平常一样写好controller、service、dao、mapper.xml后,执行查询操作后报错
原因分析:
sqlite的driver中,JDBC4ResultSet没有实现以下接口:
1 2 3 4 |
public Blob getBlob(int col) throws SQLException { throw unused(); } public Blob getBlob(String col) throws SQLException { throw unused(); } |
而是直接抛出了异常。
解决方法:
mapper.xml中该字段的设置:
1 2 3 4 5 6 7 |
<select id="queryByList" resultMap="queryBaseResultMap"> select * from my_blob </select> <resultMap id="queryBaseResultMap" type="com.wx.model.MyBlob" > <id column="Id" property="id" jdbcType="INTEGER" /> <result column="blob" property="blob" typeHandler="com.wx.handler.BlobTypeHandler"/> </resultMap> |
即blob字段加个typeHandler属性。
然后自定义一个BlobTypeHandler处理类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class BlobTypeHandler extends BaseTypeHandler<byte[]> { @Override public void setNonNullParameter(PreparedStatement ps, int i, byte[] parameter, JdbcType jdbcType) throws SQLException { ps.setBytes(i, parameter); } @Override public byte[] getNullableResult(ResultSet rs, String columnName) throws SQLException { return rs.getBytes(columnName); } @Override public byte[] getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return rs.getBytes(columnIndex); } @Override public byte[] getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return cs.getBytes(columnIndex); } } |
注意:实体类中blob字段类型是byte[]。
参考链接
mybaties连接sqlite,并读取blob类型数据时,报 java.sql.SQLException: not implemented by SQLite JDBC driver错误