Liftの入門(lift-mapperのquery編)
今回はlift-mapperのQuery関係をまとめます。MappedFieldが先なのではと思わないでもないですがQueryです。lift-mapperは、toFormやtoHtmlであったりモデルのくせにビューにくっついていたり色々知っておかなくてはいけないことがあるのですが、まずはQuery関係に絞って説明します。リファレンス的に使えればと思います。
本題に入る前にちょっとTips
発行したSQLのログを出したい
Boot.scalaに以下を記述
class Boot extends LazyLoggable { ・・・ DB.addLogFunc { case (query, time) => { logger.info("All queries took " + time + "ms: ") query.allEntries.foreach({ case DBLogEntry(stmt, duration) => logger.info(stmt + " took " + duration + "ms")}) logger.info("End queries") } }
テーブル名やカラム名を_(アンダーバー)区切りにする
デフォルトだとemployeeNameのようなカラムでテーブルが作成されたり、sqlが発行されたりするので、それをemployee_nameに変える方法です。これもBoot.scalaに記述します。
LiftRules.stripComments.default.set(() => false) import net.liftweb.util.Helpers MapperRules.columnName = (_,name) => Helpers.snakify(name) MapperRules.tableName = (_,name) => Helpers.snakify(name)
scalaのコンソールでBoot.scalaを動かしたい。
コンソールを起動して以下を入力。
scala>(new bootstrap.liftweb.Boot).boot
では本題に入ります。なお、完全に網羅するものではないのであしからず。
データをinsertする。
戻り値がbooleanの場合。保存に成功すればtrue。
val result = Employee.create.name("test").jobType(JobType.ANALYST).salary(300).save
戻り値がmodel。
val emp = Employee.create.name("test").jobType(JobType.ANALYST).salary(300).saveMe
keyで1件取得する。
val emp: Box[Employee] = Employee.find(1)
全件取得する。
val empList : List[Employee] = Employee.findAll
条件を指定する。
SQLとしては、「where id > 5」となる。
val empList : List[Employee] = Employee.findAll(By_>(Employee.id, 5))
逆もあります。「where id < 5」
val empList : List[Employee] = Employee.findAll(By_<(Employee.id, 5))
イコールもいけます。「where id = 5」
val empList : List[Employee] = Employee.findAll(By(Employee.id, 5))
検索結果を削除する。
modelのobjectから消すにはdelete_!を使います。
val emp: Employee = Employee.find(1).open_! val result: Boolean = Employee.delete_!(emp)
※open_!はBox型から値を取得
条件指定で削除する。
条件を指定するにはbulkDelete_!!を使います。ここではLikeを使っています。findAllとかでもLike使えます。
val result: Boolean = Employee.bulkDelete_!!(Like(Employee.name, "山田%"))
件数を取得する。
件数を取得するにはcountを利用します。
val count: Long = Employee.count
条件指定も出来ます。
val count: Long = Employee.count(By(Employee.name, "山田 太郎"))
order byを指定する。
descの場合
Employee.findAll(OrderBy(Employee.name,Descending))
ascの場合(複数も指定出来ます)
Employee.findAll(OrderBy(Employee.name,Ascending),OrderBy(Employee.jobType, Ascending))
取得する件数と何件目から取得するか指定する。
以下だと10件目から5件取得する。
val empList: List[Employee] = Employee.findAll(StartAt(10),MaxRows(5))
SQLを直接発行する。
一つ目のリストにヘッダ名、二つ目のリストに値のリストが取れます。
val resultList: (List[String], List[List[String]]) = DB.runQuery("select * from employee") val headerList: List[String] = resultList._1 val bodyList: List[List[String]] = resultList._2
とりあえず、ざっくりとはこんな感じです。まだまだあるのですが僕自身がリファレンス的に参照しててあった方が便利だと感じたら追加します。