/scala.sqlib

sql library for writing naturally SQL @ scala

Primary LanguageScalaOtherNOASSERTION

scala sql library

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を書ける。


samples

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のソースコードを出力する。


TODO

  • テストにScalaTest使ってみる
  • antからsbtに乗り換えるか?