ブログ アーカイブ

自己紹介

本ブログをご覧いただき、ありがとうございます。
株式会社ヒューマンインタラクティブテクノロジー(HIT)の技術グループ担当者です。

弊社ホームページ

2014年3月22日土曜日

MyBatisで遊んでみる(2) 第二章 mybatis-generatorによるMapper自動生成

どうも、トムです。
今回は前回からの続きでmybatis-generatorについて書いていきます。

mybatis-generatorはmybatisで利用するMapperファイル(SQLMapper)やJava Model(Entity)、Java Client(Mapper)などのSQLマッピングクラスを自動生成してくれるツールです。
これらを導入することで開発時にテーブル変更などがあった際、比較的楽に関連ファイルを作成することが出来ます。

前回で以下のテーブルが出来ていることを前提で進んでいきます。
\d my.dept
            テーブル "my.dept"
  列  |           型           |  修飾語
------+------------------------+----------
 id   | integer                | not null
 name | character varying(256) | not null
インデックス:
    "dept_pkey" PRIMARY KEY, btree (id)
参照元:
    TABLE "my.emp" CONSTRAINT "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)

\d my.emp
              テーブル "my.emp"
   列    |           型           |  修飾語
---------+------------------------+----------
 id      | integer                | not null
 dept_id | integer                | not null
 name    | character varying(256) | not null
 tel     | character varying(12)  | not null
インデックス:
    "emp_pkey" PRIMARY KEY, btree (id, dept_id)
外部キー制約:
    "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)

第二章 mybatis-generatorによるMapper自動生成

1. モジュールダウンロード

まずは必要なモジュールをダウンロードします。
mybatis 3
https://github.com/mybatis/mybatis-3/releases
mybatis-3.2.5.jar
記事作成時点での最新バージョンは「mybatis 3.2.5」
mybatis-generator
https://github.com/mybatis/generator/releases
mybatis-generator-core-1.3.2.jar
※クラスパスには含めません
postgreSQL jdbcドライバ
http://jdbc.postgresql.org/download.html
postgresql-9.3-1101.jdbc41.jar
記事作成時点での最新バージョンは「9.3-1101」
対応するドライバの種類は以下の通りです。
JDKバージョン 対応ドライバ
JDK 1.5 JDBC3
JDK 1.6 JDBC4
JDK 1.7, 1.8 JDBC41

ognl-3.0.6.jar
http://struts.apache.org/download.cgi
javassist.jar
http://sourceforge.jp/projects/sfnet_jaopframework/downloads/Library/javassist.jar/
log4j-1.2.17.jar
http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.17/log4j-1.2.17.zip


2. パッケージ構成

今回作成するMyBatisサンプルのパッケージ構成は以下の通り

3. Mapper、Entity自動生成の為の準備

以下の設定ファイルを新規に作成します。

mybatis-generator用の設定ファイル

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE generatorConfiguration
 PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
 "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
<generatorConfiguration>
  <context id="context1">
    <!--
      生成するクラスオブジェクトにタイムスタンプを付与するかどうかを設定します。
      value="true" の場合は生成しません。

      詳細は公式リファレンス参照
      http://mybatis.github.io/generator/configreference/commentGenerator.html
    -->
    <commentGenerator>
        <property name="suppressDate" value="true" />
    </commentGenerator>

    <!-- JDBCの設定 -->
    <jdbcConnection driverClass="org.postgresql.Driver"
                        connectionURL="jdbc:postgresql://192.168.100.100:5432/test" userId="mybatisuser"
                        password="password" />

    <!--
       Java Model(Entity)クラスの生成先を指定します。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/javaModelGenerator.html
     -->
    <javaModelGenerator targetPackage="jp.hit.sample.mybatis.entity"
                        targetProject="src" >
    </javaModelGenerator>

    <!--
       SQL Mapperファイルの生成先を指定します。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/sqlMapGenerator.html
     -->
    <sqlMapGenerator targetPackage="jp.hit.sample.mybatis.mapper"
                        targetProject="resource" />

    <!--
       Java Clientクラスの生成先を指定します。
       Java ClientはSQL Mapperファイルを呼び出すためのインターフェースクラスです。
       targetPackage : 生成先パッケージ
       targetProject : プロジェクトディレクトリから生成先パッケージの親ディレクトリまでのパス

       詳細は公式リファレンス参照
       http://mybatis.github.io/generator/configreference/javaClientGenerator.html

       type :
         type="ANNOTATEDMAPPER"
            アノテーションを定義したMapperインターフェースクラスとアノテーションの実装を定義したSqlProviderクラスを生成する。
            Mapperファイルは生成しない。
            Mapperファイルを使用せずにアノテーションでクエリを発行したい人向け

         type="MIXEDMAPPER"
            アノテーションを定義したMapperインターフェースクラスとMapperファイルを生成する。
            SqlProviderクラスは生成しない。
            Mapperファイルとアノテーションでのクエリ発行を両立したい人向け。

         type="XMLMAPPER"
            MapperインターフェースクラスとMapperファイルのみ生成する。
            SQLを全部Mapperファイルで管理したい人向け。
     -->
    <javaClientGenerator targetPackage="jp.hit.sample.mybatis.client"
                        targetProject="src" type="XMLMAPPER" />

    <!--
     自動生成対象のテーブル名を[tableName]に指定する。
     ※テーブル名の指定はワイルドカードが利用できます

     詳しい設定値については公式サイトのリファレンスを参照してください。
     http://mybatis.github.io/generator/configreference/table.html

     modelType :
       modelType="flat"
          ドメインクラスのみ作成。
       modelType="hierarchical"
          自動生成するMapperのパラメータの為にPrimary Keyエンティティを生成します。
          MapperでPKを指定したクエリ(selectByPrimaryKey等)のパラメータがデフォルトでPrimary Keyエンティティになります。
     -->
    <table schema="my" tableName="%"
            enableInsert="true"
            enableSelectByPrimaryKey="true"
            enableSelectByExample="true"
            enableUpdateByPrimaryKey="true"
            enableUpdateByExample="false"
            enableDeleteByPrimaryKey="true"
            enableDeleteByExample="false"
            enableCountByExample="false"
            selectByExampleQueryId="false"
            modelType="hierarchical">
    </table>
  </context>
</generatorConfiguration>

Antでmybatis-generatorを実行するためのビルドファイル

<?xml version="1.0" encoding="utf-8"?>
<project default="genfiles" basedir=".">
  <property name="generated.source.dir" value="${basedir}" />

  <path id="class.path">
    <fileset dir="lib" includes="*.jar" />
    <dirset dir="bin" />
  </path>

  <!-- 自動生成実行 -->
  <target name="genfiles" description="Generate the files" depends="init">
    <!-- mybatis generator 実行 -->
    <taskdef name="mbgenerator" classname="org.mybatis.generator.ant.GeneratorAntTask"
            classpathref="class.path" />
    <mbgenerator overwrite="true" configfile="resource/generatorConfig.xml"
            verbose="false">
    </mbgenerator>
    <!-- postgresの場合 PKオブジェクトとして[テーブル名Pkey]のファイルが作成されるが不要なため削除する -->
    <delete verbose="true">
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*Pkey.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*PkeyExample.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*PkeyMapper.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*PkeySqlProvider.java"/>
      <fileset dir="./resource/jp/hit/sample/mybatis/mapper"  includes="*PkeyMapper.xml" />
    </delete>
  </target>

  <!-- 生成先パッケージ初期化 -->
  <target name="init" description="Initialize">
    <!-- パッケージ作成 -->
    <mkdir dir="./src/jp/hit/sample/mybatis/entity"/>
    <mkdir dir="./src/jp/hit/sample/mybatis/client"/>
    <mkdir dir="./resource/jp/hit/sample/mybatis/mapper"/>
    <!-- パッケージ内削除 ※全消しなので要注意 -->
    <delete verbose="true">
      <fileset dir="./src/jp/hit/sample/mybatis/entity" includes="*.java"/>
      <fileset dir="./src/jp/hit/sample/mybatis/client" includes="*.java"/>
      <fileset dir="./resource/jp/hit/sample/mybatis/mapper"  includes="*.xml" />
    </delete>
  </target>
</project>



4. 自動生成実行

Antでmybatis-generatorを実行します。
Buildfile: <workspace_path>\MyBatis\ant_mybatis-gemerator-build.xml
init:
genfiles:
BUILD SUCCESSFUL
Total time: 3 seconds


ここでエラーになる場合は、generatorConfig.xmlのJDBC設定やDBの設定周りを見直してみてください。
自動生成に成功すればパッケージ以下にMapperクラス、Entityクラス、Mapperが作成されます。


今回はMapperファイルを利用してのクエリ発行を行うのでJava Clientの設定値でtype="XMLMAPPER"を指定しました。
mybatisにはMapperファイルを利用したクエリ発行以外にもアノテーションを利用したクエリ発行の方法も可能です。
アノテーションを利用したクエリ発行のメリットは余計な外部ファイルを持たせずに全てclass内でクエリの定義が行えることでしょうか。
機会があればそちらの方法も試してみようと思います。

2014年3月12日水曜日

MyBatisで遊んでみる(1) 第一章 postgreSQLの導入から設定(軽め)

どうも、はじめまして 技術グループのトムです。
今回はJavaのFrameworkの一つMyBatisで遊んでみます。
RDBMSとの連携において開発の効率化の為には、Hibernate のようなO/Rマッピングフレームワークを利用するのが一般的ですが 既存のSQLを利用使用しつつも、DAOやEntityの自動生成、クエリの動的生成など、ちょっとした部分だけFrameworkで代用したいということはあると思います。
そんな時は比較的簡単に利用できるSQLマッピングフレームワークとしてMyBatisが便利です。


という訳で、今回から
  • 第一章 postgreSQLの導入から設定(軽め)
  • 第二章 mybatis-generatorによるMapper自動生成
  • 第三章 MyBatis実装サンプル
の3回に分けてMyBatis実行サンプル作成までの手順を記載していきます。
今回の記事ではMyBatisで遊ぶための前準備としてデータを準備します。




第一章 postgreSQLの導入から設定(軽め)

検証に使用するDBはpostgreSQLを選択。
接続対象のDBはリモートに建てました環境は以下の通りです。

OS Windows 7 Enterprise SP1 64bit
RDBMS postgreSQL 9.3.2
FW Mybatis 3.2.5
ホストIP 192.168.100.100

1. postgreSQLのインストール


(1)ファイルダウンロード

公式サイトからインストーラー「postgresql-9.3.2-3-windows-x64.exe」をダウンロード
記事作成時点(2014/2/26)での最新バージョンは「9.3.2」でした。
※いつの間にか「9.3.3」が出ているみたいですが手順は同じだと思います。


(2)インストール

インストール手順は、ウィザードの「Next」を押していけば完了するので省略します。
collationを聞かれた場合は”C”を指定してください。
最後にアドオンツール導入のために、「Stack Builder」の起動を確認をされますが、今回は特に必要ないので、チェックを外してFinishです。

(3)設定変更(リモートホストからpostgresへ接続する為の設定)

今回はリモート環境のDBへ接続するので、「postgresql.conf」と「pg_hba.conf」を少しいじります。
デフォルトインストールの場合「C:\Program Files\PostgreSQL\9.3\data」以下配下にファイルがあります。

以下変更が必要な場合は設定値を変更する

#------------------------------------------------------------------------------
# CONNECTIONS AND AUTHENTICATION
#------------------------------------------------------------------------------

# - Connection Settings -

listen_addresses = '*'    # what IP address(es) to listen on;
                          # comma-separated list of addresses;
                          # defaults to 'localhost'; use '*' for all
                          # (change requires restart)
port = 5432               # (change requires restart)
max_connections = 100     # (change requires restart)
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
host    all             postgres        192.168.100.100/32      md5
# 接続を許可するデータベース、ユーザ、アドレスの範囲を指定
# 以下の場合はtestデータベースに対してmybatisuserユーザでのアクセスを192.168.100.0~192.168.100.255からの接続にのみに許可
host    test            mybatisuser     192.168.100.0/24        md5

2. ユーザ、データベース、スキーマ、テーブル作成

以下psqlで実行します。 psqlにPATHを通しておくと便利です。
一時的にPATHを追加するには以下の通り
PATH %PATH%;C:\Program Files\PostgreSQL\9.3\bin
常用する場合は環境変数に追記してください。

(1)ユーザとロールの関連付け、及びデータベースの作成

-- スーパーユーザーでログイン
psql -U postgres

-- クエリ実行結果の表示形式変更(お好みでどうぞ)
\x
-- ユーザ・ロール作成 ※サンプルなのでパスワードは適当です
create role mybatisuser with NOSUPERUSER NOINHERIT LOGIN PASSWORD 'password';
-- データベース作成
create database test with owner mybatisuser;
-- データベース作成結果確認
\l
-[ RECORD 4 ]-----+----------------------
名前              | test
所有者            | mybatisuser
エンコーディング  | UTF8
照合順序          | C
Ctype(変換演算子) | C
アクセス権        |

(2)スキーマ、テーブルの作成とサンプルデータの投入

-- ユーザ切り替え
\c test mybatisuser

-- スキーマ作成
CREATE SCHEMA my;

-- テーブル作成
create table my.dept (
id int4,
name varchar(256) not null,
PRIMARY KEY(id)
);
create table my.emp (
id int4,
dept_id int4 not null references my.dept(id),
name varchar(256) not null,
tel varchar(12) not null,
PRIMARY KEY(id, dept_id)
);

-- テーブル確認
\d my.dept
            テーブル "my.dept"
  列  |           型           |  修飾語
------+------------------------+----------
 id   | integer                | not null
 name | character varying(256) | not null
インデックス:
    "dept_pkey" PRIMARY KEY, btree (id)
参照元:
    TABLE "my.emp" CONSTRAINT "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)

\d my.emp
              テーブル "my.emp"
   列    |           型           |  修飾語
---------+------------------------+----------
 id      | integer                | not null
 dept_id | integer                | not null
 name    | character varying(256) | not null
 tel     | character varying(12)  | not null
インデックス:
    "emp_pkey" PRIMARY KEY, btree (id, dept_id)
外部キー制約:
    "emp_dept_id_fkey" FOREIGN KEY (dept_id) REFERENCES my.dept(id)


-- データ挿入
insert into my.dept values
(1,'Foundation')
,(2,'Sales')
,(3,'System');

insert into my.emp values
(1,1,'Alfa','111-111-1111')
,(2,1,'Aileen','123-123-1234')
,(3,3,'Bravo','222-222-2222')
,(4,2,'Charlie','333-333-3333');


-- データ確認
select * from my.dept;
 id |    name
----+------------
  1 | Foundation
  2 | Sales
  3 | System

select * from my.emp;
 id | dept_id |  name   |     tel
----+---------+---------+--------------
  1 |       1 | Alfa    | 111-111-1111
  2 |       1 | Aileen  | 123-123-1234
  3 |       3 | Bravo   | 222-222-2222
  4 |       2 | Charlie | 333-333-3333


これで第二章のmybatis-generatorを利用するためのデータの準備が整いました。
ユーザとスキーマは作らなくてもmybatis-generatorが動くことは動くのですが、自動生成の対象スキーマやテーブルを絞らない場合information_schema、pg_catalogのカタログオブジェクトやテーブルも全て取得してしまいます。


昔は「postgresql.conf」のlisten_addressesのデフォルト値は'localhost'だったのですが、 今見るとデフォルトで全てのIPアドレスをlistenするようになっていますね。
postgresqlの設定値はバージョンによって細かい違いが出てきているようです。

2014年3月5日水曜日

Hive2/Impalaを使ってみる。その1:Hadoopのインストール

初めまして。しんです。

タイムリーな話題ではありませんが、Hive/Impalaを触る場面がありました。
初めてのビッグデータのソフトウェアに触ったため、インストールするのに結構苦労をしました。
今回の経験を踏まえてインストール手順を複数回に分けて書きたいと思います。

環境
OS         : CentOS 6.5 64bit  Minimal構成)
Memory 4GB以上
Java      Java SE 6 以上

事前準備
wgetをインストール
Minimal構成では、wgetがインストールされていないので、インストールします。
# yum install wget

hostnameの設定
ホスト名を設定します。Hadoopでは、出力するファイル名にホスト名を使用している箇所があり、
未設定のままだと、うまく動作しませんでした。
hostsファイル
# vi /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
<IPアドレス>  <ホスト名>

networkファイル
# vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=<ホスト名>

両方のファイルを変更した後にnetworkを再起動して反映させます。
# /etc/init.d/network restart

正しく設定できたかをチェックするためには以下のコマンドを実行します。
NGの場合
# hostname –f
hostname: Host name lookup failure

OKの場合
# hostname –f
<ホスト名>


■セキュリティの設定
試しに使うのであれば、SELinuxiptable系のサービスを無効にする。
通常の利用時には、適切な設定を行いますが、今回はSELinuxの設定を無効にしました。
変更前
# vi /etc/sysconfig/selinux
SELINUX= enforcing

変更後
# vi /etc/sysconfig/selinux
SELINUX=disabled

同様にiptablesの設定を無効にします。
# service iptables stop
iptables: Setting chains to policy ACCEPT: filter          [  OK  ]
iptables: Flushing firewall rules:                                  [  OK  ]
iptables: Unloading modules:                                      [  OK  ]
# chkconfig iptables off

同様にip6tablesの設定を無効にします。
# service ip6tables stop
ip6tables: Setting chains to policy ACCEPT: filter         [  OK  ]
ip6tables: Flushing firewall rules:                                 [  OK  ]
ip6tables: Unloading modules:                                     [  OK  ]
# chkconfig ip6tables off

Javaのインストール
JavaOracleのサイトからrpmをダウンロードして、対象の環境にアップロードしてからインストールを
行います。
# rpm –ivh <javarpmファイル>

インストール後、バージョンの確認も忘れずに。バージョンはJava SE 1.6以上が必須となります。
# java –version
java version "1.7.0_51"



Hadoopのインストール
yumレポジトリの追加
今回はCDHClouderas Distribution Including Apache Hadoop)を利用して
Hadoopをインストールしたいと思います。
以下の手順はClouderaのドキュメントを参考に実施した手順となります。

はじめに、yumレポジトリにClouderaのサイトを追加します。
# cd /etc/yum.repos.d/

CDHのインストール
各種コンポーネントをインストールします。なお、今回使用したのはMRv1MRv2YARN)の
うち、MRv1でしたので、以下のコンポーネントとなります。
# yum -y install hadoop-0.20-mapreduce-jobtracker
# yum -y install hadoop-hdfs-namenode
# yum -y install hadoop-hdfs-secondarynamenode
# yum -y install hadoop-0.20-mapreduce-tasktracker
# yum -y install hadoop-hdfs-datanode
# yum -y install hadoop-client
  
疑似分散モードをインストールする。
#yum -y install hadoop-0.20-conf-pseudo

Hadoopのノードを初期化する。
sudo -u hdfs hdfs namenode –format

Hadoopの初期化が終わった本ノードで各種ディレクトリをHadoop上に作成する。
sudo -u hdfs hadoop fs -mkdir /tmp
sudo -u hdfs hadoop fs -chmod -R 1777 /tmp

su - hdfs
hadoop fs -mkdir /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
hadoop fs -chmod 1777 /var/lib/hadoop-hdfs/cache/mapred/mapred/staging
hadoop fs -chown -R mapred /var/lib/hadoop-hdfs/cache/mapred
exit

正しくインストールができたか、Hadoopのサービスを起動して確認する。
# for service in /etc/init.d/hadoop-hdfs-*; do $service start; done
# for service in /etc/init.d/hadoop-0.20-mapreduce-*; do $service start; done


今回のまとめ
l  ホスト名を設定する。
l  試しに使うのであれば、SELinuxiptable系のサービスを無効にする。
l  yumコマンドで必要なコンポーネントをインストールする。
l  1つのサーバ上で稼働するため、疑似分散モードで実行する。

今回はHadoopのインストールまでとします。
次回はHiveのインストール手順を公開する予定です。

2014年3月3日月曜日

ごあいさつ

本ブログをご覧いただき、ありがとうございます。
株式会社ヒューマンインタラクティブテクノロジー(HIT)の技術グループ担当者です。

本ブログサイトは、弊社として投稿コンテンツに対する正当性を保証したり、
責任を負っているものではありませんが、技術グループとしてこれまで活動してきた内容が、
少しでも他の方々のプラスになればと思います。