2021-11-15 12:39:49
在MyBatis中比较Java和MySQL的日期时间类型,核心在于统一数据格式并正确传递参数。以下是具体实现方法和注意事项:
一、Java端日期时间类型处理使用java.util.Date类型
适用于需要精确到毫秒的场景,需配合SimpleDateFormat进行格式化:SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date startDate = sdf.parse("2024-02-28 22:35:59");Date endDate = sdf.parse("2024-02-28 22:36:58");
传递参数时需确保Map中的键名与XML中的#{}占位符一致:Map<String, Object> params = new HashMap<>();params.put("startDate", startDate);params.put("endDate", endDate);
使用String类型直接传递
适用于格式固定的场景,需确保字符串格式与MySQL兼容:String startDate = "2024-02-28 22:35:59";String endDate = "2024-02-28 22:36:58";
基础比较语法使用BETWEEN...AND...或比较运算符(>、<、=)直接比较:
<select id="selectUsersByTime" parameterType="java.util.Map"> SELECT * FROM user WHERE create_time BETWEEN #{startDate} AND #{endDate}</select>若使用String类型,需确保格式与数据库字段类型匹配(如DATETIME对应'YYYY-MM-DD HH:MM:SS')。
动态SQL中的比较结合<if>标签实现条件判断:
<select id="selectUsersByDynamicTime" parameterType="java.util.Map"> SELECT * FROM user WHERE 1=1 <if test="startDate != null"> AND create_time >= #{startDate} </if> <if test="endDate != null"> AND create_time <= #{endDate} </if></select>类型一致性
Java参数类型与XML中parameterType需严格匹配。例如:
传递Date对象时,parameterType应为java.util.Date或java.util.Map(若通过Map传递)。
传递String时,parameterType可为java.lang.String或java.util.Map。
格式兼容性
MySQL的DATE类型仅支持'YYYY-MM-DD',DATETIME/TIMESTAMP支持'YYYY-MM-DD HH:MM:SS'。
若Java端使用Date类型,MyBatis默认会通过JDBC驱动自动转换为数据库兼容格式;若使用String类型,需手动确保格式一致。
时区问题
当应用服务器与数据库服务器时区不一致时,建议统一使用UTC时间或显式指定时区:// Java端设置时区(示例)sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
NULL值处理
在XML中通过<if>标签避免NULL值导致的SQL语法错误(如示例中的动态SQL)。
优先使用java.util.Date或java.time类
Java 8+推荐使用java.time.LocalDateTime,配合MyBatis类型处理器(需额外配置):<typeHandlers> <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/></typeHandlers>LocalDateTime startDate = LocalDateTime.of(2024, 2, 28, 22, 35, 59);params.put("startDate", startDate);
复杂查询封装为Java对象
public class TimeRange { private Date startDate; private Date endDate; // getters/setters}<select id="selectByTimeRange" parameterType="com.example.TimeRange"> SELECT * FROM user WHERE create_time BETWEEN #{startDate} AND #{endDate}</select>类型不匹配错误
错误示例:java.lang.String cannot be cast to java.util.Date
解决方案:检查parameterType和实际参数类型是否一致。
格式错误
错误示例:Incorrect datetime value: '28-02-2024 22:35:59'
解决方案:统一使用YYYY-MM-DD HH:MM:SS格式。
时区导致的数据偏差
现象:查询结果比预期早/晚若干小时
解决方案:在JDBC连接URL中指定时区,如jdbc:mysql://localhost:3306/db?serverTimezone=UTC。
通过以上方法,可确保Java与MySQL日期时间类型在MyBatis中准确比较,同时兼顾代码可维护性和性能。