IT俱乐部 Java MyBatis中的自定义TypeHandler详解

MyBatis中的自定义TypeHandler详解

要实现 typeHandler 就需要去实现接口 typeHandler,或者继承 BaseTypeHandler(实际上,BaseTypeHandler 实现了 typeHandler 接口)。

自定义String类型的TypeHandler:

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.TypeHandler;
import org.apache.log4j.Logger;
public class MyTypeHandler implements TypeHandler {
    Logger logger = Logger.getLogger(MyTypeHandler.class);
    @Override
    public void setParameter(PreparedStatement ps, int i, String parameter,
            JdbcType jdbcType) throws SQLException {
        logger.info("设置 string 参数【" + parameter + "】");
        ps.setString(i, parameter);
    }
    @Override
    public String getResult(ResultSet rs, String columnName)
            throws SQLException {
        String result = rs.getString(columnName);
        logger.info("读取 string 参数 1 【" + result + "】");
        return result;
    }
    @Override
    public String getResult(ResultSet rs, int columnIndex) throws SQLException {
        String result = rs.getString(columnIndex);
        logger.info("读取string 参数 2【" + result + "】");
        return result;
    }
    @Override
    public String getResult(CallableStatement cs, int columnIndex)
            throws SQLException {
        String result = cs.getString(columnIndex);
        logger.info("读取 string 参数 3 【" + result + "】");
        return result;
    }
}

定义的 typeHandler 泛型为 String,显然我们要把数据库的数据类型转化为 String 型,然后实现设置参数和获取结果集的方法。

但是这个时候还没有启用 typeHandler

它还需要做如下所示的配置。


配置完成后系统才会读取它,这样注册后,当 jdbcType 和 javaType 能与 MyTypeHandler 对应的时候,它就会启动 MyTypeHandler。

有时候还可以显式启用 typeHandler,一般而言启用这个 typeHandler 有两种方式

如下所示。

....

    select id,role_name,note from t_role where id = #{id}

    select id, role_name, note from t_role
    where role_name like concat('%',#{roleName, jdbcType=VARCHAR,
    javaType=string}, '%')

    select id, role_name, note from t_role
    where note like concat ('%', # {note, typeHandler=com.mybatis.test.MyTypeHandler},'%')

......

注意,要么指定了与自定义 typeHandler 一致的 jdbcType 和 javaType,要么直接使用 typeHandler 指定具体的实现类。

在一些因为数据库返回为空导致无法断定采用哪个 typeHandler 来处理,而又没有注册对应的 javaType 的 typeHandler 时,MyBatis 无法知道使用哪个 typeHandler 转换数据,我们可以采用这样的方式来确定采用哪个 typeHandler 处理,这样就不会有异常出现了。

有时候由于枚举类型很多,系统需要的 typeHandler 也会很多,如果采用配置也会很麻烦,这个时候可以考虑使用包扫描的形式,那么就需要按照以下代码配置了。


只是这样就没法指定 jdbcType 和 javaType 了,不过我们可以使用注解来处理它们。我们把 MyTypeHandler 的声明修改一下,如下所示。

@MappedTypes(String.class)
@MappedjdbcTypes(jdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler{
    ......
}

到此这篇关于MyBatis中的自定义TypeHandler详解的文章就介绍到这了,更多相关MyBatis自定义TypeHandler内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/8750.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部