scalaコードの中でなるべく自然にsqlを書けるようにするライブラリ。
create table m_address( row_id integer not null , zip_code char(7) not null , state varchar(128) not null , city varchar(128) not null , town varchar(128) not null , modify_at timestamp not null default current timestamp , constraint m_address_pkc primary key (row_id) )
のようなテーブルがあった時に
val rows: List[M_Address] = M_Address .select .where(row_id >= 123 and town <> "fuga") .go(conn)
このようににSELECTを書ける。
select
val rows: List[M_Address] = M_Address .select( row_id, zip_code, modify_at ) .distinct .where( row_id >= 123 and (state ~ "hoge" or town <> "fuga") ) .orderBy( modify_at.desc, zip_code.asc ) .go(conn)
このコードは
select distinct row_id, zip_code, modify_at from m_address where ( row_id >= 123 and ( state like '%' || ? || '%' or town <> ?) ) order by modift_at desc, zip_code asc
のようなsqlでPreparedStatementを作り、
(123, hoge, fuga)
をセットして実行する。
~
はlike
!=
は使えない、<>
のみ
update
val mod_row_count = M_Address.update .set( row_id = null, modify_at = "2013-02-27 00:22:12" ) .where( state == "piyo" ) .go(conn)
↓
update m_address set row_id = ?, modify_at = ? where ( state = ? ) params = (null, Wed Feb 27 00:22:12 JST 2013, piyo)
insert
M_Address.insert.values( row_id = 123, state = "hoge", city = "fuga" ).go(conn)
↓
insert into m_address (row_id, state, city) values (?, ?, ?) params = (123, hoge, fuga)
delete
M_Address.delete.where( row_id > 100 ).go(conn)
↓
delete from m_address where ( row_id > ? ) params = (100)
java.sql.DatabaseMetaDataからテーブルの定義情報を読み取って
各テーブル/ビューに対応するクラスを自動生成する。
sqlib.properties
################################################################################ # JDBC設定 ################################################################################ # JDBCドライバのFQCN driver=org.postgresql.Driver # 接続URL url=jdbc:postgresql://localhost:5432/sample # ユーザとパスワード username=postgres password=postgres ################################################################################ # java.sql.Connectionを返すファクトリのFQCN # ファクトリはsqlib.tools.ConnectionFactoryを拡張している必要がある # この設定はJDBC設定よりも優先される ################################################################################ connection_factory=test.jdbc.DerbyConnectionFactory ################################################################################ # 自動生成するscalaソースコードを出力するディレクトリ # 省略した場合はカレントディレクトリ ################################################################################ outdir=./test/scala ################################################################################ # 自動生成するクラスのパッケージ ################################################################################ package_name=test.entity ################################################################################ # 出力先ディレクトリをクリーンアップするかどうか # trueにすると、一旦削除して、再作成する # [デフォルトはfalse] ################################################################################ clean=true
このプロパティファイルはクラスパスに含まれている必要がある。
sqlib.tools.EntityGenerator
EntityGeneratorを実行する。
引数は特になし。
クラスパス上からsqlib.propertiesを探してその設定に従い
scalaのソースコードを出力する。
- テストにScalaTest使ってみる
- antからsbtに乗り換えるか?