ORMモドキ作成 (4.6)

ORMモドキのお話がなかなか終わらないですが(・∀・)
自分のORMモドキで使用するDTOクラスを簡単に作成できるように、DBのスキーマを覗いてDTOクラスを生成するツールなんかを作ったりしてました。
後、DAO処理の基本RCUDメソッドの生成ツールも一緒に。


なんか、中国人を雇って、DTOとか定型なDAOを人海戦術で作るなんて話をしていたので、(゚Д゚)ハァ?って感じで。
自動生成ツール作ったら1日で終わったわけですが。
まあ、だからといって、雇用に使おうと思っていた予算が自分の給料になる訳でもなく、残業して役にも立たないドキュメントを書いている人の方が給料は良かったりするわけですが…などとヤサグレてみたり(´ω`)


8時間力技で働いて終わらずに10時間かかるよりも、6時間で自動生成ツールを作って1時間で実行、残った1時間は自分のテーマの研究に割り当てるとか言うのが望ましいプログラマの姿勢だと思うんですけどね。
まあ、そういう働き方ができない環境も多いんでしょうけど、それが出来る状況を与えられているのなら、ぜひそういう仕事のやり方をしたいところです(´ω`)


で、生成ツールのお話ですが(・∀・)
要するに、スキーマ情報からテーブル名、フィールド名、フィールド型なんかを取得して、その情報を元にソースコードの生成をするわけですが。
スキーマ情報の取得には、DataAdapterを利用してDataTableに取得するやりかたを利用しています。


こんな感じですね。

string table = "[対象テーブル名]";
string sql = String.Format( "select * from {0}", table );
OracleDataAdapter da = new OracleDataAdapter( sql, ConnectionString );
DataTable dt = new DataTable( table );
da.FillSchema( dt, SchemaType.Mapped );

foreach( DataColumn column in dt.Columns )
{
    //column.ColumnName; // フィールド名の取得
    //column.DataType;   // フィールド型の取得
}

foreach( DataColumn pkey in dt.PrimaryKey )
{
    //pkey.ColumnName;   // PKフィールド名の取得
}

この処理で集まった情報をベースに、例のごとくStringBuilderを利用してソースコードを生成していくわけです。


ちなみに生成されるDTOクラスのソースコードはこんな感じで。

public class HogeDTO
{
    private int hogeId;
    private string hogeData;

    [PrimaryKey]
    public int HogeId
    {
        get { return( this.hogeId ); }
        set { this.hogeId = value; }
    }

    public string HogeData
    {
        get { return( this.hogeData ) }
        set { this.hogeData = value; }
    }

    public HogeDTO()
    {
    }

    public HogeDTO(int hogeId)
    {
        this.hogeId = hogeId;
    }

    public HogeDTO(int hogeId, string hogeData)
    {
        this.hogeId = hogeId;
        this.hogeData = hogeData;
    }
}

コンストラクタについては、デフォルト、PKのみ指定するもの、全メンバを指定するものを生成するようにしてみたり。


DAOメソッドの方の生成については、GenericDaoのラッパーを作るだけですが。
以下の様なラッパーメソッドを生成するようにしてみました。

public static ArrayList GetHogeList()
public static HogeDTO GetHoge(int hogeId)
public static HogeDTO GetHoge(OracleConnection conn, int hogeId)
public static int InsertHoge(HogeDTO dto)
public static int InsertHoge(OracleConnection conn, HogeDTO dto)
public static int UpdateHoge(HogeDTO dto)
public static int UpdateHoge(OracleConnection conn, HogeDTO dto)
public static int DeleteHoge(HogeDTO dto)
public static int DeleteHoge(OracleConnection conn, HogeDTO dto)
public static int DeleteHoge(int hogeId)
public static int DeleteHoge(OracleConnection conn, int hogeId)

まあ、基本はStringBulderでガシガシするだけの話なので、難しい事でもなんでもないわけですが。


こういうの、本当は設計書としてExcelを使って、DDLDTO、DAOなんかはExcelから自動生成するようにしたほうが良いわけですが。
そういうことが分かってる人が最初から設計に入っていないと難しいのよね〜(´ω`)