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