mybatis 类型转换器 LocalDateTimeTypeHandler

1、LocalDateTimeTypeHandler是mybatis实现的LocalDateTime与mysql日期类型的交互。

2、无论是 MyBatis 在预处理语句(PreparedStatement)中设置一个参数时,还是从数据库中取出一个值时, 都会用类型处理器将获取的值以合适的方式转换成 Java 类型。

 

3、默认的TypeHandlers

TypeHandler类         java类型                   数据库类型    

BooleanTypeHandler	java.lang.Boolean, boolean	数据库兼容的 BOOLEAN
ByteTypeHandler	java.lang.Byte, byte	数据库兼容的 NUMERIC 或 BYTE
ShortTypeHandler	java.lang.Short, short	数据库兼容的 NUMERIC 或 SMALLINT
IntegerTypeHandler	java.lang.Integer, int	数据库兼容的 NUMERIC 或 INTEGER
LongTypeHandler	java.lang.Long, long	数据库兼容的 NUMERIC 或 BIGINT
FloatTypeHandler	java.lang.Float, float	数据库兼容的 NUMERIC 或 FLOAT
DoubleTypeHandler	java.lang.Double, double	数据库兼容的 NUMERIC 或 DOUBLE
BigDecimalTypeHandler	java.math.BigDecimal	数据库兼容的 NUMERIC 或 DECIMAL
StringTypeHandler	java.lang.String	CHAR, VARCHAR
ClobReaderTypeHandler	java.io.Reader	-
ClobTypeHandler	java.lang.String	CLOB, LONGVARCHAR
NStringTypeHandler	java.lang.String	NVARCHAR, NCHAR
NClobTypeHandler	java.lang.String	NCLOB
BlobInputStreamTypeHandler	java.io.InputStream	-
ByteArrayTypeHandler	byte[]	数据库兼容的字节流类型
BlobTypeHandler	byte[]	BLOB, LONGVARBINARY
DateTypeHandler	java.util.Date	TIMESTAMP
DateOnlyTypeHandler	java.util.Date	DATE
TimeOnlyTypeHandler	java.util.Date	TIME
SqlTimestampTypeHandler	java.sql.Timestamp	TIMESTAMP
SqlDateTypeHandler	java.sql.Date	DATE
SqlTimeTypeHandler	java.sql.Time	TIME
ObjectTypeHandler	Any	OTHER 或未指定类型
EnumTypeHandler	Enumeration Type	VARCHAR 或任何兼容的字符串类型,用以存储枚举的名称(而不是索引值)
EnumOrdinalTypeHandler	Enumeration Type	任何兼容的 NUMERIC 或 DOUBLE 类型,存储枚举的序数值(而不是名称)。
SqlxmlTypeHandler	java.lang.String	SQLXML
InstantTypeHandler	java.time.Instant	TIMESTAMP
LocalDateTimeTypeHandler	java.time.LocalDateTime	TIMESTAMP
LocalDateTypeHandler	java.time.LocalDate	DATE
LocalTimeTypeHandler	java.time.LocalTime	TIME
OffsetDateTimeTypeHandler	java.time.OffsetDateTime	TIMESTAMP
OffsetTimeTypeHandler	java.time.OffsetTime	TIME
ZonedDateTimeTypeHandler	java.time.ZonedDateTime	TIMESTAMP
YearTypeHandler	java.time.Year	INTEGER
MonthTypeHandler	java.time.Month	INTEGER
YearMonthTypeHandler	java.time.YearMonth	VARCHAR 或 LONGVARCHAR
JapaneseDateTypeHandler	java.time.chrono.JapaneseDate	DATE

4、自定义TypeHandler
        你可以重写类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.BaseTypeHandler, 然后可以选择性地将它映射到一个 JDBC 类型。比如:

package com.zoomclass.servicebase.handler;

import org.apache.ibatis.type.LocalDateTimeTypeHandler;
import org.springframework.stereotype.Component;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneOffset;

/**
 * 处理mysql中date为空 LocalDateTime
 *
 * @author
 */
@Component
public class MyLocalDateTimeTypeHandler extends LocalDateTimeTypeHandler {

    @Override
    public LocalDateTime getResult(ResultSet rs, String columnName) throws SQLException {
        Object object = rs.getObject(columnName);
        if(object==null){
            return  null;
        }

        System.out.println(object);
        // 如有需要 在这里强行转换,将sql的时间转换为LocalDateTime
//        if(object instanceof java.sql.Timestamp){
//            //可以根据自己的需要进行转化
//            return LocalDateTime
//                    .ofInstant(((Timestamp)object).toInstant(), ZoneOffset.ofHours(0));
//        }

        return super.getResult(rs, columnName);
    }
}
import org.apache.ibatis.type.*;

import java.sql.*;

/**
 * 必须继承BaseTypeHandler 或者实现 TypeHandler接口
 * 加了下面连个注解之后就不用在xml里面写jdbctyoe 和 javatype了
 */
@MappedJdbcTypes({JdbcType.TINYINT})
@MappedTypes({java.lang.String.class})
public class MyTypeHandler extends BaseTypeHandler {

    @Override
    public void setNonNullParameter(PreparedStatement preparedStatement, int i, Object param, JdbcType jdbcType) throws SQLException {
        System.out.println("**********************入参转换************************************");
        Boolean parameter = (Boolean) param;
        preparedStatement.setInt(i, parameter ? 1 : 0);

    }

    @Override
    public Object getNullableResult(ResultSet resultSet, String s) throws SQLException {
        System.out.println("********************结果转换******************************");
        //把数字转为boolean
        return resultSet.getInt(s) == 1 ? Boolean.TRUE : Boolean.FALSE;
    }

    @Override
    public Object getNullableResult(ResultSet resultSet, int i) throws SQLException {
        return null;
    }

    @Override
    public Object getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
        return null;
    }
}


 

 

 

### MyBatis 中 JavaType 的使用与配置 在 MyBatis 配置过程中,`JavaType` 是指映射到数据库列的 Java 类型。为了确保数据能够正确地从 SQL 查询结果转换成相应的 Java 对象属性,MyBatis 使用 `javaType` 来指定这些类型。 #### 映射文件中的定义方式 当编写 XML 映射文件时,可以通过 `<resultMap>` 标签下的子标签来设置具体的字段映射关系,并利用 `javaType` 属性明确指出目标对象成员变量的数据类型: ```xml <resultMap id="userResultMap" type="User"> <id property="id" column="USER_ID" javaType="int"/> <result property="username" column="USERNAME" javaType="String"/> </resultMap> ``` 上述代码片段展示了如何为每个单独的结果集条目设定对应的 Java 数据类型[^1]。 #### 自动映射机制 对于简单的场景,默认情况下 MyBatis 可以自动完成基本类型的匹配工作。然而,如果遇到复杂结构或者希望自定义某些行为,则可能需要关闭默认的行为并手动调整映射逻辑。此时可以借助于 `getConfiguration()` 方法获得当前环境下的全局配置实例,进而修改其中有关映射器的具体参数设置[^2]。 #### 处理特殊类型 有时应用程序可能会涉及到一些非常规的数据存储需求,比如枚举类、日期时间戳等非标准SQL支持的对象。这时就需要特别关注 `typeHandlers` 的注册情况——即告诉框架怎样把特定种类的信息存入/取出数据库表单之中。例如,针对 `LocalDateTime` 这样的现代 API 时间表示形式,应当提供专门处理器以便准确无误地执行 CRUD 操作[^4]。 ```java @Configuration public class MyBatisConfig { @Bean public LocalDateTimeTypeHandler localDateTimeTypeHandler(){ return new LocalDateTimeTypeHandler(); } } ``` 以上示例说明了如何创建一个新的 Bean 定义用于处理 `LocalDateTime` 类型转换的任务。 #### 解决常见问题 - **无法识别自定义类型**:确认已经正确定义了 Type Handler 并将其加入到了 MyBatis 的上下文中; - **数值溢出错误**:检查所使用的 `javaType` 是否适合实际业务范围内的最大最小值限制; - **字符编码乱码现象**:核查 JDBC URL 参数以及驱动程序版本是否兼容 UTF-8 编码方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值