質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

26134閲覧

Dto(Entity)クラス、Daoクラスを自動生成したい

lupus_dingo

総合スコア257

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2016/03/30 09:16

編集2016/03/30 09:21

spring3.1+jdbcTemplateで開発しています。

現在、1テーブルごとにDao、DaoImpl、Dtoの3クラスを作っているのですが、手間がかかるのでこれらをテーブル定義から自動生成する方法はないでしょうか?

クラスの概要
・Dao:
serviceクラスから呼ぶinterface(select,update,insert,deleteなど)
・DaoImpl:
daoで定義したメソッドを実装するクラス(ここでjdbcTemplateを呼ぶ)
・Dto:
DaoImplで取得したデータを格納するクラス

特にDaoImplクラスは直接SQLを記入しているので手間がかかる上にカラム名を変えた場合など保守性が下がります。

理想的には、

BookDao bookDao = new BookDao();
// 主キーによる検索
BookDto book = bookDao.select(book_id);

// テーブル定義のデフォルト値によるクリア
book.clear();

book.setBookName("javaの本");
book.setCost(3000);

// dtoを渡してinsertやupdate処理
bookDao.insert(book);

特にinsertの場合は主キーやシーケンスの意識も必要になるので単純ではないと思います。
どのような方法があるでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

あくまで1つの方法として提案ですが、

jdbcテンプレートを使うのではなく、別のO/Rマッピングフレームワークを利用する手があります。

DTOを全てつくる手間を惜しむ場合はmybatisを使い、ServiceからDAOを呼ぶ処理を全てMybatisに委ね、Serviceクラスでは必要な項目名のみjava.util.HashMapに詰め込む方法もあります。
もちろん検索結果の戻り値もMapに詰めることも可能です。

MapはDTOを利用するときとは異なり、項目名が可変なのをメリットと見るか、自由に項目が変わってしまうのをデメリットと見るかは、作業量とスピード感・テストの品質と関わるところでしょうか。

参考になれば幸いです。

投稿2016/03/30 11:26

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2016/03/31 11:19

回答ありがとうございます。 Mybatis、リフレクションについて調べてみましたところ、私がやりたいことは Fieldを使うリフレクションに近かった(SQL文を動的に組み立てる)のでリフレクションを用いる方向で進めていきたいと思います。
guest

0

ベストアンサー

解答というより、キーワードだけ。
リフレクションを使えば実現できると思います。

投稿2016/03/30 09:44

Odacchi

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lupus_dingo

2016/03/31 11:20

回答ありがとうございます。 Mybatis、リフレクションについて調べてみましたところ、私がやりたいことは Fieldを使うリフレクションに近かった(SQL文を動的に組み立てる)のでリフレクションを用いる方向で進めていきたいと思います。
lupus_dingo

2016/04/01 07:37

一点教えてください。 主キーカラム名やシーケンス名はどこで管理すればよいでしょうか? dtoクラスではフィールドはカラム名だけにしたいので、ここに pk="book_id"; seq="seq_book"; などのメタ情報のフィールドを追加すると、単純にフィールドを元にSQLを組み立てるということができなくなってしまいます。
Odacchi

2016/04/03 06:10

よくあるパターンとしては、 DBのカラム名は、全て大文字のスネークケースで記述し(BOOK_ID、SEQ_NUMなど)、 DTOのフィールドは、キャメルケースで記述するという方法です(bookId, seqNumなど)。 キャメルケースとスネークケースの変換はorg.seasar.doma.util のStringUtilクラスでも提供されています。
lupus_dingo

2016/04/03 16:03

> DBのカラム名は、全て大文字のスネークケースで記述し(BOOK_ID、SEQ_NUMなど)、 DTOのフィールドは、キャメルケースで記述するという方法です(bookId, seqNumなど)。 提示いただいた例はどちらも同じものを指していますが、要するにカラム名はすべて大文字のスネークケースにし、 それ以外のPKやシーケンスなどはキャメルケースにすると管理できるという意味でしょうか? public class Book { //カラム名 public int BOOK_ID; public String BOOK_NAME; public Timestamp UPDATE; //それ以外 public String pk="book_id"; public String seqName="seq_book"; 〜setter、getter〜 }
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問