Scala からオブジェクトDBの db4Object を使う
の記事でも取り上げた db4Object を Scala から利用してみます。
db4o-8.0.184.15484-all-java5.jar をクラスパスに追加して Scala から使うだけです。
エンティテイ
として、Customer クラスを準備
trait Entity { import org.apache.commons.lang3.builder.ToStringBuilder; override def toString = ToStringBuilder.reflectionToString(this); } class Customer( var id :Long, var name :String ) extends Entity { }
単純な例なのでこれだけです。@BeanProperty とかもいりません。
サクッと使うのは
これだけです。組み込みモードで db4o 使っています。
object Main { def main(args: Array[String]): Unit = { // setup embedded db import com.db4o.{ObjectContainer,Db4oEmbedded}; var db:ObjectContainer = Db4oEmbedded.openFile( Db4oEmbedded.newConfiguration(), "databaseFile.db4o"); // store two Customer db.store(new Customer(1, "Thom")); db.store(new Customer(2, "Ron")); // select stored Customer import scala.collection.JavaConversions._ var customers = db.query(classOf[Customer]) customers.foreach(println); db.close(); } }
Customer オブジェクト永続化してから取り出しているだけです。
出力結果はこんな感じになります。
etc9.Customer@1a42792[id=1,name=Thom] etc9.Customer@113a53d[id=2,name=Ron]
モデルの検証コードとか、楽過ぎます。
条件指定して検索
id が 2 のオブジェクトを検索
db.queryByExample(new Customer(2,null)).foreach(println);
まあ、ここまでは普通です。
そして Predicate が最高
Java だと、条件指定にPredicateを使う以下のような不毛なコードが必要です。
List <Customer> customers = db.query(new Predicate<Customer>() { public boolean match(Customer c) { return c.getName().contains("o"); } });
Scala だと、暗黙的型変換を定義しておけば、
import com.db4o.query._; implicit def toPredicate[T](predicate: T => Boolean) = new Predicate[T]() {def `match`(entry: T): Boolean = {predicate(entry)}}
直感的なコードで書けます。
db.query{ c:Customer => c.name.contains("o") }.foreach(println);
最高です。ハイ。