JetBrainsのIDEでDatabaseのEntityを自動生成 [MySQL/MariaDB]

#はじめに
__一つのテーブル毎にGUIでの操作が必要になるので、DB単位で一気にテーブルのEntityを作りたい場合は自前のスクリプト作ったほうがいいです。__

なかなかの神機能なんですが、公式のリファレンスも3行ほど、日本語どころか英語の解説ページも皆無な影が薄い機能です。。。
ですが、効果は絶大なのでJetBrainsのIDEでDatabaseを触っている方はぜひ使って頂きたいです。
いやほんとに教えていただいたとき目からウロコだったので何卒。。。:bow:

#環境
IDE(確認したもの):Rider, PHPStrom, IDEA Ultimate
JetBrainsのDB接続できるIDEなら基本的に全てできると思います。

#何ができるのか
タイトルを読んで聞いてピンと来る方は飛ばしてください。
私の所属している場所ではテーブルとカラムの実体コードをEntityと読んでいて新しいプロジェクトのたびにテーブルとカラムのEntityをC#とPHPで書いています。

#####例えばこのようなテーブルがあったとして

```sql
create table TestDb.Card
(
    CardId     bigint   not null comment 'カードID'
        primary key,
    CharaId    bigint   not null comment 'キャラID',
    CardName   text     not null comment 'カード名',
    Attack     int      not null comment '攻撃力',
    Defense    int      not null comment '防御力',
    InsDate    datetime not null comment '登録日時',
    UpdDate    datetime not null comment '更新日時',
    UpdAccount text     not null comment '最終更新者',
    Remarks    text     not null comment '備考'
)
    comment 'Testカード';
```

#####IDEに標準で入っているスクリプトを使うとこんなJavaファイルができます。

```java
package com.sample;


public class MdbCard {

  private long cardId;
  private long charaId;
  private String cardName;
  private long attack;
  private long defense;
  private java.sql.Timestamp insDate;
  private java.sql.Timestamp updDate;
  private String updAccount;
  private String remarks;


  public long getCardId() {
    return cardId;
  }

  public void setCardId(long cardId) {
    this.cardId = cardId;
  }


  public long getCharaId() {
    return charaId;
  }

  public void setCharaId(long charaId) {
    this.charaId = charaId;
  }


  public String getCardName() {
    return cardName;
  }

  public void setCardName(String cardName) {
    this.cardName = cardName;
  }


  public long getAttack() {
    return attack;
  }

  public void setAttack(long attack) {
    this.attack = attack;
  }


  public long getDefense() {
    return defense;
  }

  public void setDefense(long defense) {
    this.defense = defense;
  }


  public java.sql.Timestamp getInsDate() {
    return insDate;
  }

  public void setInsDate(java.sql.Timestamp insDate) {
    this.insDate = insDate;
  }


  public java.sql.Timestamp getUpdDate() {
    return updDate;
  }

  public void setUpdDate(java.sql.Timestamp updDate) {
    this.updDate = updDate;
  }


  public String getUpdAccount() {
    return updAccount;
  }

  public void setUpdAccount(String updAccount) {
    this.updAccount = updAccount;
  }


  public String getRemarks() {
    return remarks;
  }

  public void setRemarks(String remarks) {
    this.remarks = remarks;
  }

}

```

#####めっちゃそれっぽくないじゃないですか？
さらにここから弊社のEntityの形になるようスクリプトを修正し再度実行すると、、、

```c#
// 私が所属しているところではプライマリーやマッピングは属性で行っています
[DbTable(TableName = "MdbCard", TableComment = "Mカード")]
[DbKey(KeyType = DbKeyType.PRIMARY, KeyColumnNames = new []{"CardId"})]
public class MdbCard
{
    [DbColumn(ColumnName = "CardId", ColumnComment = "カードID")]
    public long CardId { get; set; }

    [DbColumn(ColumnName = "CharaId", ColumnComment = "キャラID")]
    public long CharaId { get; set; }

    [DbColumn(ColumnName = "CardName", ColumnComment = "カード名")]
    public string CardName { get; set; }

    [DbColumn(ColumnName = "Attack", ColumnComment = "攻撃力")]
    public int Attack { get; set; }

    [DbColumn(ColumnName = "Defense", ColumnComment = "防御力")]
    public int Defense { get; set; }

    [DbColumn(ColumnName = "InsDate", ColumnComment = "登録日時")]
    public AnDate InsDate { get; set; }

    [DbColumn(ColumnName = "UpdDate", ColumnComment = "更新日時")]
    public AnDate UpdDate { get; set; }

    [DbColumn(ColumnName = "UpdAccount", ColumnComment = "最終更新者")]
    public string UpdAccount { get; set; }

    [DbColumn(ColumnName = "Remarks", ColumnComment = "備考")]
    public string Remarks { get; set; }

}
```

すごい！
これをGUIでできるようになるのでみんな使いましょうという記事です。

#使い方
DBに接続されているJetBrainsのIDEで
・テーブルを右クリック
・[Scripted Extensions]→[Generate POJOs.groovy]を実行
これだけで上記Javaファイルができます。
ここから自分なりのEntityに修正していくために、再度テーブルを右クリックし[Scripted Extensions]→[Go To Scripts Directory]でgroovyファイルが入っているディレクトリに移動します。
![0n5c2-0rag3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855584/07690b0d-d5a5-8d76-23f3-0d8e89357460.gif)

#Groovyファイルをお好きに修正
Generate POJOs.groovyが入っているディレクトリに移動できたらあとはこれをコピーして好きなように修正していきいます。
ここからは各々の環境で変わってくるのでコメントで注釈いれた元groovyファイルをGitHubに上げておきます。
https://github.com/hirayama2323/Generate_POJOs/blob/master/Generate%20POJOs.groovy

Groovy言語というものを今回始めて聞いたので詳しい解説などはできませんがPythonみたいな直感で動くスクリプト言語だと思って頂ければ（Pythonもよくわかっていない）。
リファレンスも何も書いていない、誰も使っていないのか解説しているサイトもないのでどこに何が入っているのか把握するのが大変でしたができるだけ詳しくコメントに書いたのでご参考にしていただければ。
また、「こうしたほうがいい」やUniqueキーの情報を取り出せた方がいましたらぜひコメント頂きたいです。

#参考
https://pleiades.io/help/idea/database-tool-window.html#view_options