MyBatis中如何自定义类型处理器(TypeHandler)呢?
下文笔者通过示例方式讲述自定义类型处理器的简介说明,如下所示
1.创建数据表Status
CREATE TABLE `status` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(20) DEFAULT NULL, `status` int(11) DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
2.创建实体类UserStatus
@Data @NoArgsConstructor @AllArgsConstructor @Accessors(chain = true) public class UserStatus { private Integer id; private String username; private Status status; } 其中Status是一个枚举类型 public enum Status { LOGIN(200, "登录成功"), LOGOUT(300, "登出成功"), REMOVE(400, "用户不存在"); private Integer code; private String msg; Status(Integer code, String msg) { this.code = code; this.msg = msg; } public static Status getStatusByCode(Integer code) { switch (code) { case 200: return LOGIN; case 300: return LOGOUT; case 400: return REMOVE; default: return LOGOUT; } } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
3.创建对应的类型处理器
自定义类型处理器 只需要 ==实现TypeHandler接口 或 继承BaseTypeHandler即可== 其中的泛型是需要处理的类型 如: 我这里需要处理Status类型
//使用纯注解方式,这里需要配置MappedTypes注解,不然会不使用对应处理器 //从而导致该类型处理器不会生效,并出现`No enum constant...`异常等情况 @MappedTypes({Status.class}) @MappedJdbcTypes(value = JdbcType.INTEGER) public class MyEnumTypeHandler implements TypeHandler<Status> { //设置参数,在数据库中存储的应该为状态码,这个方法用来对数据库进行操作时,给数据库传递枚举参数时传递的是状态码 @Override public void setParameter(PreparedStatement ps, int i, Status parameter, JdbcType jdbcType) throws SQLException { ps.setInt(i, parameter.getCode()); } //用来查询操作,直接利用结果集返回,columnName为列名 @Override public Status getResult(ResultSet rs, String columnName) throws SQLException { int code = rs.getInt(columnName); return Status.getStatusByCode(code); } //用来查询操作,直接利用结果集返回,columnIndex是列索引 @Override public Status getResult(ResultSet rs, int columnIndex) throws SQLException { int code = rs.getInt(columnIndex); return Status.getStatusByCode(code); } //用来存储过程的查询操作,直接利用结果集返回,columnIndex是列索引 @Override public Status getResult(CallableStatement cs, int columnIndex) throws SQLException { int code = cs.getInt(columnIndex); return Status.getStatusByCode(code); } }
4.创建DAO
public interface StatusDao { @Select("select * from status where username=#{username};") public UserStatus getUserStatusByUsername(String username); @Select("select * from status where id=#{id};") public UserStatus getUserStatusByUserId(Integer id); @Insert("insert into status(username,status) values(#{username},#{status})") public Integer addUserStatus(@Param("username") String username, @Param("status") Status status); @Select("select * from status") public list<UserStatus> getAllUserStatus(); }
5.配置类型处理器
5.1 使用xml方式去进行配置 虽然说是使用xml,但是并不是完全的xml,当然也可以使用完全的xml去进行配置,下面采用的是混合的方式进行配置。 5.1.1 配置MyBatis的主配置文件 配置typeHandlers标签,配置typeHandler,配置handler,以及javaType以及jdbcType。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration> <typeHandlers> <typeHandler handler="com.wanna.config.typehandler.MyEnumTypeHandler" javaType="com.wanna.config.typehandler.Status" jdbcType="INTEGER"/> </typeHandlers> <mappers> <mapper resource="mybatis/mapper.xml"/> </mappers> </configuration> 5.1.2 在SqlSessionFactoryBean中配置configLocation @Bean public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); //设置数据源为druid sqlSessionFactoryBean.setDataSource(druidDataSource()); //设置configLocation sqlSessionFactoryBean.setConfigLocation(new ClassPathResource("mybatis/mybatis-config.xml")); return sqlSessionFactoryBean; }
5.2 直接使用SqlSessionFactoryBean去进行配置
使用这种方式去进行配置 需在类型处理器的类上 配置MappedTypes和MappedJdbcTypes 对应于xml配置文件中的javaTypes和jdbcTypes
@MappedTypes({Status.class}) @MappedJdbcTypes(value = JdbcType.INTEGER) @Bean public SqlSessionFactoryBean sqlSessionFactoryBean() { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); //设置数据源为druid sqlSessionFactoryBean.setDataSource(druidDataSource()); TypeHandler<?>[] handlers = new TypeHandler<?>[]{new MyEnumTypeHandler()}; sqlSessionFactoryBean.setTypeHandlers(handlers); return sqlSessionFactoryBean; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。