设为首页 收藏本站
查看: 792|回复: 0

[经验分享] Mybatis类型转换javaType jdbcType

[复制链接]

尚未签到

发表于 2016-11-26 02:48:53 | 显示全部楼层 |阅读模式
  java有java的数据类型,数据库有数据库的数据类型,
  那么在往数据库中插入数据的时候是如何把java类型当做数据库类型插入数据库?
  在从数据库读取数据的时候又是如何把数据库类型当做java类型来处理呢?
  mybatis中jdbcType时间类型
  jdbcType = DATE , 只传入年月日  (数据库中的时间为yyyy-MM-dd)
  jdbcType = TIME , 只传入时分秒
  jdbcType = TIMESTAMP ,  年月日+ 时分秒 (数据库中的时间为yyyy-MM-dd HH:mm:ss)
DSC0000.jpg
 

  可以在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”

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-305475-1-1.html 上篇帖子: 看看mybatis 源代码 下篇帖子: mybatis 多数据源配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表