在 MyBatis 中比较 Java 时间类型和 MySQL Datetime 类型时,需要注意类型映射和比较方式。以下是几种常见的方法:
<!-- 使用参数占位符,MyBatis 会自动处理类型转换 -->
<select id="selectByDate" resultType="YourResultType">
SELECT * FROM your_table
WHERE datetime_column = #{javaDate,jdbcType=TIMESTAMP}
</select>
<!-- 比较日期部分(忽略时间) -->
<select id="selectByDate" resultType="YourResultType">
SELECT * FROM your_table
WHERE DATE(datetime_column) = DATE(#{javaDate,jdbcType=TIMESTAMP})
</select>
<!-- 比较特定时间范围 -->
<select id="selectByDateRange" resultType="YourResultType">
SELECT * FROM your_table
WHERE datetime_column BETWEEN #{startDate,jdbcType=TIMESTAMP} AND #{endDate,jdbcType=TIMESTAMP}
</select>
<!-- 使用日期格式化函数比较 -->
<select id="selectByFormattedDate" resultType="YourResultType">
SELECT * FROM your_table
WHERE DATE_FORMAT(datetime_column, '%Y-%m-%d') = DATE_FORMAT(#{javaDate,jdbcType=TIMESTAMP}, '%Y-%m-%d')
</select>
<if>
标签动态构建查询<select id="selectByCondition" resultType="YourResultType">
SELECT * FROM your_table
WHERE 1=1
<if test="startDate != null">
AND datetime_column >= #{startDate,jdbcType=TIMESTAMP}
</if>
<if test="endDate != null">
AND datetime_column <= #{endDate,jdbcType=TIMESTAMP}
</if>
</select>
类型映射:
java.util.Date
或 java.time.*
类型会自动映射到 MySQL 的 DATETIME/TIMESTAMPLocalDateTime
,确保 MyBatis 版本支持(可能需要额外依赖如 mybatis-typehandlers-jsr310)时区问题:
jdbc:mysql://...?serverTimezone=UTC
Java 8 时间 API:
<!-- 使用 LocalDateTime -->
<select id="selectByLocalDateTime" resultType="YourResultType">
SELECT * FROM your_table
WHERE datetime_column = #{localDateTime,jdbcType=TIMESTAMP}
</select>
性能考虑:
选择哪种方法取决于你的具体需求(是否需要比较时间部分、是否需要考虑时区等)。