MyBatis独立アプリケーションの作成
Spring Bootと組合せてMyBatisを使うアプリケーションの作成手順は別ページでご紹介しました。
ここではSpring Bootを使用しない、JavaのコマンドラインでMyBatisとJDBCドライバだけを使って、 表データの検索と更新を行う例をご紹介します。 さらに更新はUPDATE文ではなく、HSQLDBのストアドプロシージャをコールして実行しています。

レコードBeanクラスの作成
最初にどこから行くか…ですが、まずは表のレコードに対応するBeanクラスを作成します。

package sample;
import lombok.Data;
@Data
public class Item {
    private int itemId;
    private String itemName;
    private int categoryId;
    private String notes;
    private int displayOrder;
}

Mapper Javaクラスの作成
Spring Bootの時にも触れましたが、Mapper Javaクラスの中にアノテーションでSQLを書くことも、 Javaとは別にXMLファイルに書くこともできます。ここでは後者の例で書きます。 つまりJavaクラスの中にはSQLは書きません。

package sample;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ItemsMapper {
    List<Item> selectByCategoryId(int categoryId);
    List<Item> selectAll();
    void updateById(Map<String, Object> params);
}

更新処理のパラメータがintやStringなど個々の列名ではなくMapになっていますが、 これはストアドプロシージャをコールして更新するためで、 その場合はこういう書き方になるとまずは考えてください。

mybatis-config.xmlの作成
ファイル名はこれでなくてもいいようですが、慣習的にこのファイル名がよく使われるらしいです。 DB接続情報などを記述するファイルです。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <settings>
    <!-- スネークケースのDB列名をキャメルケースに自動変換する設定 -->
    <setting name="mapUnderscoreToCamelCase" value="true" />
  </settings>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <!-- H2 Database版 -->
      <!--
      <dataSource type="POOLED">
        <property name="driver" value="org.h2.Driver"/>
        <property name="url" value="jdbc:h2:C:/usr/dbms/h2/database/nkdb"/>
        <property name="username" value="nkuser"/>
        <property name="password" value="nkpass"/>
      </dataSource>
       -->
      <!-- HSQLDB版。ファイル接続だとCONFLICTとかDEADLOCKとかのエラーの対処が面倒なので、サーバーモードを使う -->
      <dataSource type="POOLED">
        <property name="driver" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost:9001/nkx;ifexists=true"/>
        <property name="username" value="sa"/>
        <property name="password" value=""/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="sample/ItemsMapper.xml"/>
  </mappers>
</configuration>

Mapper XMLの作成
で上のmybatis-config.xmlの末尾のmappersで参照されている、sample/ItemsMapper.xml を作成します。 インターフェースは先のMapper Javaクラスと一致させる必要があります。 それだけでなく、このファイルを配置するディレクトリも、 Mapper Javaクラスのパッケージ階層に合わせる必要があります。 つまりJavaクラスがsample.ItemMapperなので、このファイルもsample/ItemsMapper.xml となるパスに配置する必要があります。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sample.ItemsMapper">
  <!-- Beanにない列名があっても単に無視され、エラーにはならないらしい -->
  <!-- この戻り値をList<Item>で受け取りたい場合、resultTypeにはListではなくItemと指定する点に注意 -->
  <select id="selectByCategoryId" resultType="sample.Item">
    SELECT ITEM_ID, ITEM_NAME, CATEGORY_ID, MAKER_DESC, NOTES, DISPLAY_ORDER
      FROM ITEMS WHERE CATEGORY_ID = #{categoryId}
     ORDER BY ITEM_ID
  </select>

  <select id="selectAll" resultType="sample.Item">
    SELECT ITEM_ID, ITEM_NAME, CATEGORY_ID, MAKER_DESC, NOTES, DISPLAY_ORDER
      FROM ITEMS
     ORDER BY ITEM_ID
  </select>

  <select id="updateById" statementType="CALLABLE" parameterType="map" resultType="map">
    { CALL UPDATE_NOTES(
        #{itemId, mode=IN, jdbcType=INTEGER},
        #{notes,  mode=IN, jdbcType=VARCHAR},
        #{displayOrder,  mode=IN,  jdbcType=INTEGER},
        #{resultStatus,  mode=OUT, jdbcType=INTEGER},
        #{resultMessage, mode=OUT, jdbcType=VARCHAR}
    ) }
  </select>
</mapper>

検索処理を行うアプリケーションの作成

package sample;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisSelectExample1 {
    public static void main(String[] args) throws IOException {
        String resource = "sample/mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlf = new SqlSessionFactoryBuilder().build(is);
        try (SqlSession session = sqlf.openSession()) {
            ItemsMapper mapper = session.getMapper(ItemsMapper.class);

            //List<Item> rset = mapper.selectAll();
            List<Item> rset = mapper.selectByCategoryId(3);

            // 該当データがない場合、nullではなく空のリストが返される
            if(rset.size() == 0) {
                System.out.println("該当データがありません。");
                System.exit(0);
            }
            for (Item e : rset) {
                System.out.println(e.getItemId() + "\t" + e.getItemName() +
                        "\t" + e.getCategoryId() + "\t" + e.getNotes() + "\t" + e.getDisplayOrder());
            }
            System.out.println(rset.size() + "行のデータが見つかりました。");
        }
    }
}

更新処理を行うアプリケーションの作成

package sample;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MyBatisUpdateExample1 {
    private static SqlSession open() throws IOException {
        String resource = "sample/mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlf = new SqlSessionFactoryBuilder().build(is);
        return sqlf.openSession();
    }
    public static void main(String[] args) throws IOException {
        try (SqlSession session = open()) {
            ItemsMapper mapper = session.getMapper(ItemsMapper.class);

            Map<String, Object> params = new HashMap<>();
            params.put("itemId", 10);
            params.put("notes", "備考 by MyBatis Update");
            params.put("displayOrder", 308);
            params.put("resultStatus", null);  // OUTパラメータの初期値
            params.put("resultMessage", null); // OUTパラメータの初期値

            mapper.updateById(params);

            Integer resultStatus = (Integer) params.get("resultStatus");
            String resultMessage = (String)  params.get("resultMessage");

            System.out.println("Result Status: "  + resultStatus);
            System.out.println("Result Message: " + resultMessage);

            session.commit();
        }
    }
}

Java kowaza Top

(first uploaded 2025/03/23 last updated 2025/03/23, URANO398)