| |
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();
}
}
}
|

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