Mybatis jdbcType DATE与TIMESTAMP区别

版权声明:来至蜀山雪松 https://blog.csdn.net/jianxia801/article/details/86683286

目录

1、使用场景

2、代码实现

3、展现结果

3.1、未修改的情况下展示结果

3.2、修改调整后展示的结果

4、总结

5、参考文章


1、使用场景

     因为本人最近的一个项目之中,修改同事以前做的一个功能(待办事项),此接口主要提提供给移动端App的,里面主要包含了两部分内容:(1)、新手任务信息,(2)、其他任务[任务的开始时间大于当前时间]。

      因为以前的业务设计的是,任务的开始时间必须大于今天;但是随着销售和实际情况的需求,任务的开始时间和结束时间需要精确到年月日,时分。并且由于以前同事根据时间的大小获得时间后,然后获得时间的毫秒数,进行比较后,给前端提供接口时候做了一个;转换显示工具类。具体可以看第二部的代码。

       开始以为直接转换和修改一下比较时间大小(开始时间与Now()相比,最近24小时内的即可),结果一修改返现返回的开始时间都是开始时间的00:00:00秒,明显开始时间是2019-01-24 14:00:00;结果与现在时间2019-01-24 10:22:00 相减比较还是一个负数。结果已修改其他地方也出现错误了。最后挖掘根源是MyBatis的配置之中;任务的开始时间为DATE类型。后面调整为 TIMESTAMP

2、代码实现

未修改之前的情况如下:      

<!-- 注意 task_start_time 开始  jdbcType="DATE"-->
<resultMap id="TaskToDoResultMap" type="cn.com.demos.task.entity.extend.TaskToDoExtend">
	<result column="task_id" jdbcType="BIGINT" property="taskId" />
	<result column="task_name" jdbcType="CHAR" property="taskName" />
	<result column="complete_status" jdbcType="CHAR" property="completeStatus" />
	<result column="task_end_date" jdbcType="DATE" property="taskEndDate" />
	<result column="task_start_time" jdbcType="DATE" property="startTime" />
	<result column="isExpiring" property="isExpiring" />
	<result column="isMarking" property="isMarking" />
	<result column="task_type" property="taskType" />	    
	</resultMap>

<!-- 任务待办事项 -->
<select id="getTaskToDoList" resultMap="TaskToDoResultMap">
   ------
</select>

修改之后的

主要修改内容  <result column="task_start_time" jdbcType="TIMESTAMP" property="startTime" />

<resultMap id="TaskToDoResultMap" type="cn.com.demos.task.entity.extend.TaskToDoExtend">
	<result column="task_id" jdbcType="BIGINT" property="taskId" />
	<result column="task_name" jdbcType="CHAR" property="taskName" />
	<result column="complete_status" jdbcType="CHAR" property="completeStatus" />
	<result column="task_end_date" jdbcType="DATE" property="taskEndDate" />
	<result column="task_start_time" jdbcType="TIMESTAMP" property="startTime" />
	<result column="isExpiring" property="isExpiring" />
	<result column="isMarking" property="isMarking" />
	<result column="task_type" property="taskType" />	    
</resultMap>

<!-- 任务待办事项 -->
<select id="getTaskToDoList" resultMap="TaskToDoResultMap">
	<!-- 普通任务 -->
	(
	SELECT ta.task_id, ti.task_name, ta.complete_status, DATE(ti.task_end_time) as task_end_date, 
		ti.`task_start_time`,
		IF(DATEDIFF(ti.task_end_time,NOW()) &lt; 1 AND ta.complete_status IN('01', '02') 
			AND DATEDIFF(ti.task_end_time,NOW()) &gt;= 0, TRUE, FALSE) AS isExpiring,
		IF(ta.complete_status IN('01', '02') AND ti.task_end_time &lt; NOW(), TRUE, FALSE) AS isMarking,	
		ti.task_type FROM task_assign ta LEFT JOIN task_info ti
		ON ta.task_id = ti.id
		WHERE ta.user_id = #{userId} AND ta.complete_status IN('01', '02')
		and ti.task_end_time &gt; now() 
		ORDER BY DATE(ti.task_end_time) DESC
	)
	UNION
	<!-- 普通新手任务 -->
	(
	SELECT ta.task_id, ti.task_name, ta.complete_status, DATE(ti.task_end_time) as task_end_date, 
		ti.`task_start_time`,
		IF(DATEDIFF(ti.task_end_time,NOW()) &lt; 1 AND ta.complete_status IN('01', '02') 
			AND DATEDIFF(ti.task_end_time,NOW()) &gt;= 0, TRUE, FALSE) AS isExpiring,
		IF(ta.complete_status IN('01', '02') AND ti.task_end_time &lt; NOW(), TRUE, FALSE) AS isMarking,	
		ti.task_type FROM task_assign_beginner ta LEFT JOIN task_info_beginner ti
		ON ta.task_id = ti.id
		WHERE ta.user_id = #{userId} AND ta.complete_status IN('01', '02')
		and ti.task_end_time &gt; now() 
		ORDER BY DATE(ti.task_end_time) DESC
	)
</select>

3、展现结果

3.1、未修改的情况下展示结果

很明显返回显示的日期和时间是不对的。于是我debug可以看见时间与当前时间比较是负数。

3.2、修改调整后展示的结果

4、总结

       在实际工作之中,我们在涉及到开始时间或者时间字段时候,在配置Mybatis之中resulMap之中,尽量配置为 jdbcType="TIMESTAMP" ,因为此时可以返回时分秒。这样能够在比较时或者显示显示到时分秒。

当jdbcType="DATE"类型时,返回的时间只有年月日(yyyy-MM-dd)的,当jdbcType=“TIMESTAMP”的时候,返回的时间是年月日和时分秒(yyyy-MM-dd HH:mm:ss)

5、参考文章

Mybatis框架中jdbcType="DATE" 和 jdbcType="TIMESTAMP" 两种类型的区别

猜你喜欢

转载自blog.csdn.net/jianxia801/article/details/86683286
今日推荐