版权声明:本文为博主原创文章,转载请说明出处。 https://blog.csdn.net/weixin_43549578/article/details/84876198
MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。
Mybatis系统自带的类型处理器:
需要注意一下:
数值类型的精度,数据库int、 double、 decimal这些类型和java的精度、长度都是不一样的。
时间精度,取数据到日用 Date OnlyTypeHandler即可,用到精度为秒的用 SqlTimestampTypeHandler等。
自定义数组类型处理器:
ArrayTypeHandler
public class ArrayTypeHandler extends BaseTypeHandler<Object> {
private Class type;
private static final String TYPE_NAME_VARCHAR = "varchar";
private static final String TYPE_NAME_INTEGER = "integer";
private static final String TYPE_NAME_BOOLEAN = "boolean";
private static final String TYPE_NAME_NUMERIC = "numeric";
public ArrayTypeHandler(Class type){
if (type == null) throw new IllegalArgumentException("Type argument cannot be null");
this.type = type;
}
private Object[] getArray(Array array) {
if (array == null) {
return null;
}
try {
return (Object[]) array.getArray();
} catch (Exception e) {
}
return null;
}
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
String typeName = null;
if (parameter instanceof Integer[]) {
typeName = TYPE_NAME_INTEGER;
} else if (parameter instanceof String[]) {
typeName = TYPE_NAME_VARCHAR;
} else if (parameter instanceof Boolean[]) {
typeName = TYPE_NAME_BOOLEAN;
} else if (parameter instanceof Double[]) {
typeName = TYPE_NAME_NUMERIC;
}
if (typeName == null) {
throw new TypeException("ArrayTypeHandler parameter typeName error, your type is " + parameter.getClass().getName());
}
// 这3行是关键的代码,创建Array,然后ps.setArray(i, array)就可以了
Connection conn = ps.getConnection();
Array array = conn.createArrayOf(typeName,(Object[])parameter);
ps.setArray(i, array);
}
@Override
public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
return getArray(rs.getArray(columnName));
}
@Override
public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return getArray(rs.getArray(columnIndex));
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return getArray(cs.getArray(columnIndex));
}
}
Json类型处理器:
JSONTypeHandler:
public class JSONTypeHandler extends BaseTypeHandler<Object> {
private Class clazz;
public JSONTypeHandler(Class clazz) {
if (null == clazz) {
throw new IllegalArgumentException("Type argument can not be null!");
}
this.clazz = clazz;
}
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object parameter, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JSONUtil.stringfy(parameter));
}
@Override
public Object getNullableResult(ResultSet resultSet, String columnName) throws SQLException {
return JSONUtil.parse(resultSet.getString(columnName), clazz);
}
@Override
public Object getNullableResult(ResultSet resultSet, int columnIndex) throws SQLException {
return JSONUtil.parse(resultSet.getString(columnIndex), clazz);
}
@Override
public Object getNullableResult(CallableStatement callableStatement, int columnIndex) throws SQLException {
return JSONUtil.parse(callableStatement.getString(columnIndex), clazz);
}
}
配置:
<typeHandlers>
<typeHandler handler="com.xx.mybatis.typehandler.ArrayTypeHandler"
javaType="java.lang.Integer" jdbcType="ARRAY" />
<typeHandler handler="com.xx.mybatis.typehandler.ArrayTypeHandler"
javaType="[Ljava.lang.String;" jdbcType="ARRAY" />
<typeHandler handler="com.xx.mybatis.typehandler.json.JSONTypeHandler"
javaType="java.util.List" jdbcType="OTHER" />
</typeHandlers>
mapper.xml中的使用方式:
扫描二维码关注公众号,回复:
4672482 查看本文章
<resultMap id="BaseResultMap" type="com.xx.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="creator_id" property="creatorId" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="updater_id" property="updaterId" jdbcType="VARCHAR" />
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP" />
<result column="district_area" property="districtArea" jdbcType="OTHER" typeHandler="com.xx.mybatis.typehandler.json.JSONTypeHandler"/>
<result column="is_del" property="isDel" jdbcType="SMALLINT" />
</resultMap>
枚举类型处理器:
注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,它会处理任意继承了 Enum 的类。
Mybatis内部提供了两种类型处理器
org.apache.ibatis.type.EnumTypeHandler 使用枚举名称处理java枚举类型,其对应的是一个字符串
org.apache.ibatis.type.EnumOrdinalTypeHandler 默认的
EnumTypeHandler是使用枚举字符串名称作为参数传递的, EnumOrdinalTypeHandler是使用整数下标作为参数传递的
性别枚举的使用:
public enum Sex {
MALE(1,"男"),
FEMALE(2,"女");
private int id;
private String name;
Sex(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static Sex getSex(int id){
if(id==1){
return MALE;
}else if(id==2) {
return FEMALE;
}
return null;
}
}
配置:
<typeHandler handler=" org.apache.ibatis.type.EnumOrdinalTypeHandler"
javaType="com.toutiao.agent.Sex" />
<result column="sex" property="sex" typeHandler="org.apache.ibatis.type.EnumOrdinalTypeHandler"/>