Mybatis自定义TypeHandler
来源:互联网 发布:国家行政学院博士 知乎 编辑:程序博客网 时间:2024/06/06 01:39
先介绍业务模型:
一个学生类。
public class Student { private long id; private String studentName;// 姓名 private Sex sex;// 性别 private int selfcardNo;// 学生证号 private String note; private StudentSelfcard studentSelfcard;// 级联的学生证类}
性别枚举类:
public enum Sex { MALE(1,"男"), FEMALE(2, "女"); private int id; private String name;}
需求是性别在数据库中使用int存储,在Java中使用枚举类,这个时候如果想让Mybatis为我们将数据库中的学生表绑定为学生对象,需要自定义一个枚举类型处理器。
分为几步:
一、写一个实现TypeHandler接口的自定义TypeHandler,如下:
@MappedTypes({Sex.class})@MappedJdbcTypes(JdbcType.INTEGER)public class SexEnumTypeHandler implements TypeHandler<Sex> { public void setParameter(PreparedStatement preparedStatement, int i, Sex sex, JdbcType jdbcType) throws SQLException { preparedStatement.setInt(i, sex.getId());} public Sex getResult(ResultSet resultSet, String s) throws SQLException { int id = resultSet.getInt(s); return Sex.getSex(id); } public Sex getResult(ResultSet resultSet, int i) throws SQLException { int id = resultSet.getInt(i); return Sex.getSex(id); } public Sex getResult(CallableStatement callableStatement, int i) throws SQLException { int id = callableStatement.getInt(i); return Sex.getSex(id); }}
二、 在Mybatis配置文件中配置。
<!--注册类型处理器--> <typeHandlers> <typeHandler handler="com.lrx.dao.SexEnumTypeHandler" javaType="com.lrx.model.Sex" jdbcType="INTEGER"/> </typeHandlers>
三、在需要使用此TypeHandler的地方注明。(Mapper配置文件中)
<mapper namespace="com.lrx.dao.StudentMapper"> <resultMap id="findStudentByIdMap" type="com.lrx.model.Student"> <id column="id" property="id"/> <result column="student_name" property="studentName" typeHandler="com.lrx.dao.MyStringTypeHandler"/> <!--自定义的类型处理器,处理数据库中integer类型和Java的枚举类型的转换--> <result column="sex" property="sex" typeHandler="com.lrx.dao.SexEnumTypeHandler"/> <result column="selfcard_no" property="studentName"/> <result column="note" property="note"/> <!--级联属性--> <association property="studentSelfcard" column="id" select="com.lrx.dao.StudentSelfcardMapper.findStudentSelfCardByStudentId"/> </resultMap> <select id="findStudentById" parameterType="int" resultMap="findStudentByIdMap"> SELECT id, student_name, sex, selfcard_no, note FROM t_student WHERE id = #{stuId} </select></mapper>
这个时候就可以写一个测试类测试一下自定义的TypeHandler是否正常工作了。当我测试时,出现了如下异常:
Cause: org.apache.ibatis.executor.ExecutorException: No constructor found in com.lrx.model.Student matching [java.lang.Long, java.lang.String, java.lang.Integer, java.lang.Integer, java.lang.String]
似乎是因为没有相应的构造函数,当我加上构造函数时,依旧报错,于是我将错误原因定位到了没有将自定义的TypeHandler成功配置。经过反反复复的查看,我确定自定义的TypeHandler是可以工作的。没办法,只好Google一下,发现这个原因竟然是因为没有默认的构造函数造成的,加上之后,成了。
经过思考,初步认为,Mybatis会在将数据库中的表绑定为实体类时,会先去找有没有对应参数类型的构造方法,没有的话会调用默认构造方法(如果自己定义了一个构造方法会覆盖默认方法),由于数据库中sex属性使用int表示,TypeHandler不会在此时调用,故没有对应的构造方法,这个时候又没有默认的构造方法,所以报了异常。
阅读全文
0 0
- Mybatis自定义typehandler
- MyBatis-自定义typeHandler
- Mybatis 自定义 TypeHandler
- Mybatis自定义TypeHandler
- mybatis typeHandler自定义类型转换器
- mybatis typeHandler自定义类型转换器
- mybatis typeHandler自定义类型转换器
- MyBatis自定义数据映射TypeHandler
- mybatis typeHandler自定义类型转换器
- MyBatis自定义数据映射TypeHandler
- mybatis学习笔记--typehandler自定义类型转换
- mybatis自定义类型转换(typeHandler)
- Mybatis实现自定义的类型转换器TypeHandler
- mybatis自定义typeHandler映射对象为JSON
- Mybatis实现自定义的类型转换器TypeHandler
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之自定义TypeHandler处理枚举
- Mybatis实战之自定义TypeHandler处理枚举
- 浅析c++中virtual关键字
- 手机的存储结构
- (目前WA)hihocoder1264-神奇字符串-JAVA版
- hdu 6025 gcd+前缀和+后缀和
- Storm原理
- Mybatis自定义TypeHandler
- Spring Boot 集成Shiro和CAS
- leetcode611. Valid Triangle Number
- u-boot移植(二)支持串口及u-boot框架
- 【转载】ABAP MIGO 冲销 BAPI_GOODSMVT_CANCEL 源代码
- 一个Java的简单小程序(2)
- Springboot 整合 Dubbo/ZooKeeper 详解 SOA 案例
- 嵌入式中C语言volatile和const的作用
- 【剑指offer】面试题 7:重建二叉树