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”