mybatis之TypeHandler

mybatis篇

  • mybatis-独立使用
  • mybatis之TypeHandler
  • mybatis一级缓存原理
  • mybatis二级缓存原理
  • mybatis插件原理解析
  • mybatis整合spring

TypeHandler在mybatis中是一个比较重要的功能,其作用是帮我们把数据库中的类型映射成java中的类型,比如Varchar -> String。mybatis已经内置了大量的TypeHandler

image

然而有时候这些内置的TypeHandler都不满足我们的业务需求时,就需要自定义自己的TypeHandler了。自定义TypeHandler有如下几个步骤:

  1. 编写类继承至BaseTypeHandler 其中T为需要转换成的java类型

  2. 重写父类的抽象方法

  3. 注册TypeHandler

  4. Mapper.xml中resultMap配置字段的TypeHandler

package single.mybatis.mapper.typehandle;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;

import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

// 该注解限定了只对jdbctype=tinyint类型起作用
@MappedJdbcTypes(JdbcType.TINYINT)
public class SexHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if ("女".equals(parameter)) {
            ps.setInt(i, 2);
        } else  {
            ps.setInt(i, 1);
        }
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return tansSex(rs.getInt(columnName));
    }

    private String tansSex(int sex) {
        if (sex == 1) {
            return "男";
        }
        return "女";
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return tansSex(rs.getInt(columnIndex));
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return tansSex(cs.getInt(columnIndex));
    }
}






    
        
        
        
        
    

    
        
        
    

    
    
        
    

    
    
        
            
            
                
                
                
                
            
        
    


    
        
    






    
        
        
        
        
        
        
    

    

    
        INSERT INTO
        mybatis_userinfo(`username`, `age`, `sex`, `create_time`, `update_time`)
        VALUES
        (#{username}, #{age}, #{sex,typeHandler=single.mybatis.mapper.typehandle.SexHandler}, #{createTime}, #{updateTime});

    
  

image

执行selectList方法,可以看到sex=1的变为转换成男了,在执行下insert方法看下是否会把性别转换成数据库对应的类型

image
image
image

可以看到,我们设置的性别‘女’也被映射成了2了,至此,TypeHandler使用结束了,可以定制很多个性化的操作,比如mysql中的json类型可以转换成java中的对象,新增的时候把对象转换成json存储,用法挺多的。

你可能感兴趣的:(mybatis之TypeHandler)