java日期类型对象通过mybatis向数据库中的存取

java日期类型对象通过mybatis向数据库中的存取

一、数据库中的日期数据类型

  数据库中的日期数据类型有四种:date、datetime、timestimp、time。date类型只保存年月日,不保存时分秒,datetime和timestimp保 存年月日时分秒,time只保存时分秒。数据库字段值进行比较时,date只比较年月日,datetime和timestimp比较年月日时分秒,time只比较 时分秒。
  datetime、timestimp在数据库中的存储结构不一样,timestimp更节省空间,但对于java对象的存取都是一样的。

二、java中的四种日期类型:java.util.Date、java.sql.date、timestimp、time。

  (1)java.sql.date、timestimp、time都在java.sql包下,都是java.util.date类的子类。java.sql包下的date显示年月日, timestimp显示年月日时分秒,time显示时分秒,java.sql.date显示年月日时分秒。
  (2)这四种日期类型内部保存的都是时间戳。虽然java.sql.date、time值显示年月日或时分秒,但其内部保存的都是完整的时间 戳,因此当把java.sql.date、time转型为java.uitl.Date类型时,还是能显示完整的年月日时分秒。
  (3)直接System.out.println(java.sql.date)显示年月日,System.out.println(java.sql.time)显示时分秒。但是通过
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String str = simpleDateFormat.format(objDate)
  无论objDate是四种类型中的任何类型,返回的str字符串都是准确的完整的年月日时分秒。因simpleDateFormat.format()方法的 参数是类型时java.util.Date类型,java.sql.date、timestimp、time会自动转为java.util.Date类型。

三、数据库中的四种日期数据类型通过mybatis逆向工程生成的实体类对应属性的类型都是java.util.Date(不是java.sql.Date)类型。

-----java.util.Date类型的java数据保存-----

  (1)java.util.Date类型的java数据(如2019-05-08 14:56:23)向数据库date类型字段存值时,会忽略掉Date java对象中的时分秒 ,只保存年月日(2019-05-08),当再从数据库中读取date类型字段值赋值为java的Date对象时,Date对象的值为2019-05-08 00:00:00,时 分秒变成00:00:00,保存到数据库之前的原有的时分秒(14:56:23)丢失。
  (2)java.util.Date类型的java数据(如2019-05-08 14:56:23)向数据库datetime、timestimp类型字段存值时,其年月日时分秒 都会保存,再从数据库中取值赋给Date对象,还是2019-05-08 14:56:23
  (3)java.util.Date类型的java数据(如2019-05-08 14:56:23)向数据库time类型字段存值时,会忽略掉年月日,只保存时分秒 ,当再从数据库中读取time类型字段值赋值为java的Date对象时,Date对象的值为1970-01-01 14:56:23,保存到数据库之前的原有的年月日 信息(2019-05-08)丢失。   

-----java.sql.Date类型的java数据保存-----

  (1)java.sql.Date类型的java数据向数据库date类型字段存值时,因java.sql.Date只会显示年月日不显示时分秒,因此只保存年月 日(如2019-05-08),当再从数据库中读取date类型字段值赋值为java的Date对象时,Date对象的值为2019-05-08。
  (2)java.sql.Date类型的java数据向数据库datetime、timestimp类型字段存值时,因java.sql.Date只会显示年月日不显示时分 秒(即使对象内部保存的是时间戳,有时分秒信息),保存到数据库datetime、timestimp类型字段的值为2019-05-08 00:00:00,再从数 据库中取值赋给Date(无论是java.util.Date还是java.sql.Date)对象,值为2019-05-08 00:00:00
  (3)java.sql.Date类型的java数据向数据库time类型字段存值时,因java.sql.Date只会显示年月日不显示时分秒(即使对象内部 保存的是时间戳,有时分秒信息),因此会报错,存储失败。

-----java.sql.Time类型的java数据保存-----

  (1)因time类型只显示时分秒如:12:12:12,因此向数据库time字段保存时,只保存时分秒,当在从数据库取值赋值给Time对象, Time对象如果转为java.util.Date对象,其年月日信息丢失,显示为1970-01-01 12:12:12;
  (2)因time类型只显示时分秒,当向数据库date、datetime、timestimp字段存值时会报错。

  注:java.sql.Timestimp类型的java数据保存和java.util.Date的保存情况一样

  当从数据库中读取数据存入java对象时。java.util.Date存储读取的年月日时分秒,java.sql.Date只存储读取的年月日,即使读取的数据库 字段是datetime字段,有时分秒,如果用java.sql.Date接收读取的数据,还是值存年月日,即使java.sql.Date转成java.util.Date对象, 时分秒的值还是00:00:00。Time对象只存储数据库从读取的时分秒值,年月日为1970-01-01

四、mybatis的mapper配置文件中的jdbctype

  jdbctype相当于是一个数据拦截器,当向数据库存取时,jdbctype在入库之前起作用,当从获取库取数据时,jdbctype在从数据库 取出数值时候和向java对象赋值之前起拦截作用。

  

1 <resultMap id="BaseResultMap" type="test.entity.Datetest" >
 2     <id column="id" property="id" jdbcType="INTEGER" />
 3     <result column="datestimp" property="datestimp" jdbcType="TIMESTAMP" />
 4     <result column="datetest" property="datetest" jdbcType="DATE" />
 5     <result column="time" property="time" jdbcType="TIME" />
 6   </resultMap>
 7 
 8 <insert id="insert" parameterType="test.entity.Datetest" >
 9     insert into datetest (id, datestimp, datetest, time)
10         values (#{id,jdbcType=INTEGER}, #{datestimp,jdbcType=TIMESTAMP}, #{datetest,jdbcType=DATE}, #{time,jdbcType=TIME})
11   </insert>

  mybatis逆向工程生产的mapper文件的jdbctype的设置为:
    (1)date类型字段对应的jdbctype类型为jdbcType="DATE"。
    (2)datetime和timestimp类型字段对应的为jdbcType="TIMESTAMP"
    (3)time字段对应个为jdbcType="TIME"
  注意:只有当java对象为java.util.Date类型时,jdbcType对数据的存取才起作用,对其他的java时间对象,jdbcType没有作用。  

  jdbcType类型对java.util.Date日期数据向数据库存取的影响:
  (1)当jdbcType="DATE",当向数据库存取数据时会过滤掉时分秒。无论数据库中的字段是date、datetime、timestimp中的哪一种,最终保存的都只有年月日,如果字段类型为datetime、 timestimp,时分秒信息为00:00:00。如果java对象类型为time或者数据库字段类型为time类型,会报错。当从数据库中取数据是,无论数据字段类型为date、datetime、timestimp、time哪一种,最终取到的只有年月日,时分秒 为00:00:00。从time字段取值存到java的date对象显示为1970-01-01 00:00:00。
  (2)当jdbcType="TIMESTAMP"时,jdbcType不过滤任何内容,对存取没影响。
  (3)当jdbcType="TIME"时,当向数据库存取数据时会过滤掉年月日。向数据库中存数据,如果数据库字段为date、datetime、timestimp会报错。从数据库取数据存入java的date对象时,年月日都会变成1970-01-01
  可以不设置jdbcType时,不设置jdbctype相当于少了一层数据拦截。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【资源说明】 Java基于mybatis数据库加密项目源码+项目使用说明.zip 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 一、说明 在某些涉及到数据安全的场景(如客户数据),为了防止脱库或者少数需要做数据安全防范的场景。需要针对数据做加密,但通常整库加密的时候直接使用数据库自带的加密即可。 本代码库基于MyBatis数据库列加密库。现行很多解决方案要么是基于整库实施, 要么就是基于没有办法实现加密以后的LIKE查询。通常情况下,普通业务最多只需要对部分字段进行加密即可。因此,开发了这个库。 ### 设计思路 基于MyBatis的Alias与TypeHandler。其,com.stableforever.mybatis.encryption.alias.EncryptedString为用于HOLD加密数据的类Alias。com.stableforever.mybatis.encryption.handler.EncryptedStringHandler为具体的TypeHandler,用于处理数据库查询的入参时,自动把未加密的字符串转换为加密格式;同时,从数据库查询结果当读取数据时自动把数据解密。 三、关于样例的说明 样例目录:examples/spring-boot-example/ 样例使用的数据库:mariadb(mysql同样适用) 数据库脚本:examples/spring-boot-example/src/main/resources/testdb.sql 如果你有更多的alias或者handler,根据mybatis的说明,你的spring boot配置当可以使用逗号分隔,像这样写:xxxx.xxx,xxxx.xxxx 【备注】 更多项目详情见资源的项目说明文件!!!
教务系统是一个用于管理学校教务工作的软件系统,包括学生信息管理、课程管理、考试管理、成绩管理等功能。Java是一种面向对象的编程语言,广泛应用于开发各种类的应用程序。 教务系统的开发,可以使用Java编写后端的业务逻辑代码,以实现系统的各项功能。比如,可以使用Java编写学生信息的增删改查等功能的代码、课程管理的代码、考试管理的代码、成绩管理的代码等。这些代码通过与数据库进行交互,实现数据的存取和操作。在Java,可以使用JDBC或者ORM框架如Hibernate、MyBatis等来与数据库进行交互。 数据库是教务系统存储数据的地方,可以使用关系数据库如MySQL、Oracle等或者非关系数据库如MongoDB等来存储数据。数据库表的设计需要根据教务系统的功能来定义,比如可以设计学生表、课程表、考试表、成绩表等。在数据库,可以使用SQL语句来创建表、插入数据、更新数据、删除数据等操作。 教务系统的数据流通常是:用户通过前端界面输入相关信息,前端界面调用后端的Java代码处理用户输入和业务逻辑,并将结果存储到数据库。当用户需要查询或修改数据时,后端的Java代码将从数据库获取相应的数据并返回给前端界面进行展示或操作。 通过以上的代码和数据库的配合,教务系统可以实现学生信息的录入、查询、修改和删除,课程的开设、查询和修改,考试的安排、查询和成绩的录入等功能。同时,Java代码和数据库的结合可以保证数据的安全性和一致性,提高教务系统的稳定性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xidianzxm

您的打赏是我继续创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值