読者です 読者をやめる 読者になる 読者になる

Carpe Diem

備忘録。https://github.com/jun06t

MyBatis を使う

Mapper
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使えるようになるところまで