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使用
个人网站

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值