MyBatisについて
学んでみる

Javaツール勉強会@福岡 2016/11

吉村 武志 (@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を使ってみます。

MyBatis

まずは簡単な方法で使ってみます。

1.mybatis-config.xmlを準備

2.マッパーインタフェースを作成

3.SQL呼び出しする

mybatis-config.xml





  
    
      
      
        
        
        
        
      
    
  
  
    
    
  

データベース接続設定と「mapper」の設定がありますね。

マッパーインタフェース


public interface TestMapper {
    @Select("SELECT 名称 FROM M_祝祭日 WHERE 年月日 = #{ymd}")
    String selectHoliday(String ymd);
}

インタフェースのメソッドに、
SelectアノテーションでSQLを定義してあります。
引数名と名前付きパラメータが対応してます。

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呼び出し

MyBatis

SQLをアノテーションで定義しましたが、
アノテーションでは長いSQLは辛そうですね?

簡単なSQL以外はマッピングはXMLで・・・・

MyBatis

さっきよりちょっと手をかけたSQLを呼び出してみます。

1.mybatis-config.xmlを準備

2.マッパーXMLを作成

3.パラメータクラスを作成

4.SQL呼び出しする

mybatis-config.xml





  
    
      
      
        
        
        
        
      
    
  
  
    
    
  

先ほどと同じ内容です。

TestXMLMapper.xml(マッパーXML)





  

識別用の名前としてnamespace、id→"mybatistest.selectHoliday"
結果の型としてresultTypeにmap→java.util.Map
パラメータ用のクラス指定としてparameterType

TestParameter(パラメータクラス)


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を作っても良いようです。

SQL呼び出し


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> list = session.selectList("mybatistest.selectHoliday", param);
    System.out.printf("祝祭日が%d日ありました%n", list.size());
    list.stream().forEach((map) -> {
        System.out.printf("%sは%sです%n", map.get("年月日"), map.get("名称"));
    });
}

1.mybatis-config.xmlを読み込む
2.SqlSessionFactoryを取得
3.SqlSessionを取得
4.TestParameterを作成
5.SqlSessionにTestParameterを渡してSQL呼び出し
※結果がList>で返ってくる

MyBatis

というわけで、
MyBatisでのSQL呼び出しができましたが、
そもそもどういう場合に嬉しいのでしょうか?

使ってる方に聞いてみました。

おわり

LT枠で十分だった気がする多分