Mybatisで日時を扱う方法

Mybatisで日時を扱う方法

MyBatisで日時を扱う方法

MyBatisで日時を扱う際には、Javaのjava.util.Date、java.sql.Date、java.sql.Timestamp、java.time.LocalDateTimeなどを使用できます。
データベースのカラムに適した型を選択し、マッピングすることで、日時データを正確に扱うことができます。

1. データベースとマッピングの設定

例えば、test_eventというテーブルがあり、event_dateという日時を保持するカラムがあるとします。

CREATE TABLE test_event (
    id INT PRIMARY KEY,
    event_date TIMESTAMP
);
2. Javaのクラス定義

Java側では、testEventクラスにLocalDateTimeを使用してeventDateフィールドを定義します。

package com.example.model;

import java.time.LocalDateTime;

public class testEvent {
    private int id;
    private LocalDateTime eventDate;

    // getters and setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public LocalDateTime getEventDate() {
        return eventDate;
    }

    public void setEventDate(LocalDateTime eventDate) {
        this.eventDate = eventDate;
    }
}
3. MyBatisのマッパーXML

MyBatisのマッパーXMLで、testEventオブジェクトとtest_eventテーブルのマッピングを行います。
selectを使って、データベースから日時を取得し、insertを使ってデータを保存する例を示します。

<mapper namespace="com.example.mapper.testEventMapper">

    <select id="selectEventById" resultType="com.example.model.testEvent">
        SELECT id, event_date AS eventDate
        FROM test_event
        WHERE id = #{id}
    </select>

    <insert id="insertEvent">
        INSERT INTO test_event (id, event_date)
        VALUES (#{id}, #{eventDate})
    </insert>

</mapper>
4. マッパーインターフェース

次に、MyBatisのマッパーインターフェースを作成します。

package com.example.mapper;

import com.example.model.testEvent;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;

public interface testEventMapper {

    @Select("SELECT id, event_date AS eventDate FROM test_event WHERE id = #{id}")
    testEvent selectEventById(int id);

    @Insert("INSERT INTO test_event (id, event_date) VALUES (#{id}, #{eventDate})")
    void insertEvent(testEvent event);
}
5. 使用例

以下のように、testEventMapperを使用してデータベースに日時データを挿入したり、取得したりできます。

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        SqlSessionFactory sqlSessionFactory = ... // SqlSessionFactoryの初期化
        try (SqlSession session = sqlSessionFactory.openSession()) {
            testEventMapper mapper = session.getMapper(testEventMapper.class);

            // データの挿入
            testEvent newEvent = new testEvent();
            newEvent.setId(1);
            newEvent.setEventDate(LocalDateTime.now());
            mapper.insertEvent(newEvent);

            // データの取得
            testEvent event = mapper.selectEventById(1);
            System.out.println("Event Date: " + event.getEventDate());
        }
    }
}

この例では、LocalDateTimeを使用して日時を管理していますが、java.util.Dateやjava.sql.Timestampなど、他の型も使用できます。
MyBatisはこれらの型を自動的に変換します。