IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> mybatis中关于日期类型问题汇总 -> 正文阅读

[Java知识库]mybatis中关于日期类型问题汇总

mybatis中关于日期类型问题汇总

mybatis中jdbcType属性

我们平时开发时候,编写三层架构值dao对应的mapper文件,编写java类映射数据库字段,有个字段jdbcType,很少人注意到。

<insert id="insertALl" parameterType="java.util.List">
insert into table values(name = #{name,jdbcType=VARCHAR})
</insert>

好比这个SQLjdbcType=VARCHAR,这是为了程序的安全性,一些特殊情况,传入的参数为name空,不会使得程序出现问题,name为空,mybatis不知道具体要转换什么类型jdbcType类型,会报错,mybatis出现:无效的列类型:1111错误,就是因为没有设置jdbcType造成的,下面是jdbcType和java类型对应

jdbc typejava type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
BOOLEAN boolean
TINYINTbyte
SMALLINT short
INTEGERINTEGER
BIGINTlong
FLOAT double
DOUBLEdouble
BINARY byte[]
VARBINARY byte[]
LONGVARBINARYbyte[]
DATE java.sql.Date
TIMEjava.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOBBlob
ARRAY Array

动态SQL中if关于日期类型判断

1、判断日期需要进行转义

<where>
    <if test="start_time!=null and start_time!=''">
        /*方法一*/
        <![CDATA[AND DATE_FORMAT(start_time, '%Y-%m-%d')>=  DATE_FORMAT(#{start_time}, '%Y-%m-%d')]]>
    </if>
    <if test="end_time!=null and end_time!=''">
        /*方法二*/
        and end_time<![CDATA[  <=  ]]>#{end_time}
    </if>
</where>

2、不要和空字符串比较

<if test="createTime != null and createTime !='' " >
    date(create_time) =date(#{createTime,jdbcType=TIMESTAMP})
</if>
改为
<if test="createTime != null">
    date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})
</if>

springboot中date类型数据作为参数在postman

1、注意postman入参日期模式和对应实体类日期模式不一样
2021-10-11 =》2021/10-11

mybatis异常invalid comparison: java.util.Date and java.lang.String

mybatis 3.3.0中对于时间参数进行比较时的一个bug. 如果拿传入的时间类型参数与空字符串’'进行对比判断则会引发异常. 所以在上面的代码中去掉该判断, 只保留非空判断就正常了

<if test="createTime != null and createTime !='' " >
    date(create_time) =date(#{createTime,jdbcType=TIMESTAMP})
</if>
改为
<if test="createTime != null">
    date(create_time) = date(#{createTime,jdbcType=TIMESTAMP})
</if>

No enum constant org.apache.ibatis.type.JdbcType.date

在ibatis中不需要关注这些参数 而转到mybatis后 如果字段值为空 必须设置jdbcType

<select id="findEmpDepts" parameterType="com.geekmice.springbootoraclecrud.vo.EmpDeptVo" resultType="java.util.Map">
		SELECT T1.EMPNO,
	       T1.ENAME,
	       T1.JOB,
	       T1.MGR,
	       T1.HIREDATE,
	       T1.SAL,
	       T1.COMM,
	       T2.LOC,
	       T2.DNAME
	  FROM EMP T1
	 INNER JOIN DEPT T2
	    ON T1.DEPTNO = T2.DEPTNO
		<where>
			<if test="'' != eName and eName != null">T1.ENAME=#{eName,jdbcType=VARCHAR}</if>
			<if test="'' !=job  and job != null">T1.job=#{job,jdbcType=VARCHAR}</if>
			<if test="'' !=mgr  and mgr != null">T1.mgr=#{mgr,jdbcType=VARCHAR}</if>
			<if test="'' !=hireDate and hireDate != null">T1.HIREDATE=#{hireDate,jdbcType=DATE}</if>
			<if test="'' !=loc and loc != null">T1.LOC=#{loc,jdbcType=VARCHAR}</if>
			<if test="'' !=dName and dName != null">T1.DNAME=#{dName,jdbcType=VARCHAR}</if>
		</where>
	</select>

解决日期转换异常 JSON parse error: Cannot deserialize value of type java.util.Date from String

方案1
入参的bean中日期类型需要加上注解@JsonFormat,可以指定模式,东八区问题

@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")

转换默认格式为:年月日,如果传入的日期字符串没有包含 时分秒,则不需要增加注解,pattern 为当前接收的时间格式

方案2
postman入参日期模式和@jsonFormat不一致

方案3
mybatis关于日期的mapper文件中if判断去掉和空字符串比较

<if test="hireDate != null">T1.HIREDATE=#{hireDate,jdbcType=DATE}</if>

@JsonFormat和@DateTimeFormat

从数据库获取时间传到前端进行展示的时候,我们有时候可能无法得到一个满意的时间格式的时间日期,在数据库中显示的是正确的时间格式,获取出来却变成了很丑的时间戳,@JsonFormat注解很好的解决了这个问题,我们通过使用@JsonFormat可以很好的解决:后台到前台时间格式保持一致的问题,其次,另一个问题是,我们在使用WEB服务的时,可能会需要用到,传入时间给后台

1、需要查询出来的时间的数据库字段对应的实体类的属性上添加@JsonFormat

    // 员工姓名
	private String eName;
	// 职位
	private String job;
	// 员工信息
	private BigDecimal mgr;
	// 入职时间
	@JsonFormat(pattern = "yyyy/MM/dd")
	private Date hireDate;
	// 部门位置
	private String loc;
	// 部门名称
	private String dName;

@JsonFormat(pattern=“yyyy-MM-dd”,timezone = “GMT+8”)
pattern:是你需要转换的时间日期的格式
timezone:是时间设置为东八区,避免时间在转换中有误差

注解@DateTimeFormat
在controller层我们使用spring mvc 表单自动封装映射对象时,我们在对应的接收前台数据的对象的属性上加@@DateTimeFormat

@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date symstarttime;
 
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date symendtime;

注解@JsonFormat主要是后台到前台的时间格式的转换
注解@DataFormAT主要是前后到后台的时间格式的转换

参考博客
No enum constant org.apache.ibatis.type.JdbcType.date
Mybatis之jdbcType
No enum constant org.apache.ibatis.type.JdbcType.date
解决日期转换异常 JSON parse error: Cannot deserialize value of type java.util.Date from String
@JsonFormat和@DateTimeFormat使用
个人网站

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-26 11:16:56  更:2022-02-26 11:21:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:24:38-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码