mybatis学习(一):XML配置-TypeHandler

类型处理器(typeHandlers)

无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从结果集中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。下表描述了一些默认的类型处理器。

提示 从 3.4.5 开始,MyBatis 默认支持 JSR-310(日期和时间 API)。

类型处理器Java 类型JDBC 类型
BooleanTypeHandlerjava.lang.Boolean, boolean数据库兼容的 BOOLEAN
ByteTypeHandlerjava.lang.Byte, byte数据库兼容的 NUMERICBYTE
ShortTypeHandlerjava.lang.Short, short数据库兼容的 NUMERICSMALLINT
IntegerTypeHandlerjava.lang.Integer, int数据库兼容的 NUMERICINTEGER
LongTypeHandlerjava.lang.Long, long数据库兼容的 NUMERICBIGINT
FloatTypeHandlerjava.lang.Float, float数据库兼容的 NUMERICFLOAT
DoubleTypeHandlerjava.lang.Double, double数据库兼容的 NUMERICDOUBLE
BigDecimalTypeHandlerjava.math.BigDecimal数据库兼容的 NUMERICDECIMAL
StringTypeHandlerjava.lang.StringCHAR, VARCHAR
ClobReaderTypeHandlerjava.io.Reader-
ClobTypeHandlerjava.lang.StringCLOB, LONGVARCHAR
NStringTypeHandlerjava.lang.StringNVARCHAR, NCHAR
NClobTypeHandlerjava.lang.StringNCLOB
BlobInputStreamTypeHandlerjava.io.InputStream-
ByteArrayTypeHandlerbyte[]数据库兼容的字节流类型
BlobTypeHandlerbyte[]BLOB, LONGVARBINARY
DateTypeHandlerjava.util.DateTIMESTAMP
DateOnlyTypeHandlerjava.util.DateDATE
TimeOnlyTypeHandlerjava.util.DateTIME
SqlTimestampTypeHandlerjava.sql.TimestampTIMESTAMP
SqlDateTypeHandlerjava.sql.DateDATE
SqlTimeTypeHandlerjava.sql.TimeTIME
ObjectTypeHandlerAnyOTHER 或未指定类型
EnumTypeHandlerEnumeration TypeVARCHAR 或任何兼容的字符串类型,用以存储枚举的名称(而不是索引值)
EnumOrdinalTypeHandlerEnumeration Type任何兼容的 NUMERICDOUBLE 类型,存储枚举的序数值(而不是名称)。
SqlxmlTypeHandlerjava.lang.StringSQLXML
InstantTypeHandlerjava.time.InstantTIMESTAMP
LocalDateTimeTypeHandlerjava.time.LocalDateTimeTIMESTAMP
LocalDateTypeHandlerjava.time.LocalDateDATE
LocalTimeTypeHandlerjava.time.LocalTimeTIME
OffsetDateTimeTypeHandlerjava.time.OffsetDateTimeTIMESTAMP
OffsetTimeTypeHandlerjava.time.OffsetTimeTIME
ZonedDateTimeTypeHandlerjava.time.ZonedDateTimeTIMESTAMP
YearTypeHandlerjava.time.YearINTEGER
MonthTypeHandlerjava.time.MonthINTEGER
YearMonthTypeHandlerjava.time.YearMonthVARCHARLONGVARCHAR
JapaneseDateTypeHandlerjava.time.chrono.JapaneseDateDATE

自定义typeHandler的方式:实现 org.apache.ibatis.type.TypeHandler 接口或者 继承org.apache.ibatis.type.BaseTypeHandler类。

案例:

字段JavaBean数据库
time1Datedate
time2Stringdate
time3Datevarchar

1、编写自定义typeHandler类。采用继承BaseTypeHandler

package com.zm.config;

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;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Auther: zhangmo
 * @Email : zhangmowx@163.com
 * @Date: 2019/12/13 20:38
 * @Description:
 */
public class MyDateTypeHandler extends BaseTypeHandler {
    
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Object o, JdbcType jdbcType) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ps.setString(i, sdf.format((Date) o));
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String columnValue = resultSet.getString(s);
        if (null != columnValue) {
            try {
                return sdf.parse(columnValue);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String columnValue = resultSet.getString(i);
        if (null != columnValue) {
            try {
                return sdf.parse(columnValue);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String columnValue = callableStatement.getString(i);
        if (null != columnValue) {
            try {
                return sdf.parse(columnValue);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}

  1. 配置typeHandler

    <typeHandlers>
        <typeHandler handler="com.zm.config.MyDateTypeHandler" javaType="Date" 		           jdbcType="VARCHAR"/>
    </typeHandlers>
    
  2. JavaBean

    public class DateBean {
        private Long id;
        private Date time1;
        private String time2;
        private Date time3;
    }
    
  3. Mapper.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper
            PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.zm.Mapper.DateBeanMapper">
        <select id="selectByID" resultType="com.zm.entity.DateBean" parameterType="long">
            select id,time1,time2,time3 from datebean where id = #{id}
        </select>
    
        <insert id="InsertDate" parameterType="com.zm.entity.DateBean" >
             insert into datebean(time1,time2,time3)
             values
             (
              #{time1,jdbcType=DATE},
             #{time2},
             #{time3,jdbcType=VARCHAR,typeHandler=com.zm.config.MyDateTypeHandler})
    
        </insert>
    
    </mapper>
    
  4. Insert操作

        @Test
        public void test4(){
            SqlSession session = sqlSessionFactory.openSession();
            DateBeanMapper DateBeanMapper = session.getMapper(DateBeanMapper.class);
            DateBean dateBean = new DateBean();
            dateBean.setTime1(new Date());
            dateBean.setTime2("2019-12-13 21:44:43");
            dateBean.setTime3(new Date());
            DateBeanMapper.InsertDate(dateBean);
            session.commit();
            session.close();
        }
    
  5. 查询操作

    @Test
    public void test5(){
        SqlSession session = sqlSessionFactory.openSession();
        DateBeanMapper DateBeanMapper = session.getMapper(DateBeanMapper.class);

        DateBean dateBean = DateBeanMapper.selectByID(2L);
        System.out.println(dateBean);
    }

  1. 测试结果说明

    Insert情况:

    1. time1,time2,time3都不设置jdbcType和typeHandler。 可以插入成功
      在这里插入图片描述

​ 2. time1,tiem2都不设置jdbcType和typeHandler,tiem3设置jdbcType和typeHandler。在MyDateTypeHandler类中打断点,Debug模式可以进入到方法中。
在这里插入图片描述
在这里插入图片描述

​ select情况:

​ 在MyDateTypeHandler类中打断点,Debug模式可以进入到方法中。

在这里插入图片描述

从上述几种情况总结:如果设置了TypeHandler,mybatis会根据TypeHandler的设置进行转换。

如果没设置TypeHandler,mybatis会自动选择合适的TypeHandler进行转换。

mybatis提供了大量的TypeHandler(具体可运行如下方法查看)。因此一般情况下,不需要自定义开发TypeHandler(枚举类型除外)。

	/**
     * 查看mybatis默认的typeHandler
     */
    @Test
    public void test6() {
        SqlSession session = sqlSessionFactory.openSession();
        TypeHandlerRegistry typeHandlerRegistry = session.getConfiguration().getTypeHandlerRegistry();
        Collection<TypeHandler<?>> handlers = typeHandlerRegistry.getTypeHandlers();
        System.out.println(handlers.size());
        for (TypeHandler<?> typeHandler : handlers) {
            System.out.println(typeHandler.getClass().getName());
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值