吉村 武志 (@takesi_yosimura)
吉村 武志
福岡周辺の勉強会に時々出没して
、
togetterまとめたりしてる人
Javaの勉強会やってますが、 仕事はClassic ASP & VB.Net
趣味は音ゲーとかアナログゲーム(ボードゲーム・TRPG)
前回JDBCについてやりました
JDBCではSQLを好きに書いて投入できる感じですが、
ちょっと辛い部分がありました。
//プリペアードステートメント
String sql = "SELECT 名称 FROM M_祝祭日 WHERE 年月日 = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, nengappi);
//・・・
}
名前付きパラメータはJDBC標準ではサポートされていません。。。
//プリペアードステートメント
String sql = "SELECT SUM(売上金額)"
+ " FROM "
+ "(SELECT 売上金額 FROM 売上伝票"
+ " WHERE 売上日 >= ?"
+ " AND 売上日 <= ?"
+ " UNION ALL"
+ " SELECT 売上金額 FROM 履歴_売上伝票"
+ " WHERE 売上日 >= ?"
+ " AND 売上日 <= ?"
+ ") AS 売上";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
stmt.setString(1, nengappiFrom);
stmt.setString(2, nengappiTo);
stmt.setString(3, nengappiFrom);
stmt.setString(4, nengappiTo);
//・・・
}
長いSQLになると辛いってば!!
そこをちょっと楽にしたい。
そこで、MyBatisを使ってみます。
まずは簡単な方法で使ってみます。
1.mybatis-config.xmlを準備
2.マッパーインタフェースを作成
3.SQL呼び出しする
データベース接続設定と「mapper」の設定がありますね。
public interface TestMapper {
@Select("SELECT 名称 FROM M_祝祭日 WHERE 年月日 = #{ymd}")
String selectHoliday(String ymd);
}
インタフェースのメソッドに、
SelectアノテーションでSQLを定義してあります。
引数名と名前付きパラメータが対応してます。
String nengappi = "2016/08/11";
String resource = "info/tsukasaya/mybatistest/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
TestMapper mapper = session.getMapper(TestMapper.class);
String name = mapper.selectHoliday(nengappi);
if (name != null) {
System.out.printf("%sは祝祭日の%sです%n", nengappi, name);
} else {
System.out.printf("%sは祝祭日ではないっぽい%n", nengappi);
}
}
1.mybatis-config.xmlを読み込む
2.SqlSessionFactoryを取得
3.SqlSessionを取得
4.定義したマッパーTestMapperを取得
5.定義したメソッドでSQL呼び出し
SQLをアノテーションで定義しましたが、
アノテーションでは長いSQLは辛そうですね?
簡単なSQL以外はマッピングはXMLで・・・・
さっきよりちょっと手をかけたSQLを呼び出してみます。
1.mybatis-config.xmlを準備
2.マッパーXMLを作成
3.パラメータクラスを作成
4.SQL呼び出しする
先ほどと同じ内容です。
識別用の名前としてnamespace、id→"mybatistest.selectHoliday"
結果の型としてresultTypeにmap→java.util.Map
パラメータ用のクラス指定としてparameterType
public class TestParameter {
private final String ymdFrom;
private final String ymdTo;
public TestParameter(String ymdFrom, String ymdTo) {
this.ymdFrom = ymdFrom;
this.ymdTo = ymdTo;
}
}
privateフィールドでも読み込まれます。
getterを作っても良いようです。
String resource = "info/tsukasaya/mybatistest/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
TestParameter param = new TestParameter("2016/05/01", "2016/07/31");
List
1.mybatis-config.xmlを読み込む
2.SqlSessionFactoryを取得
3.SqlSessionを取得
4.TestParameterを作成
5.SqlSessionにTestParameterを渡してSQL呼び出し
※結果がList
というわけで、
MyBatisでのSQL呼び出しができましたが、
そもそもどういう場合に嬉しいのでしょうか?
LT枠で十分だった気がする多分