つかびーの技術日記

(情報)工学修士, 元SIer SE, 現Web系 SEの技術blogです。Scala, Java, JS, TS, Python, Ruby, AWS, GCPあたりが好きです。

scalikejdbc-gen-allで生成するMapperのクラス名を調整する

   

今回はscalikejdbc-mapper-generatorの話です。この記事を読むとscalikejdbc-gen-allコマンドで生成するMapperのクラス名を自在に変更できるようになります。

scalikejdbc-mapper-generatorというsbt-pluginを使うと、scalikejdbcのmapperを自動生成してくれます。どこの分野にもあるアレですね。hibernateとかmybatisとかにもあるので、generator自体は昔から使っています。多分多くの方が自分で生成するしないに関わらず利用したことがあるかと思います。

Mapperを使うことで「SQLベタ書きめんどくさい・・・」というような状況を回避できます。

scalikejdbcでのMapper生成方法

これについては既に十分資料があるので、そちらを参照してください。

Reverse Engineering – ScalikeJDBC

scalikejdbc/scalikejdbc-cookbook – GitHub

どんなsbtコマンドが用意されているかは以下を見れば分かります。

https://github.com/scalikejdbc/scalikejdbc/blob/master/scalikejdbc-mapper-generator/src/main/scala/scalikejdbc/mapper/SbtKeys.scala#L22-L26

scalikejdbc-genは単一のMapper生成、scalikejdbc-gen-allは設定ファイルに書いたスキーマ(またはDB)以下の全テーブルのMapper生成、という具合です。forceというのもありますが、これは強制上書きです。自分は常にforceを使っています。(生成したMapperは変更しない方針)

今回対象とするのはscalikejdbc-gen-allです。

scalikejdbc-gen-allではクラス名を指定できない

上記のリンク先にもありますが、scalikejdbc-genコマンドでは生成するMapperクラスのクラス名を自由に設定できますが、gen-allの方ではクラス名を自由に設定できません。

自分が書くコードにはMapperのクラスと同名のPOJOっぽいクラスが既に存在していたので、生成するMapperはFoo.scalaよりはFooMapper.scalaにしたい、と考えていました。パッケージが別なので別にいいじゃんという気もしますが、同時に使おうとするとimportが色々面倒ですので・・・。

なので、今まではこんなshellスクリプトを用意して対応していました。

sbt "scalikejdbc-gen FOO FooMapper"
sbt "scalikejdbc-gen BAR BarMapper"
sbt "scalikejdbc-gen BAZ BazMapper"
# 以下30個くらい。。。

これを実行するようにすれば一応要件は満たせますが、テーブルが追加削除されたとき直さないといけなかったり、何回もsbtコマンドを叩くので遅かったり、色々と面倒でした。(遅いのはsbtコマンド1つでやれば良い話でしたが。sbt “….” “….”というように何個も繋げて。)

scalikejdbc-gen-allでもクラス名を指定できる処理を追加してもらいました

一応オプション付けられる方向でコード書いてみたんですが、binary compatibility崩れるわ、option指定の方法がいけてないわで色々ダメでした \(^o^)/

ですが

吉田神が一晩でやってくれました・・・!

add GeneratorConfig#tableNameToClassName #365

ありがとう!

使い方

build.sbtにscalikejdbcSettingsを書くと思いますが、それと一緒に以下のようなコードを書けばOKです。

scalikejdbcSettings

scalikejdbc.mapper.SbtKeys.scalikejdbcGeneratorSettings in Compile ~= {
  c => c.copy(tableNameToClassName = x => c.tableNameToClassName(x) + "Mapper")
}

デフォルトの変換処理に加えて末尾にMapperという文字列を付ける処理を加えています。関数定義なので、自由度は高いですね。今回はsuffixですが、prefix変えたい!という要求にも答えられますね。

これで無事やりたいことがgen-allだけでできるようになりました!

みなさんもscalikejdbc-gen-allしましょう!

 - Scala, ライブラリ