自分用メモ

Spring を使わない場合でも、**MyBatis の基本機能を使って `DataMapper` を適用することは可能** です。  
ただし、Spring の `@Mapper` や `@Select` は使えないため、**MyBatis の XML 設定 (`mybatis-config.xml`) や `SqlSession` を手動で扱う形** になります。  

---

# **Spring なしの MyBatis のセットアップ**
Spring を使わない場合、**以下の手順** で MyBatis を設定します。

---

## **1. MyBatis の設定 (`mybatis-config.xml`)**
まず、MyBatis の設定ファイルを作成します。

#### **`mybatis-config.xml`**
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                <property name="username" value="root"/>
                <property name="password" value="password"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/example/mapper/DataMapper.xml"/>
    </mappers>
</configuration>
```
- **`dataSource` にデータベース接続情報を設定。**
- **`mappers` で `DataMapper.xml` を登録。**
- **トランザクション管理は `JDBC` を使用（MyBatis 独自の管理はしない）。**

---

## **2. Mapper XML の定義 (`DataMapper.xml`)**
次に、SQL を記述する `Mapper XML` を作成します。

#### **`DataMapper.xml`**
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.DataMapper">

    <select id="getLatestUpdateTime" resultType="java.time.LocalDateTime">
        WITH latest_times AS (
            SELECT MAX(updated_at) AS updated_at FROM table1
            UNION ALL
            SELECT MAX(updated_at) FROM table2
            UNION ALL
            SELECT MAX(updated_at) FROM table3
            UNION ALL
            SELECT MAX(updated_at) FROM table4
            UNION ALL
            SELECT MAX(updated_at) FROM table5
            UNION ALL
            SELECT MAX(updated_at) FROM table6
            UNION ALL
            SELECT MAX(updated_at) FROM table7
            UNION ALL
            SELECT MAX(updated_at) FROM table8
            UNION ALL
            SELECT MAX(updated_at) FROM table9
            UNION ALL
            SELECT MAX(updated_at) FROM table10
            UNION ALL
            SELECT MAX(updated_at) FROM table11
        )
        SELECT MAX(updated_at) AS latest_update FROM latest_times;
    </select>

</mapper>
```
- `resultType="java.time.LocalDateTime"` で `LocalDateTime` 型のデータを受け取れる。

---

## **3. Mapper インターフェース (`DataMapper.java`)**
Spring を使わない場合、MyBatis の `@Mapper` は使えないので、**ただのインターフェース** になります。

#### **`DataMapper.java`**
```java
package com.example.mapper;

import java.time.LocalDateTime;

public interface DataMapper {
    LocalDateTime getLatestUpdateTime();
}
```
- **`Mapper XML` の `<select>` の `id="getLatestUpdateTime"` に対応するメソッドを定義。**
- **`@Mapper` は不要（Spring を使わないため）。**
- **実装は不要で、MyBatis が動的に SQL を実行する。**

---

## **4. MyBatis の実行 (`Main.java`)**
Spring を使わない場合、MyBatis の `SqlSession` を手動で管理する必要があります。

#### **`Main.java`**
```java
package com.example;

import com.example.mapper.DataMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;

public class Main {
    public static void main(String[] args) {
        String resource = "mybatis-config.xml";
        try (InputStream inputStream = Resources.getResourceAsStream(resource)) {
            // MyBatisの設定を読み込んでファクトリを作成
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

            try (SqlSession session = sqlSessionFactory.openSession()) {
                // Mapperの取得
                DataMapper mapper = session.getMapper(DataMapper.class);

                // 最新の更新日時を取得
                LocalDateTime latestUpdateTime = mapper.getLatestUpdateTime();
                System.out.println("最新の更新日時: " + latestUpdateTime);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
```

### **ポイント**
1. **`mybatis-config.xml` を読み込み、`SqlSessionFactory` を作成**
2. **`session.getMapper(DataMapper.class)` で `Mapper` を取得**
3. **`mapper.getLatestUpdateTime()` を実行し、最新の更新日時を取得**
4. **例外処理 (`IOException`) を適切に実装**

---

## **5. 必要なライブラリ（`pom.xml`）**
Maven を使用している場合、以下の MyBatis ライブラリを追加する必要があります。

#### **`pom.xml`**
```xml
<dependencies>
    <!-- MyBatis コアライブラリ -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.13</version>
    </dependency>

    <!-- MySQL JDBC ドライバ（データベースに応じて変更） -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
</dependencies>
```

---

# **まとめ**
|  設定項目  | Spring あり | Spring なし |
|-----------|------------|-------------|
| **DB接続** | `DataSource` を Spring に設定 | `mybatis-config.xml` に直接記述 |
| **Mapper インターフェース** | `@Mapper` を使用 | ただの `interface` |
| **SQL 実行** | `@Select` や `Mapper XML` を使用 | `SqlSession` を手動で管理 |
| **実行方法** | `@Autowired` で Mapper を取得 | `SqlSessionFactory` から Mapper を取得 |

**✅ Spring を使わない場合のポイント**
1. **MyBatis の `mybatis-config.xml` で DB 接続を定義する**
2. **`Mapper` の SQL は `Mapper XML` に書く**
3. **`SqlSessionFactory` を使って `SqlSession` を開く**
4. **手動で `SqlSession` を管理し、適切にクローズする (`try-with-resources`)**

---

## **結論**
Spring を使わない場合でも、MyBatis の `Mapper` を XML ベースで定義し、手動で `SqlSession` を管理すれば同じ処理が可能。ただし、**接続管理やトランザクション管理が Spring より手間がかかる** ので、**可能なら Spring を使う方が簡単**。