またまたシステム構成変更

書いてる途中

とりあえずsolrとDB使うことにする
EclipseプラグインのDB ViewerとAmaterasERDを導入

http://amateras.sourceforge.jp/

まず最初にAmaterasERDから離れて、MySQLに今回利用するユーザーとパスワードを作成しよう。
できた(というか前に作ったのがあった

とりあえず設計完了
テーブル1つで設計と言うほどでもなかったw

CREATE TABLE TWEETS(
  STATUS_ID BIGINT(15),
  URL VARCHAR(70),
  IMAGE VARCHAR(70),
  CONTENT VARCHAR(140),
  USER VARCHAR(15),
  CREATED_AT DATETIME
);


テーブル操作はたぶんS2JDBCが便利みたいだから、それを導入してみよう。
あとはS2JDBC-genもかな

とりあえず環境を整えてみる
Eclipse 3.5


DbLauncherもよく見かけるけどMySQLで開発する場合は必要なさそう


Mavenプロジェクトも生成できるみたいだ
Window -> Preferences -> DoltengからMaven Repository Pathを設定する。

では早速Seasar2入門のDoltengの項目に従ってプロジェクトを作成していこう。
Web Application以外にもStandard Applicationのプロジェクトを生成できるみたい
今回はRSS取得してDBに挿入するプログラム書くだけだから、standardで
Application Type : Standard Application
Persistence : S2JDBC

特に何も設定してないのに最初からMaven対応してるみたい

ここからはSesar2入門のS2JDBCの項目に戻ってみよう。
とりあえずsrc/main/resources/jdbc.diconを修正して、自分のMySQLに接続する設定をしてみよう。
最初はH2というDoltengに入っているデータベースの設定になっているようだけど、DBごとに例がコメントアウトした状態で記述されているので、関係ないのを削除してMySQLコメントアウトを外す。
MySQL5.0のエンコーディングについて注意書きが書いてある。
よくわからないからとりあえず無視で、基本的にはUTF-8で処理をしていくつもり。
URL、user、passwordを修正
次にs2jdbc.diconを修正
自分が利用しているDBに合わせる

<property name="dialect">mysqlDialect</property>

ここからはサンプルの実行だから、自分でプログラムを書ける環境が整ったと見ていいのかな
ちょっとS2JDBC-genについて調べてみよう
よしなんとなくわかったぞ
S2JDBCはDBからエンティティクラスの生成を自動的にしてくれるものみたい
エンティティクラスとは、「データベースに永続化されるデータ」と書いてある。

「エンティティ」とは「クラス」のことだ

 オブジェクト指向のモデルとリレーショナル・データベースは異なるモデルだ。したがって,両者は完全には重ならない。

 オブジェクト指向においては,オブジェクトという実体は,クラスとインスタンスという形でとらえられる。このとき,オブジェクトはインスタンスとして生成され,このインスタンスは通常,あるタイミングで消滅する。ただし,インスタンスを消滅させずに「永続化」することもできる。データベース・レコードにあたるエンティティ・クラスのインスタンスを「永続化」することで,データベース・レコードのように情報を保存することができる。これが,オブジェクト・データベースの基本的な発想だ。

なんとなくわかった

AmaterasERDでER図を作って、そこからSQL文を自動的に作成してDBを構成
今度はそのDBからS2JDBC-genを使って、JavaでDBにアクセス?するためのエンティティクラスを自動的に生成
こんな感じかな

ということは早速S2JDBC-genで、エンティティクラスを作成するべきか
subversionとの連携なんかもできるらしい。なるほどー
けど大規模でもないし1人で作るからそこまではしなくていいや

どうやらDoltengの場合勝手にS2JDBC-genの環境を用意してくれているようだ

まずはS2JDBC-gen-build.xmlを自分の環境に合わせて修正

特に変更は必要なし?

次にS2JDBC-gen-build.xmlを開き、External Tools Configurations Argumentsにgen-entityと入力しApplyをクリックし最後にRun

見事にエラーw
そして文字化けがひどことに

これか!けどMS932がない・・・いったいどうすれば
せめてエラー内容みたいです

Eclipseだと文字化けするのでコマンドでantを実行

ant -f s2jdbc-gen-build.xml gen-entity

BUILD FAILED
C:\Documents and Settings\ken\workspace\Deatter\s2jdbc-gen-build.xml:38: Exception in thread "main" org.seasar.framework.beans.IllegalPropertyRuntimeException:
[ESSR0059]クラス(org.seasar.extension.dbcp.impl.XADataSourceImpl)のプロパティ(driverClassName)の設定に失敗しました。理由はorg.seasar.framework.exception.SIllegalArgumentException: [ESSR0098]クラス(org.seasar.extension.dbcp.impl.XADataSourceImpl)[sun.misc.Launcher$AppClassLoader@a90653]の型(java.lang.String)[null]のプロ
パティ(driverClassName)に、型(java.lang.String)[null]の値(com.mysql.jdbc.Driver)を設定できませんでした。対象のクラスは(org.seasar.extension.dbcp.impl.XADataSourceImpl)[sun.misc.Launcher$AppClassLoader@a90653]です。

なんかとても優しいエラーメッセージが表示されている
driverClassNameがよろしくないらしい

		<property name="driverClassName">
			"com.mysql.jdbc.Driver"
		</property>

外部jarからmysql-connector-java-5.0.8.jarを追加してみた
エラー変わらず
そういう問題じゃないらしい
次にlibフォルダに入れてみる
成功した!
なるほどードライバが読めてなかった訳ね
そりゃ指定してあげなきゃ無理だ

おお!なんかentityパッケージの中にそれっぽい.javaが生成されてる
よーしこれで開発環境は整ったと見ていいのかな?
あとはサンプルを参考にして明日コードを書いてみよう。

サンプルを参考に挿入するコードを書いてみた

package root.entity;

import org.seasar.extension.jdbc.JdbcManager;
import org.seasar.framework.container.SingletonS2Container;
import org.seasar.framework.container.factory.SingletonS2ContainerFactory;

public class testInsertTx {
	public static void main(String[] args) throws Exception {
		SingletonS2ContainerFactory.init();
		try {
			JdbcManager jdbcManager = SingletonS2Container.getComponent(JdbcManager.class);
			testInsertTx(jdbcManager);
		}finally {
			SingletonS2ContainerFactory.destroy();
		}
	}
	public static void testInsertTx(final JdbcManager jdbcManager) throws Exception {
	    Tweets tws = new Tweets();
	    tws.content = "test";
	    tws.createdAt = "日時";
	    tws.image="http://image.jpg";
	    tws.statusId =1L;
	    tws.user="snkken";
	    jdbcManager.insert(tws).execute();
	    System.out.println(tws.statusId);
	}
}

実行!
エラー!またdriverClassNameがどうとか
外部jarから追加
ついでにMavenのローカルレポジトリにMySQLのドライバ追加するの忘れてたから追加
無事実行完了

結果をDB Viewerから見てみると見事に挿入されてる
こんな簡単にできちゃうとは・・・
接続のあの汚らしい情報をソースに書かなくて良いのも最高
SQL文補完できるのがもっと最高
わざわざinsertとかそれぞれ用にメソッド作ってた作業から解放された

もっと導入に苦戦するかと思ってたけど、かなり簡単だったなー
ただ細かいこと何やってるかが全然わからないけどw

あとは実際に使うものを作成してみる

なんかMavenとの連携がうまくいっていない
Mavenプロジェクトを作成すると、普段はMaven Dependenciesというのができてそこに必要なライブラリが追加さていくんだけど、まったく追加されない
オプションからレポジトリのディレクトリ指定してるし、チェックも入れてるのになー
解決
プロジェクトを右クリックしてMaven -> Enable Mane dependenciesをクリックすると使えるようになる

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder
突然こんなエラーがでた
pom.xmlに以下を追加してバージョン上げたら動いた

		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>1.5.8</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.5.8</version>
		</dependency>