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 type java type
CHAR String
VARCHAR String
LONGVARCHAR String
NUMERIC java.math.BigDecimal
DECIMAL java.math.BigDecimal
BIT boolean
BOOLEAN boolean
TINYINT byte
SMALLINT short
INTEGER INTEGER
BIGINT long
FLOAT double
DOUBLE double
BINARY byte[]
VARBINARY byte[]
LONGVARBINARY byte[]
DATE java.sql.Date
TIME java.sql.Time
TIMESTAMP java.sql.Timestamp
CLOB Clob
BLOB Blob
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使用
个人网站

猜你喜欢

转载自blog.csdn.net/greek7777/article/details/123121970