MyBatis中的自定义TypeHandler详解

2023-08-06 0 394

要实现 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<String> {
    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

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

<typeHandlers>
    <typeHandler jdbcType=\"VARCHAR\" javaType=\"string\" handler=\"com.mybatis.test.MyTypeHandler\"/>
</typeHandlers>

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

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

如下所示。

....
<resultMap id=\"roleMapper\" type=\"role\">
    <result property=\"id\" column=\"id\"/>
    <result property=\"roleName\" column=\"role_name\" jdbcType=\"VARCHAR\" javaType=\"string\"/>
    <result property=\"note\" column=\"note\" typeHandler=\" com.mybatis.test.MyTypeHandler\"/>
</resultMap>
<select id=\"getRole\" parameterType=\"long\" resultMap=\"roleMapper\">
    select id,role_name,note from t_role where id = #{id}
</select>
<select id=\"findRoles\" parameterType=\"string\" resultMap=\"roleMapper\">
    select id, role_name, note from t_role
    where role_name like concat(\'%\',#{roleName, jdbcType=VARCHAR,
    javaType=string}, \'%\')
</select>
<select id=\"findRoles2\" parameterType=\"string\" resultMap=\"roleMapper\">
    select id, role_name, note from t_role
    where note like concat (\'%\', # {note, typeHandler=com.mybatis.test.MyTypeHandler},\'%\')
</select>
......

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

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

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

<typeHandlertype>
    <package name=\"com.mybatis.test\"/>
</typeHandlertype>

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

@MappedTypes(String.class)
@MappedjdbcTypes(jdbcType.VARCHAR)
public class MyTypeHandler implements TypeHandler<String>{
    ......
}
资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 MyBatis中的自定义TypeHandler详解 http://www.20zxx.cn/806387/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务