CODEMATIC Java版でも利用してます! RDBを簡単に扱えるHibernateのすすめ
目次
こんにちは。都築です。
今回はCODEMATICでも使用しているHibernateについてご紹介したいと思います。
システムでデータ管理する上で、データベースを利用することは多々あるかと思います。より簡単にデータベースを扱うために、ぜひご参考いただければと思います。
Hibernateとは
簡単にいうとJavaのObjectとデータベースのデータをマッピングし、簡易にデータの参照/登録/更新/削除が出来るフレームワークです。
JPA(Java Persistence API)を実装したプロダクトで、O/RマッピングによってObjectで保持したデータを、テーブルの各項目と対応付け、下記のような煩雑な実装を行うことなくシステムを構築することが可能となっています。
- コネクションの取得に関する記述
- 発行するSQL文に対する記述
- ResultSetからのデータ詰替えなどの記述
Entityクラスの作成
まず、Hibernateでデータを扱う為に、テーブルの項目名や型を定義したEntityというデータオブジェクトを作成する必要があります。
例えばSampleというテーブルに対し処理を行う場合、下記のようにSampleEntityを作成しSampleテーブルの定義をしておくことにより、JavaのObjectとデータベースのデータの関連付けが行われます。
@Entity(name="sample") @Inheritance(strategy=InheritanceType.SINGLE_TABLE) public class SampleEntity { /** ID */ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sq_sample") @SequenceGenerator(name="sq_sample", sequenceName = "sample_id_seq", allocationSize=1 ) @Column private Long id = new Long(0); /** テキスト1 */ @Column private String txt1; /** テキスト2 */ @Column private String txt2; /** * IDの取得 * @return id */ public Long getId() { return id; } /** * IDの設定 * @param id */ public void setId(Long id) { this.id = id; } /** * テキスト1の取得 * @return txt1 */ public String getTxt1() { return txt1; } /** * テキスト1の設定 * @param txt1 */ public void setTxt1(String txt1) { this.txt1 = txt1; } /** * テキスト2の取得 * @return txt2 */ public String getTxt2() { return txt2; } /** * テキスト2の設定 * @param txt2 */ public void setTxt2(String txt2) { this.txt2 = txt2; } }
Entityに対する定義は、基本的にアノテーションで定義されます。上記SampleEntityに記述されているアノテーションは、それぞれ下記のようになっています。
アノテーション | 使用方法 |
---|---|
@Entity | Entityということを示すアノテーションです。 特にsampleテーブルの登録/更新/削除を行うEntityとして利用するために、name=”sample”という記述をしています。 |
@Inheritance | 単一テーブルということを示すアノテーションです。 テーブル結合したデータを取得する場合などは、InheritanceType.TABLE_PER_CLASSにするなど適宜設定します。 |
@Id | 主キーということを示すアノテーションです。 これによって主キーでの検索や削除などが容易に行えるようになります。 |
@GeneratedValue @SequenceGenerator |
データベースのシーケンスを利用して、主キー値を自動生成することを示すアノテーションです。 上記例の場合は、データベースに定義されたsample_id_seqというシーケンスを、Java上はsq_sampleという名前で定義し、登録時にsq_sampleを利用して主キーを自動生成されるようになっています。 これによって登録時にわざわざシーケンスを取得する必要がなくなります。 |
@Column | Objectとマッピングする対象カラムであることを示すアノテーションです。 Sampleテーブルのカラムであるid、txt1、txt2を定義しています。 |
この他にもHibernateでは用途に応じて多くのアノテーションが用意されています。アノテーションを利用することで、Hibernateでは実装を簡易、画一的となるようになっています。
データの取得
データの取得方法についてはいくつかメソッドが用意されています。例えば主キー指定で取得をする場合、EntityManagerのfindメソッドを利用し下記のように記述します。
※事前にEntityManagerを作成しインジェクションしておく必要があります。
SampleEntity entity = this.find(SampleEntity.class, 1);
Sampleテーブルに対するEntityであることを定義したSampleEntityと、主キーの1を引数として渡すだけで、1行でデータ取得が行えます。また、ResultSetからデータオブジェクトへの値の詰替えなどもHibernateが実施してくれるため不要です。
また、主キー以外での検索を行う場合は、EntityManagerのgetResultListメソッドを利用し下記のように記述します。
// 取得SQLの作成 String sql = " SELECT * FROM sample WHERE txt1 = :txt1"; Query query = this.createNativeQuery(sql, SampleEntity.class); // パラメータの設定 query.setParameter("txt1", "条件"); // 取得SQLの実行 List<SampleEntity> entityList = query.getResultList();
2,3行目
データを取得するSQLをEntityManagerに設定します。ここで設定したSampleEntityの型でSQLの結果が返ってきます。
5行目
SQL中の動的変数をEntityManagerに設定します。SQL中では、ここで設定したtxt1をという名前から:txt1として扱うことが可能となっています。
7行目
上記で設定したSQLを実行します。
主キー指定での取得と同様に、ResultSetから値の詰替えなどはHibernateが行ってくれるため、不要です。
JOINを利用した複数テーブルに対する取得も同様にgetResultListで行いますが、その際は戻り値の型としてSQLのSELECT句に対応したEntityクラスを用意しておく必要があります。また、SELECT COUNTのように戻り値が単一の場合はgetSingleResultを利用することで、戻り値をListではなく単一レコードのObjectとして受け取ることもできます。
データの登録
データを登録するにはテーブルのEntityを作成し、EntityManagerのpersistメソッドを利用して下記のように記述します。
SampleEntity entity = new SampleEntity(); // テキスト1の設定 entity.setTxt1("txt1のデータ"); // テキスト2の設定 entity.setTxt2("txt2のデータ"); // データのINSERT this.persist(entity);
SampleEntityは前述の通り、sampleテーブルのEntityということが定義されており、これによってSampleEntityに設定されたデータがsampleテーブルに登録されます。また、主キーであるIDはシーケンスによる自動生成を行う為、設定は不要となっています。
データの更新
データを更新するには更新したいエンティティをEntityManagerで取得し、Entityに設定することで自動でデータベースの値が更新されます。
// 更新対象のエンティティを取得 SampleEntity entity = this.find(SampleEntity.class, 1); // データの更新 entity.setTxt1("更新後データ");
取得や登録と違いメソッドを実行することなく、EntityManagerがオブジェクトの変更を検知し自動でUpdateが行われます。自動でUpdateを行いたくない場合はデータ取得と同様にSQLを作成し、EntityManagerのexecuteUpdateを実行します。
// 更新SQLの作成 String sql = " UPDATE sample SET txt1 = :txt1 WHERE id = :id"; Query query = this.createQuery(sqlBuf.toString()); // パラメータ設定 query.setParameter("txt1", "更新後データ"); query.setParameter("id", 1); // データのUPDATE count = query.executeUpdate();
データの削除
データを削除するには削除したいエンティティをEntityManagerで取得し、EntityManagerのremoveメソッドを利用して下記のように記述します。
// 削除対象のエンティティを取得 SampleEntity entity = this.find(SampleEntity.class, 1); // データのDELETE this.remove(entity);
まとめ
Hibernateでは上記のように簡単にデータベースのデータを扱うことができます。
前述の通り
CODEMATICではこの機能を利用し、テーブル定義をベースに一覧/登録/更新などの基本的な機能が自動生成されるようになっています。ビジネスロジックを組む場合も、より簡単にデータをJavaで取り扱える仕組みになっています。
ご興味がある方はぜひ下記のURLより、お問合せください。デモ動画やサイトもご用意しておりますので、ちょっと見てみたいなどのご要望にも対応可能です。お気軽にお問合せくださいませ。
CODEMATICサイト
《関連記事》