在 MyBatis 中通過時間戳(Timestamp)作為查詢條件,需注意數據庫時間類型與 Java 類型的映射。以下是具體實現方式:
一、Java 實體類與數據庫字段映射
-
實體類定義
使用java.sql.Timestamp
或java.time.LocalDateTime
(推薦)類型:public class Order {private Long id;private LocalDateTime createTime; // 對應數據庫的 TIMESTAMP/DATETIME// getter/setter }
-
數據庫字段類型
- MySQL:
TIMESTAMP
或DATETIME
- Oracle:
TIMESTAMP
- PostgreSQL:
TIMESTAMP
- MySQL:
二、XML 映射文件寫法
方式1:直接參數傳遞
<select id="selectByTimeRange" resultType="Order">SELECT * FROM orders WHERE create_time BETWEEN #{startTime} AND #{endTime}
</select>
方式2:動態條件(if 標簽)
<select id="selectByCondition" resultType="Order">SELECT * FROM orders<where><if test="startTime != null">AND create_time >= #{startTime}</if><if test="endTime != null">AND create_time <= #{endTime}</if></where>
</select>
三、接口方法與參數傳遞
場景1:精確時間查詢
// Mapper 接口方法
List<Order> selectByCreateTime(@Param("targetTime") LocalDateTime targetTime);// 調用示例
mapper.selectByCreateTime(LocalDateTime.of(2025, 7, 4, 0, 0));
場景2:時間范圍查詢
List<Order> selectByTimeRange(@Param("startTime") Timestamp startTime,@Param("endTime") Timestamp endTime
);// 調用示例(使用 java.sql.Timestamp)
mapper.selectByTimeRange(new Timestamp(System.currentTimeMillis() - 86400000), // 前一天new Timestamp(System.currentTimeMillis()) // 當前時間
);
四、特殊場景處理
1. 時區問題
若存在時區差異,可在 SQL 中轉換:
<select id="selectByUTC" resultType="Order">SELECT * FROM ordersWHERE CONVERT_TZ(create_time, '+00:00', '+08:00') = #{localTime}
</select>
2. 時間格式化查詢
<select id="selectByDate" resultType="Order">SELECT * FROM ordersWHERE DATE_FORMAT(create_time, '%Y-%m-%d') = #{dateStr}
</select>
五、注意事項
- 類型匹配:確保 Java 類型(如
LocalDateTime
)與 JDBC 驅動兼容,MyBatis 3.4+ 默認支持 JSR-310 時間類型。 - 索引優化:對時間字段加索引可大幅提升范圍查詢性能。
- 參數傳遞:使用
@Param
注解明確參數名,避免 XML 中引用混亂。