如何修改MyBatis默认IntegerTypeHandler解决int返回空异常
解决方案:自定义IntegerTypeHandler处理null返回-1
1. 实现自定义TypeHandler
创建MyConfigIntegerTypeHandler类,继承MyBatis的BaseTypeHandler<Integer>,重写核心方法处理null场景,返回-1替代:
import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class MyConfigIntegerTypeHandler extends BaseTypeHandler<Integer> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Integer parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter); } @Override public Integer getNullableResult(ResultSet rs, String columnName) throws SQLException { int value = rs.getInt(columnName); return rs.wasNull() ? -1 : value; } @Override public Integer getNullableResult(ResultSet rs, int columnIndex) throws SQLException { int value = rs.getInt(columnIndex); return rs.wasNull() ? -1 : value; } @Override public Integer getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { int value = cs.getInt(columnIndex); return cs.wasNull() ? -1 : value; } }
2. 配置MyBatis启用自定义TypeHandler
提供两种配置方式,按需选择:
方式一:全局生效(所有int类型查询统一处理)
在MyBatis核心配置文件(如mybatis-config.xml)中添加类型处理器配置:
<configuration> <typeHandlers> <!-- 替换com.yourpackage为实际类所在包路径 --> <typeHandler handler="com.yourpackage.MyConfigIntegerTypeHandler" javaType="int"/> </typeHandlers> </configuration>
方式二:局部生效(仅指定查询使用)
如果不想全局修改,可在目标Mapper的<select>标签中单独指定:
<select id="yourQueryMethod" resultType="int" typeHandler="com.yourpackage.MyConfigIntegerTypeHandler"> SELECT your_int_column FROM your_table WHERE condition = #{param} </select>
3. 验证效果
完成配置后,执行原查询逻辑,当无匹配结果时,MyBatis会通过自定义处理器返回-1,避免null转基本类型int的异常,且无需修改XXXMapper.java中的方法返回值定义。
注意:全局配置会将所有返回null的int类型结果转为-1,若部分查询有特殊逻辑,建议使用局部配置针对性处理。
内容的提问来源于stack exchange,提问作者buzz
相关产品推荐
相关产品推荐

