You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需注解实现MyBatis自定义类型转换器的方法示例

嗨Sreekanth!完全可以不用注解实现JDBC整数到自定义类的映射,MyBatis的XML配置就能搞定,我给你一步步拆解示例,一看就懂~

不用注解实现整数到自定义类的映射方案

1. 先定义你的自定义类

假设我们要把数据库里的整数状态码映射到一个UserStatus类,先写好这个类:

public class UserStatus {
    private int code;

    // 构造方法
    public UserStatus(int code) {
        this.code = code;
    }

    // Getter & Setter
    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    // 静态方法:根据整数码快速创建实例(TypeHandler里会用到)
    public static UserStatus fromCode(int code) {
        return new UserStatus(code);
    }
}

2. 实现自定义TypeHandler

TypeHandler是MyBatis处理类型转换的核心组件,我们写一个继承自BaseTypeHandler的实现类,不用加任何注解:

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserStatusTypeHandler extends BaseTypeHandler<UserStatus> {

    // 把自定义类对象写入JDBC语句(比如插入/更新时用)
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, UserStatus parameter, JdbcType jdbcType) throws SQLException {
        ps.setInt(i, parameter.getCode());
    }

    // 从ResultSet按列名读取整数,转成自定义类
    @Override
    public UserStatus getNullableResult(ResultSet rs, String columnName) throws SQLException {
        int code = rs.getInt(columnName);
        return rs.wasNull() ? null : UserStatus.fromCode(code);
    }

    // 从ResultSet按列索引读取整数,转成自定义类
    @Override
    public UserStatus getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        int code = rs.getInt(columnIndex);
        return rs.wasNull() ? null : UserStatus.fromCode(code);
    }

    // 从CallableStatement读取输出参数,转成自定义类
    @Override
    public UserStatus getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        int code = cs.getInt(columnIndex);
        return cs.wasNull() ? null : UserStatus.fromCode(code);
    }
}

3. 在MyBatis核心配置文件注册TypeHandler

打开你的mybatis-config.xml,在<typeHandlers>节点里注册刚才写的TypeHandler,完全用XML配置,不用注解:

<configuration>
    <!-- 这里可以保留你原本的环境、mapper扫描等配置 -->
    <typeHandlers>
        <!-- 替换成你自己的包路径 -->
        <typeHandler 
            handler="com.yourpackage.UserStatusTypeHandler" 
            javaType="com.yourpackage.UserStatus" 
            jdbcType="INTEGER"/>
    </typeHandlers>
</configuration>

4. 在Mapper XML中使用映射

现在就可以在你的Mapper XML里直接用这个类型映射了,举两个常用场景:

查询结果映射(用resultMap)

<resultMap id="UserResultMap" type="com.yourpackage.User">
    <id property="id" column="id"/>
    <result property="username" column="username"/>
    <!-- 指定字段映射到自定义类 -->
    <result property="status" column="status" javaType="com.yourpackage.UserStatus" jdbcType="INTEGER"/>
</resultMap>

<select id="getUserById" resultMap="UserResultMap">
    SELECT id, username, status FROM user WHERE id = #{id}
</select>

插入数据时的参数映射

<insert id="insertUser" parameterType="com.yourpackage.User">
    INSERT INTO user (username, status) 
    VALUES (#{username}, #{status, javaType=com.yourpackage.UserStatus, jdbcType=INTEGER})
</insert>

这样就完全摆脱注解啦!所有的类型转换逻辑都通过XML配置和自定义TypeHandler实现,如果你有其他类似的自定义类型,只需要重复这个模式就行。

内容的提问来源于stack exchange,提问作者Shreek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:08