Carpe Diem

備忘録

MyBatis を使う

MyBatisというORMapperを使ってDBとのやりとりを疎にします。 環境として ・MySQL 5.5 ・Eclipse (Pleiades) 4.3 ・MyBatis 3.2.2 でやります。今回はMavenプロジェクトという便利な方法でやります。 Mavenプロジェクトの便利なところ 普通は「ライブラリである .jar ファイルを1つ1つダウンロード、ビルドパスの指定」をしなきゃいけないところを、 pom.xml にほしい .jar ライブラリを記述するだけで勝手にダウンロード、パス通しをしてくれるものです。 Pleiades には標準で入っています。 MavenでMyBatis用プロジェクトを作成する Mavenを使ったことが無い方は Eclipse 4.2でMaven使えるようになるところまで を一度試すと良いです。 Eclipse左メニューで右クリック→新規→その他 で 「Mavenプロジェクト」を検索して選びます。 「シンプルなプロジェクトの作成」にチェック→次へ グループID: パッケージ名(jp.co.appとか) アーティファクトID: プロジェクト名(mybatisTestとか) で完了ボタンを押します。以下のようになると思います。 mybatis01.png ◆pom.xmlを編集してライブラリのダウンロード pom.xmlを編集します。まず今回必要なのが mybatis mysql-connector-java なので、それぞれのライブラリの最新版を http://mvnrepository.com/ から用意します。検索すると出てきます。そのページに書いてある
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.2</version>
    </dependency>
をコピペして、pom.xmlに以下のように貼り付けます。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>jp.co.app</groupId>
  <artifactId>mybatisTest</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.26</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.2.2</version>
    </dependency>
  </dependencies>
</project>
保存すると勝手にライブラリのダウンロードが始まります。 ◆DBの作成 DBを作ります。
create database user_db;
create table user(
  uid int primary key,
  password text);
データは適当に入れておいて下さい。 これで準備が整いました。 ◆MyBatisの使用 MyBatisで必要なのは以下の5つ(実際はプロパティファイルは必須でないので4つ)です。 ・configファイル ・エンティティ ・マッパーインタフェース ・マッパー.xml(実装クラス) ・プロパティファイル mybatis04.png それぞれをDBに合わせて作ります。 ◆Entityクラスの作成 User.java
package jp.co.app.entity;

public class User {
    private int uid;
    private String password;
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
◆マッパー系の作成 UserMapper.java マッパーインタフェースです。ここでDBへのアクセスのメソッドを作る感じです。
package jp.co.app.data;

import java.util.List;

import jp.co.app.entity.User;

import org.apache.ibatis.annotations.Param;

public interface UserMapper {
	List<User> selectAll();
	int insert(@Param("userId") int userId, @Param("userPwd") String userPwd);
}
UserMapper.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="jp.co.app.data.UserMapper">
    <resultMap id="userResultMap" type="jp.co.app.entity.User">
        <id column="uid" property="userId" />
        <result column="password" property="userPwd" />
    </resultMap>

    <select id="selectAll" resultMap="userResultMap">
        SELECT uid, password FROM user
    </select>

    <insert id="insert" parameterType="object">
        INSERT INTO user (uid, password)
        VALUES (#{userId}, #{userPwd})
    </insert>
</mapper>
◆configの作成 mybatis-config.xml 設定ファイルです。DBにアクセスするための設定や、マッパーの登録をします。名前は任意です。
<?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>

  <properties resource="properties/config.properties" />

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${username}"/>
        <property name="password" value="${password}"/>
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="jp/co/app/data/UserMapper.xml" />
  </mappers>

</configuration>
◆プロパティファイル config.properties 設定ファイルです。mybatis-config.xmlで読み込んでもらいます。名前は任意です。
#JDBC driver
driver=com.mysql.jdbc.Driver
#DB
url=jdbc:mysql://localhost:3306/test_db
#ID
username=root
#PASS
password=admin
◆テストコード UserTest.java SELECT と INSERT のテストをしてみました。
import java.util.List;

import jp.co.app.data.UserMapper;
import jp.co.app.entity.User;

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 UserTest {
    private static final String MYBATIS_CONFIG = "jp/co/app/data/mybatis-config.xml";
    
    private static SqlSessionFactory sessionFactory;
    
    public static void main(String[] args) {
        Reader reader;
        try {
            reader = Resources.getResourceAsReader(MYBATIS_CONFIG);
        } catch (IOException e) {
            e.printStackTrace();
            return;
        }
        sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        
        insertUser(10, "piyo");
        getUserAll();
    }
    
    public static void getUserAll() {
        final SqlSession sqlSession = sessionFactory.openSession();
        List<User> resultList;
        
        try {
            resultList = sqlSession.getMapper(UserMapper.class).selectAll();
        } finally {
            sqlSession.close();
        }
        for (User entity : resultList) {
            System.out.println(entity.getUserId());
            System.out.println(entity.getUserPwd());
        }
    }
    
    public static void insertUser(int uid, String pass) {
        final SqlSession sqlSession = sessionFactory.openSession();
        int result = 0;
        try {
            result = sqlSession.getMapper(UserMapper.class).insert(uid, pass);
            if (result == 1) {
                System.out.println("success");
            } else {
                System.out.println("fail");
            }
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}
ソース: Eclipse 4.2でMaven使えるようになるところまで