我们都知道,mybatis为我们隐藏了很多操作数据库的代码,如在预处理语句PreparedStatement中设置一个参数,或是在执行完SQL语句后从结果集中取出数据。而这两个过程都需要合适的数据类型处理器来帮我们对数据进行正确的类型转换,在mybatis中又是如何处理的呢?如何自定义类型处理呢?
来看看typeHandlers怎么配置
<typeHandlers>
<!--
当配置package的时候,mybatis会去配置的package扫描TypeHandler
<package name="com.test.demo"/>
-->
<!-- handler属性直接配置我们要指定的TypeHandler -->
<typeHandler handler=""/>
<!-- javaType 配置java类型,例如String, 如果配上javaType, 那么指定的typeHandler就只作用于指定的类型 -->
<typeHandler javaType="" handler=""/>
<!-- jdbcType 配置数据库基本数据类型,例如varchar, 如果配上jdbcType, 那么指定的typeHandler就只作用于指定的类型 -->
<typeHandler jdbcType="" handler=""/>
<!-- 也可两者都配置 -->
<typeHandler javaType="" jdbcType="" handler=""/>
</typeHandlers>
近期遇到一个问题BigDecimal类型会省略小数点为0的值,例如数据库是100.50查出来是100.5我需要保留2位小数。如果我需要自定义处理数据库DECIMAL类型的类型转换如何处理呢?
自定义类型转换的类:UnaBigDecimalTypeHandler.java
import org.apache.ibatis.type.BigDecimalTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* 重写BigDecimal的实现
*
* @author 郏高阳
* @date 2020/02/21 09:41:16
* @menu 重写BigDecimal的实现
*/
@MappedJdbcTypes(JdbcType.DECIMAL)
public class UnaBigDecimalTypeHandler extends BigDecimalTypeHandler {
@Override
public BigDecimal getNullableResult(ResultSet rs, String columnName) throws SQLException {
return super.getNullableResult(rs, columnName) == null ? null : super.getNullableResult(rs, columnName).setScale(2);
}
@Override
public BigDecimal getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return super.getNullableResult(rs, columnIndex) == null ? null : super.getNullableResult(rs, columnIndex).setScale(2);
}
@Override
public BigDecimal getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return super.getNullableResult(cs, columnIndex) == null ? null : super.getNullableResult(cs, columnIndex).setScale(2);
}
}
在mybatis配置中增加配置即可