zoukankan      html  css  js  c++  java
  • mybatis 自定义typeHandler

    自定义typeHandler

      在大部分的场景下,MyBatis的typeHandler就能应付一般的场景,但是有时候不够用。比如使用枚举的时候,枚举有特殊的转化规则,这个时候需要自定义typeHandler进行处理它。
      从系统定义的typeHandler可以知道,要实现typeHandler就需要去实现接口typeHandler,或者继承BaseTypeHandler(实际上,BaseTypeHandler实现了typeHanlder接口)。这里我们仿造一个StringTypeHandler来实现一个自定义的typeHandler——MyTypeHandler,它只是用于实现接口typeHandler,如代码清单4-13所示。
      代码清单4-13:MyTypeHandler

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

      定义的typeHandler泛型为String,显然我们要把数据库的数据类型转化为String型,然后实现设置参数和获取结果集的方法。但是这个时候还没有启用typeHandler,它还需要做如代码清单4-14所示的配置。
      数据类型转化为String型,然后实现设置参数和获取结果集的方法。但是这个时候还没有启用typeHandler,它还需要做如下图所示的配置。配置完成后系统才会读取它,这样注册后,当jdbcType和javaType能与MyTypeHandler对应的时候,它就会启动MyTypeHandler。

    如上图1处:
    配置MyTypeHandler与jdbcType和javaType
    如上2幅图的2处:
    使用包扫描的形式,只是这样就没法指定jdbcType和javaType了,不过我们可以使用注解来处理它们。

    有时候还可以显式启用typeHandler

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

    mybatis typeHandler类型转换器

    mybatis 枚举typeHandler

  • 相关阅读:
    TCP流量控制和拥塞控制
    延迟确认和Nagle算法
    浅谈TCP三次握手和四次挥手
    中介者模式
    代理模式
    装饰者模式
    生成器模式(构建者模式)
    策略模式
    模板方法模式
    抽象工厂模式
  • 原文地址:https://www.cnblogs.com/ooo0/p/10914131.html
Copyright © 2011-2022 走看看