2010年11月25日

MongoDBをJavaからアクセスする際のサンプル

MongoDBをJavaからアクセスしてみました。
ソースコードはこちら。

https://github.com/tfunato/java-samples/tree/master/sample-mongodb/

UnitTestの形式になっています。
以下のことをとりあえず試してみました。
・DBへの接続
・データのInsert
・コレクションの削除
・DBの削除
・カーソルをつかった検索
・簡単な条件付き検索
  - OR条件
  - 比較条件
  - IN条件
  - 配列のマッチ
  - 要素数を条件とした物
  - DISTINCT

http://www.mongodb.org/pages/viewpage.action?pageId=6029357
ここにあるクエリーの例は同じようなやりかたで、使えるとおもわれる。

ソースをみればわかると思いますが、簡単にアクセスして格納・取得できます。
難点はBasicDBObject.get(key)した際にObjectという曖昧な型が返ってくるので扱いが面倒なこと。
(わざわざキャストしないといけないので、動的型付けなLLの方が検索結果を扱いやすいと思う。Genericsを使えば少しはましになるかも。ただ、データの型を予め知っていないといけない。うーむ。)

ただ、いくつかのO/Rマッパーはいるようなので試してみたいと思う。
posted by tfunato at 01:24 | コメント[0] | トラックバック[0] | MongoDB このエントリーを含むはてなブックマーク はてなブックマーク - MongoDBをJavaからアクセスする際のサンプル

2009年11月11日

Mavenと他のツールとの連携

実際の開発ではmaven単体だけで使われることはほとんどなく、mavenを複数のツールと組み合わせて使用します。
そのなかでもJava開発でよく使われているIDEのEclipseとの連携があります。
そのほかのIDEとしてはNetBeansや、最近、無償のコミュニティ版が提供された、IntelliJ IDEAもmavenと組み合わせることが可能です。

また、継続的インテグレーションツールとの親和性も高いです。


EclipseとMavenの統合



一番身近な例としてはEclipseとの連携です。

Eclipseのプラグインでm2eclipseというプラグインがあります。
これは、Eclipse上でMavenを使えるようにします。

主だった機能としては、mavenの設定ファイルであるpom.xmlを読み込んで依存関係にあるjarファイルを自動で取得してパスを通します。また、artifactIdと同じプロジェクト名のものがあればプロジェクト参照します。

その他、依存jarのjavaDocやソースコードをDLしてくれたりpomエディタなど便利な機能があります。

中でもPOMエディタは、依存関係を追加する際に該当するライブラリ名を補完したり、依存関係の一覧を表示できたりとかなり高機能です。

m2eclipseの対抗馬でEclipse IAM (q4e)というのもあり、両者ともEclipseの公式プラグインとなるべく提案されています。
http://www.eclipse.org/m2e/
http://www.eclipse.org/iam/
ただし、今後の展開を考えると、m2eclipseはSonatypeという会社(mavenのサポート、コンサルで稼いでいる?)が開発を行っており積極的に働きかけている関係上、OSSでやってるq4eは分が悪そうです。

See also:EclipseとMavenの統合についての比較

継続的インテグレーションツールとの統合



継続的インテグレーションツールとは、問題の早期発見などに主に使われていて、何度もビルドを行い、何度もテストをするという「確実なビルドを行う」ために使われているものです。CI(Continuous Integration)と呼ばれます。

See also:継続的インテグレーション

有名どころでは、

など、どれもmaven2をサポートしていて、mavenを連携させて簡単に設定を行うことができます。

posted by tfunato at 00:31 | コメント[0] | トラックバック[0] | Maven このエントリーを含むはてなブックマーク はてなブックマーク - Mavenと他のツールとの連携

2009年11月07日

Maven2のすすめ

maven-logo-2.jpg

認知度が結構あがってきてMaven2も
結構つかわれてきてるのではないかと思います。
でもまだまだ、Antやシェルを使ってコンパイルなどの作業を行っている人もいるでしょう。

そこでMaven2を使うメリット・特徴などを書いていきたいと思います。

続きを読む
posted by tfunato at 23:49 | コメント[0] | トラックバック[0] | Maven このエントリーを含むはてなブックマーク はてなブックマーク - Maven2のすすめ

忘れないようにするEclipseショートカットキー

覚えとく



Ctrl+Shift+o
importを解決。

Ctrl+Alt+j
Javaのコメント文の雛形を生成。

Ctrl+space
補完。

Ctrl+o
ソースコードのアウトラインを表示。

Ctrl+1
Eclipseがよきに計らってくれる
(コンパイルエラーの修正候補表示とか、ローカル変数の追加とか)

Shift+Alt+b
パンくずナビをJavaエディタで表示。上に出てきます。
プロジェクトからパッケージからメソッドまでどれでも選択かのうでその場所に飛ぶことができます。Since 3.4

Ctrl+3
移動系。さまざまなパースペクティブからエディタ、Viewなどどこでも表示。

Ctrl+Shift+r

ファイル選択。正規表現により目的のファイルを選択して表示。

Ctrl+Shift+f
フォーマット。

F3
該当場所の実装コードへジャンプ

F4
タイプヒエラルキー。
選択したクラスの実装コードのツリーを表示

Alt+←

前回編集場所へ戻る

Alt+→
編集場所へ進む

Alt+Shift+r
メソッド名や変数名をリファクタリング

とりあえず、これだけ
posted by tfunato at 16:04 | コメント[0] | トラックバック[0] | Java このエントリーを含むはてなブックマーク はてなブックマーク - 忘れないようにするEclipseショートカットキー

2009年10月31日

全文検索エンジンの導入

検証対象


・PostgreSQL GIN Index
http://www.postgresql.jp/document/pg836doc/html/gin.html
- PostgreSQLの転置インデックス

・Lucene
http://lucene.apache.org/
- Javaで書かれた全文検索エンジン
実績多数

今回使用したソース。
Senの辞書、Luceneのインデックス等は自分で作成してください。
fulltextsearch-sample.zip

調査データ


青空文庫(http://www.aozora.gr.jp/)のデータを取り込んでそれぞれ検証した。
テキストデータの行ごとにレコード、インデックス作成を行い。
それぞれ検証を行った。
対象レコードは約100万レコード

続きを読む
posted by tfunato at 01:33 | コメント[0] | トラックバック[0] | 日記 このエントリーを含むはてなブックマーク はてなブックマーク - 全文検索エンジンの導入

2009年08月29日

iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみました

iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみた。
トランザクション周り無視で、新しい機能としてまず、Annotationを利用した部分を動かしてみました。
作成環境はEclipse3.5+m2eclipse。
依存するjarファイルは勝手に取ってきてくれます。
DBはH2を使ってます。

サンプルコード

2の頃ではXMLベースで設定ファイルが物理的に存在しないとどうにもならなかったiBATISですがJavaのコードで設定等ができるようになりました。
従来DIで扱いづらかったiBATISですがかなり柔軟なことができるようなったと思います。

Annotationを使ったDBアクセスですが、S2Daoに似た感じとなってます。
インターフェースのみを書いてそれをConfiguration.addMapperとすることでプロキシコードを生成して、メソッドをフックして該当処理を行うような形です。DIコンテナを意識した設計なってイメージですかね。

実際にMapperのインターフェースですが、該当メソッドにSQLのAnnotationをつけて処理をしています。


package jp.canetrash.sample.ibatis3.mapper;

import java.util.List;

import jp.canetrash.sample.ibatis3.domain.Emp;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

public interface EmpMapper {

@Select("SELECT * FROM emp ")
List selectAllEmp();

Emp selectEmp(int id);

@Insert("insert into emp (id, name, title ) values (#{id}, #{name}, #{title})")
void insertEmp(Emp emp);

@Delete("delete from emp where id = #{id}")
int deleteEmp(int id);

int updateEmp(Emp emp);

@Update("create table emp (id integer, name varchar(128), title varchar(128)) ")
void createTable();

@Update("drop table emp")
void dropTable();
}

返却値のモデルへのマッピングは自動でやってくれます。

印象として以前のIBMでの記事のiBATIS版という感じでしょうか?
DAOを繰り返すな!

AnnotationとSQLMap.xmlとの住み分けですが単純なSQL(いわゆるCRUD)な部分はAnnotationで複雑なSQLはSQLMap.xmlで記述にわかれそうです。

他ではは、SQLMap.xmlでのDynamicSQLにOGNLが使えるようになったことがあります。下の例でみるとわかると思いますが、JSPでの学習がそまま、iBATIS3のDynamicSQLで生かせることがわかります

<iftest="title != null">
AND title like #{title}
</if>
<choose>
<when test="title != null">
AND title like #{title}
</when>
<when test="author != null && author.name != null">
AND title like #{author.name}
</when>
<otherwise>
AND featured = 1
</otherwise>
</choose>


最後に自分でSQLを生成してSQLを発行できるのですが、SQLを生成をサポートするSelectBuilderというものがあります。面白いのがSelectBuilderクラスをstatic importしてメソッド呼び出しによってSQLを生成するというものです。

import static org.apache.ibatis.jdbc.SelectBuilder.*;
...
private String selectPersonSql() {
BEGIN(); // Clears ThreadLocal variable
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
FROM("PERSON P");
FROM("ACCOUNT A");
INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
WHERE("P.ID = A.ID");
WHERE("P.FIRST_NAME like ?");
OR();
WHERE("P.LAST_NAME like ?");
GROUP_BY("P.ID");
HAVING("P.LAST_NAME like ?");
OR();
HAVING("P.FIRST_NAME like ?");
ORDER_BY("P.ID");
ORDER_BY("P.FULL_NAME");
return SQL();
}

実際にSQLをJavaの文字列操作で組み立て見るとわかると思いますが相当面倒です。SelectBuilderを使うとかなり負荷を軽減して可読性があがると思うのですが、使い道が浮かびません><

posted by tfunato at 21:00 | コメント[0] | トラックバック[0] | iBATIS このエントリーを含むはてなブックマーク はてなブックマーク - iBATIS3のbeta2が出たのでとりあえず動くコードを書いてみました