Mybatis补充—类型转换器,关联关系,延迟加载

发布时间:2022-09-08 15:00

Mybatis补充—类型转换器,关联关系,延迟加载

类型转换器:

内置类型转换器:

自定义类型转换器:

1.实现接口TypeHandler

2.继承BaseTypeHandler

场景:有个java.util.Date在存入数据库的时候自动转换为timestamp时间戳,从数据库取值的时候把时间戳自动转换为java.util.Date

表结构

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userName` varchar(50) DEFAULT NULL,
  `userAge` int(11) DEFAULT NULL,
  `userAddress` varchar(200) DEFAULT NULL,
  `reg_time` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

一、自定义typeHandler 直接实现 TypeHandler 也可以继承 BaseTypeHandler,我们选择继承吧。



/**
 *   
 *  @ProjectName: springmvc-mybatis 
 *  @Description: 自定义处理日期Hander,
 *                将Date类型转换为时间戳字符串戳存入到数据库中
 *  1.@MappedJdbcTypes定义的是JdbcType类型,这里的类型不可自己随意定义,
 *   必须要是枚举类org.apache.ibatis.type.JdbcType所枚举的数据类型。
 *  2.@MappedTypes定义的是JavaType的数据类型,描述了哪些Java类型可被拦截。
 *  3.在我们启用了我们自定义的这个TypeHandler之后,数据的读写都会被这个类所过滤
 */
@MappedTypes({Date.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class MyDateTypeHandler extends BaseTypeHandler<Date> {
    /**
     * 将时间戳字符串存入数据库
     */
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        ps.setString(i, String.valueOf(parameter.getTime()));
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
        long timeLong = Long.parseLong(rs.getString(columnName));
        Date date = new Date();
        date.setTime(timeLong);
        return date;
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        long timeLong = Long.parseLong(rs.getString(columnIndex));
        Date date = new Date();
        date.setTime(timeLong);
        return date;
    }

    /**
     * 把时间戳类型的字符串取出转换为Date
     */
    @Override
    public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        long timeLong = Long.parseLong(cs.getString(columnName));
        Date date = new Date();
        date.setTime(timeLong);
        return date;
    }
}

二、在User.xml文件中写