スポンサーリンク

2016年8月31日

[Java]泣く泣く復習するJava(二日目)

Goal

  • Java8+Maven3+MyBatisでCRUD操作をする

Dev-Environment

OS: Windows8.1
PostgreSQL: 9.4.4
Java: v1.8.0_102
Maven: v3.3.9
MyBatis: v3.4.1
JDBC: postgresql v9.1-901-1.jdbc4

Prerequisite: Java、Maven、PostgreSQLに関してはインストール済み、解凍済み、環境変数設定済みであること…

Note: JDBCはいらないような記事とか情報があったが、ないと動かなかったので入れます。

Context

一日目の続きです。
さてさて、何の因果かJavaをやることになってしった怠惰のアルケミスト…とりあえず、ぼちぼちByBatisを今日はいじるのであった。
MyBatis(+JDBC)の導入から、(DAOなし)CRUD操作までを掲載しています。
多分、この記事が一番わかりやすい。DAOもやってくれているので是非参考にしてみてください~
参考: Getting Started with MyBatis 3: CRUD Operations Example with XML Mapper
仕方ないからやっていきますか…(*´・д・)=3
あぁそうそう、アノテーションを使わない面倒な方のパターンです。
「xmlいやじゃ!」って人はブラウザバックを推奨します。
まずは、DBを作りましょう。
MigrationツールとしてFlywayとかってのがあるらしいですが、今回利用はしません。
面倒くさいとかってわけじゃにゃいです!

Example:

> psql -U [user_name]
ユーザ [user_name] のパスワード: ****

## DB作成
=# CREATE DATABASE mybatis_demo;

## DB接続
=# \c mybatis_demo

## テーブル作成
mybatis_demo=# create table public.user (
mybatis_demo(# id serial PRIMARY KEY,
mybatis_demo(# name varchar(255),
mybatis_demo(# email varchar(255));

## テーブル一覧
mybatis_demo=# \d
               リレーションの一覧
 スキーマ |    名前     |     型     |  所有者
----------+-------------+------------+----------
 public   | user        | テーブル   | postgres
 public   | user_id_seq | シーケンス | postgres
(2 行)

## データインサート
mybatis_demo=# INSERT INTO "user" (name, email) VALUES ('hoge', 'hoge@test.com');
mybatis_demo=# INSERT INTO "user" (name, email) VALUES ('foobar', 'foobar@test.com');

## データセレクト
mybatis_demo=# SELECT * FROM "user";
 id |  name  |      email
----+--------+-----------------
  1 | hoge   | hoge@test.com
  2 | foobar | foobar@test.com
(2 行)
pomファイルへ依存関係を追加します。

File: pom.xml

<?xml version="1.0" encoding="UTF-8"?>

<project>
    ....

    <dependencies>
        ...

        <!-- ここから -->
        <!-- Mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- PostgreSQL JDBC -->
        <dependency>
            <groupId>postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.1-901-1.jdbc4</version>
        </dependency>
        <!-- ここまで -->
    </dependencies>

    <build>
      ...
    </build>
</project>
MyBatis用のコンフィグファイルを作成します。
(ここで、マッピング用のXMLファイルを指定してますね)

File: src/main/resources/mybatis-config.xml

<?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>
  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="org.postgresql.Driver" />
        <property name="url" value="jdbc:postgresql://localhost:5432/mybatis_demo" />
        <property name="username" value="****" />
        <property name="password" value="****" />
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="local/mybatis/mapper/UserMapper.xml"/>
  </mappers>
</configuration>
次は、マッピング用のXMLファイルを作成します。
これは、各モデル毎に用意することになるでしょうね。
(ディレクトリがなければ作成してください)

File: src/main/resources/local/mybatis/mapper/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="local.mybatis.mapper.UserMapper">
  <select id="all" resultType="local.mybatis.model.User">
    select * from "user"
  </select>
  <select id="get" resultType="local.mybatis.model.User" parameterType="int">
    select * from "user" where id = #{id}
  </select>
  <select id="getByName" resultType="local.mybatis.model.User" parameterType="string">
    select * from "user" where name = #{name}
  </select>
  <insert id="insert" parameterType="local.mybatis.model.User">
    insert into "user" (name, email) values (#{name}, #{email})
  </insert>
  <update id="update" parameterType="local.mybatis.model.User">
    update "user" set name=#{name}, email=#{email} where id = #{id}
  </update>
  <delete id="delete" parameterType="int">
    delete from "user" where id = #{id}
  </delete>
</mapper>
マッピング用のxmlに対応した、Java側のインターフェースを用意します。
インターフェースの実装は中で上手くやってくれるらしいのでいらないみたいです。
(今回、resultMapなんかは用意していないが、名前変更などがあったときのためにやっておいた方がいいと思う)

File: src/main/java/local/mybatis/mapper/UserMapper.java

package local.mybatis.mapper;

import local.mybatis.model.User;
import java.util.List;

public interface UserMapper {
  public List<User> all();
  public User get(int id);
  public User getByName(String name);
  public void insert(User user);
  public void update(User user);
  public void delete(int id);
}
Userのモデルファイルを用意します。
セッター/ゲッターを用意しておけばいい。

File: src/main/java/local/mybatis/model/User.java

package local.mybatis.model;

public class User {
  private Integer id;
  private String name;
  private String email;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getEmail() {
    return email;
  }

  public void setEmail(String email) {
    this.email = email;
  }
}
あんまりよくない例だけど、テストファイルを用意してJUnitを使って実行できるようにする。
とりあえずの動作検証なので、テスト分けろよとか長いとかは聞きたくない…
(TDDのかけらも存在していない(汗))

File: src/test/java/local/MybatisTest.java

package local;

import junit.framework.TestCase;

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;

import local.mybatis.model.User;
import local.mybatis.mapper.UserMapper;

/**
 * 
 */
public class MybatisTest extends TestCase {

    public void testMybatis() throws Exception {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory session_factory = new SqlSessionFactoryBuilder().build(in);
        SqlSession session = session_factory.openSession();

        try {
          UserMapper mapper = session.getMapper(UserMapper.class);

          // select all
          List<User> all_user = mapper.all();
          assertEquals(all_user.size(), 2);
          System.out.println("all:" + all_user);

          // select
          User hoge = mapper.get(1);
          assertEquals(hoge.getName(), "hoge");
          assertEquals(hoge.getEmail(), "hoge@test.com");

          // insert
          User insertParameter = new User();
          insertParameter.setName("huge");
          insertParameter.setEmail("huge@test.com");
          mapper.insert(insertParameter);
          session.commit();

          User insertUser = mapper.getByName("huge");
          assertEquals(insertUser.getName(), "huge");
          assertEquals(insertUser.getEmail(), "huge@test.com");

          // update
          User updateParameter = new User();
          updateParameter.setId(insertUser.getId());
          updateParameter.setName("updatehuge");
          updateParameter.setEmail("updatehuge@test.com");
          mapper.update(updateParameter);
          session.commit();

          User update_user = mapper.getByName("updatehuge");
          assertEquals(update_user.getName(), "updatehuge");
          assertEquals(update_user.getEmail(), "updatehuge@test.com");

          // delete
          mapper.delete(insertUser.getId());
          session.commit();
          assertEquals(mapper.all().size(), 2);
        } finally {
          session.close();
        }
    }
}
一度作れば少し楽ができるけど、やっぱり導入の段階で色々面倒が多い。
(もう少し何とかならんのだろうかね…)

Note: 自分の力のなさを言語やツールのせいにするのはやめましょう~

しかし、なんでかJavaでは気持ちよくプログラムできない…いちいちプログラムじゃないところで止まって、むしろ疲れる。
(気持ちよく軽快にプログラムしたいだけの人生だった…)
お疲れ様です。これで今日の分は終了です。(-_-)ノシ・・・ハァ・・・

Bibliography

人気の投稿