无需注解实现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
相关产品推荐
相关产品推荐

