在 MyBatis 中比较 Java 类型(如 Date 或 LocalDateTime)与 MySQL 的 datetime 类型时,需要注意类型转换和 SQL 语法的问题。以下是几种解决方案:
<select id="selectAfterDate" resultType="YourResultType">
SELECT * FROM your_table
WHERE datetime_column > #{dateParam,jdbcType=TIMESTAMP}
</select>
如果使用 Java 8+,推荐使用 LocalDateTime
:
// Mapper 接口
List<YourEntity> selectAfterDate(@Param("dateParam") LocalDateTime date);
<select id="selectAfterDate" resultType="YourResultType">
SELECT * FROM your_table
WHERE datetime_column > #{dateParam,jdbcType=TIMESTAMP}
</select>
确保正确配置了日期类型的类型处理器:
<!-- 在 mybatis-config.xml 中 -->
<typeHandlers>
<typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"
javaType="java.time.LocalDateTime"/>
</typeHandlers>
如果需要处理时区,可以使用:
<select id="selectByDateRange">
SELECT * FROM your_table
WHERE datetime_column BETWEEN
#{startDate,jdbcType=TIMESTAMP}
AND #{endDate,jdbcType=TIMESTAMP}
</select>
<select id="selectTodayRecords">
SELECT * FROM your_table
WHERE DATE(datetime_column) = DATE(#{today,jdbcType=TIMESTAMP})
</select>
// Entity
public class YourEntity {
private LocalDateTime createTime;
// getters and setters
}
// Mapper interface
public interface YourMapper {
List<YourEntity> selectAfterDate(LocalDateTime date);
List<YourEntity> selectBetweenDates(
@Param("start") LocalDateTime start,
@Param("end") LocalDateTime end);
}
<!-- Mapper XML -->
<select id="selectAfterDate" resultType="YourEntity">
SELECT * FROM your_table
WHERE datetime_column > #{date,jdbcType=TIMESTAMP}
</select>
<select id="selectBetweenDates" resultType="YourEntity">
SELECT * FROM your_table
WHERE datetime_column BETWEEN
#{start,jdbcType=TIMESTAMP} AND #{end,jdbcType=TIMESTAMP}
</select>
通过以上方法,您可以安全高效地在 MyBatis 中比较 Java 日期时间类型与 MySQL 的 datetime 类型。