`

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics