`

Mybatis类型转换javaType jdbcType

阅读更多

java有java的数据类型,数据库有数据库的数据类型,

那么在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库?

在从数据库读取数据的时候又是如何把数据库类型当做java类型来处理呢?

 

mybatis中jdbcType时间类型

jdbcType = DATE , 只传入年月日  (数据库中的时间为yyyy-MM-dd)

jdbcType = TIME , 只传入时分秒

jdbcType = TIMESTAMP ,  年月日+ 时分秒 (数据库中的时间为yyyy-MM-dd HH:mm:ss)

 


 

可以在result中设置jdbcType

<result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType="java.sql.Timestamp" /> 

 

Ibatis是怎么处理日期类型的

之前碰到过Oracle中的Date字段只剩下日期部分,数据丢失了。(oracle时间类型DATE:它可以保存日期和时间)

一些人的解决方法是将jdbcType指定为datetime。

其实这完全是瞎猫撞上死耗子,那个datetime根本没意义,却歪打正着。

 

一般的错误都是如下的配置jdbcType="DATE"(或者是pojo的属性为java.sql.Date类型):

<sqlMap namespace="Info" >  

  <resultMap id="Info" class="pojo.Info" >  

    <result column="INFO_BEGINTIME" property="begin" jdbcType="DATE" />  

    <result column="INFO_ENDTIME" property="end" jdbcType="DATE" />  

  </resultMap>

 ===========================================================

<result column="date" jdbcType="DATE" property="date" javaType="java.util.Date" />   

如果指定jdbcType="Date",此时不论你pojo.date中的字段类型(或者的javaType属性)是java.util.Date还是java.sql.Date,最终都会丢失数据。

实际上,在pojo.Info中的字段类型(或者javaType属性)为java.util.Date时,如果指定jdbcType为DATE或TIME(区分大小写),则将分别得到DateOnlyTypeHandler或TimeOnlyTypeHandler。

如果你不指定jdbcType,或者指定一个错误的值,例如datetime,或者xxxx等,都会得到DateTypeHandler(日期时间都会处理)。

 

如果pojo.date的字段类型(或者配置中的javaType属性)是java.sql.Date,则选择处理handler类时不会使用jdbcType,而是根据属性类型得到SqlDateTypeHandler(只包含日期)。

 

jdbcType 是否必须:

使用时不加jdbcType也可以正常运行, 当传入字段值为null时,需要jdbcType,否则报错。

在Ibatis的手册中,指出来jdbcType一般情况下是不用于判断处理方式的,大部分情况下是依据javaType或者pojo属性类型来判断处理方式,只有在少部分无法根据pojo属性类型判断的情况下才使用。(字段为null,或javaType没写)

优先级(jdbcType->javaType->pojo字段类型)

 

如果你用java.util.Date对应到MySQL则就是这种少数情况之一。

因为MySQL可以将多个数据库字段类型映射到java.util.Date,所以需要指定是DATE还是TIME(必须是大写),如果不指定则默认是完整的日期时间(此时按JDBC的timestamp操作)。

 

对于Mybatis操作Date/Time/DateTime,总结如下:

将pojo的属性类型设置为java.sql.Date(或java.sql.Time, java.sql.Timestamp),此时会严格遵循这三种类型的语义。但此方法因存在前文中提到的性能问题,在JDK1.6以前的JDK版本中能少使用就少使用。

在JDK1.6之前版本的构造java.sql.{Date|Time|TimeStamp}对象时存在性能问题,尤其是在多线程环境下更严重。这个Bug在这里。其原因是java.util.Date的相关方法调用了TimeZone.getDefaultRef(),而此方法是同步方法。

 

如果你想在pojo中使用java.util.Date, 则要注意:

完整的日期时间,要确保jdbcType为空,或jdbcType为DATE,TIME以外的值

只需要时间,要指定jdbcType=”TIME”

只需要日期,要指定jdbcType=”DATE”

  • 大小: 31.8 KB
分享到:
评论

相关推荐

    Mybatis类型转换介绍 TypeHandler

    在Mybatis中,TypeHandler起着至关重要的作用,它是Mybatis处理Java类型与JDBC类型之间转换的桥梁。这篇博文将深入探讨Mybatis的TypeHandler机制及其在实际开发中的应用。 TypeHandler的主要职责是将Java类型的参数...

    3、mybatis类型的定义方式

    首先,MyBatis提供了多种类型处理器(TypeHandler),它们是MyBatis在数据库与Java对象间进行类型转换的关键。类型处理器的作用在于,当SQL查询执行后,数据库返回的结果会被类型处理器转换为Java对象,反之,当执行...

    MyBatis常用的jdbcType数据类型

    在 MyBatis 框架中,`jdbcType` 起到了桥梁的作用,使得 Java 类型的数据能够正确地转换为 SQL 语句中的对应类型。以下是对 MyBatis 常用的 `jdbcType` 数据类型的详细解释: 1. **BIT**: 用于存储单个二进制位,...

    Mybatis实现自定义类型转换器TypeHandler的方法

    在MyBatis框架中,类型转换器TypeHandler扮演着至关重要的角色,它负责在Java对象与数据库之间的数据转换。在某些场景下,MyBatis内置的类型转换器可能无法满足我们的需求,这时就需要我们自定义TypeHandler。下面将...

    springboot--mybatis枚举自动转换实现.rar

    现在,当你在Mapper接口中使用`Gender`枚举类型时,MyBatis会自动使用我们定义的`GenderTypeHandler`进行转换。例如: ```java @Mapper public interface UserMapper { @Select("SELECT * FROM user WHERE gender...

    Mybatis Generator将tinyint映射成Integer的解决办法.pdf

    在使用MyBatis Generator生成Java ...理解这种类型的转换规则以及如何自定义映射关系,对优化MyBatis的使用和提高代码的可维护性至关重要。在实际开发中,应根据项目的具体需求和数据库设计来选择合适的方法进行处理。

    mybatis入门实战之枚举类型

    MyBatis的TypeHandler是处理Java类型与JDBC类型之间转换的关键组件。当我们在映射文件中配置SQL语句时,MyBatis会根据TypeHandler来处理Java对象与数据库字段之间的数据转换。对于枚举类型,MyBatis默认并没有内置的...

    mybatis-demo4-resultMap手动映射.zip

    MyBatis会根据此类型进行转换。 5. **jdbcType**:JDBC的类型,对应于SQL语句中的类型。在某些情况下,如Oracle的CLOB类型,可能需要指定。 6. **property**:Java对象的属性名,这个属性会接收来自数据库列的值。...

    mybatis文档

    - **typeHandlers**:类型处理器,它决定了 MyBatis 如何将特定类型的值在 JavaType、JdbcType 和 SQL 类型之间进行转换。 - **objectFactory**:指定创建具有延迟加载能力的对象所需的类。 - **plugins**:为 ...

    Mybatis resultMap

    6. `javaType` 和 `jdbcType`:指定Java类型和JDBC类型,用于数据转换。 7. `association`:用于处理一对一关联关系,内部还可以包含另一个ResultMap来映射关联的对象。 8. `collection`:用于处理一对多关联关系,...

    MyBatis-3-User-Guide

    - **类型处理器**:用于将预处理语句(PreparedStatement)的参数从JavaType转换到JdbcType,或者从数据库结果集中取出的数据转换为JavaType。 - **对象工厂**:控制MyBatis创建的新对象的实例化方式。 - **插件**:...

    第9章Mybatis映射篇之结果映射

    这里,`id`, `result`标签分别表示主键和普通字段,`property`属性对应Java对象的字段名,`column`属性对应数据库表的列名,`jdbcType`则是JDBC类型,用于优化数据类型转换。 Mybatis还支持关联映射,如一对多、多...

    mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    然而,默认情况下,MyBatis并不直接支持Java 8的日期时间类型。当尝试将`LocalDate`或`LocalDateTime`映射到数据库字段时,可能会遇到类型转换异常。 为了解决这个问题,我们可以采用以下步骤: 1. 添加MyBatis的...

    MyBatis3 用户指南 附JavaDB实例 pdf

    - 语法:`#{property}` 或 `#{property,javaType=int,jdbcType=INTEGER}`。 - **resultMap元素**:用于定义复杂结果映射规则。 - 关联属性:`id`, `resultType`, `association`, `collection`, `constructor`, `...

    Mybatis实现自定义的typehandler三步曲

    在Mybatis中,TypeHandler是一个关键组件,它负责Java类型与JDBC类型的转换。当数据库字段需要与Java对象中的特定类型进行映射时,Mybatis会使用预定义或自定义的TypeHandler。以下是对"Mybatis实现自定义的type...

    mybatis入门之级联1对1(无延迟加载)

    TypeHandler是MyBatis处理Java类型与JDBC类型之间转换的接口,用于处理自定义类型的字段。当数据库中的字段需要与Java的枚举类型进行映射时,我们就需要自定义TypeHandler。例如,如果我们有一个`Sex`枚举类型,我们...

    MyBatisGenerator 逆向工程代码自动生成

    - **实现方法**:通过配置文件中的`&lt;columnOverride&gt;`标签指定特定字段的注释,或者使用`&lt;javaType&gt;`和`&lt;jdbcType&gt;`属性来自动生成默认注释。 - **效果展示**:例如,对于一个名为`User`的实体类,可以通过配置使其...

    Mybatis源码研究之BoundSql.pdf

    - **#{}**:被解析成预编译语句中的参数,可以防止SQL注入攻击,并支持类型自动转换。 - **${}**:直接替换为字符串值,不会进行预编译处理,容易引发SQL注入攻击。 `#{}` 的使用格式一般为 `{property, jdbcType=...

    MyBatis自定义typeHandler的完整实例

    MyBatis是一个基于Java的持久层框架,提供了强大的数据持久化功能,而TypeHandler是MyBatis中一个非常重要的组件,负责将Java类型转换为数据库类型,反之亦然。在实际开发中,我们常常需要根据业务需求自定义Type...

    mybatis通用MapperUUID简单示例共3页.pd

    在处理UUID主键时,通用Mapper会自动调用自定义的TypeHandler进行转换,从而实现了对UUID类型的支持。这个示例的3页PDF文档很可能会详细介绍这些步骤,并提供更具体的代码示例和注意事项,帮助开发者更好地理解和...

Global site tag (gtag.js) - Google Analytics