jpaについてInsetとSelectについて調べてみました。

Java eeとかJSFとかについて調べてみるとデータベースにアクセスするためのJPAという技術を使っているようです。

java ee, JSFの簡単なチュートリアルから始めてみました。

実際に試してみるとコードをほとんど書くことなく、データベースの一覧の表示からデータの投入ができるので本当にびっくりしました。

ただ、JPAではSQL文をそのまま使うのではなくjpqlで書くようです。

ちょっとネットで役に立ちそうなページを探してみました。

Using Java Persistence API for Java SE 7 Desktop applications in NetBeans 7

JPQLでのデータベースの参照および更新方法

ここで一番目のページからソースをとってきて2番めのページに書いてあることを試してみました。

試して作ったコード

Netbeans 8であれば動作すると思います。一番目のページを元にDerbyでデータベースを作成したあと試してみてください。

InsertについてはCreatePlayers.javaを実行すれば新しいデータを追加します。

情報の検索についてはselectPlayers.javaを実行すればSelectを使用できます。

まず試してみたのは、IDを元にデータを取る方法です。selectPlayers.javaでは以下のように書きました。

        Query q = em.createNamedQuery("Player.findById").setParameter("id", 1);

        Player p2 = (Player) q.getSingleResult();

        System.out.println(p2.getFirstname());
        System.out.println(p2.getId());
        System.out.println(p2.getLastname());

クエリーの指定は “Player.findById”にしていますが、これは自分で作ったものではなく、Netbeansで「データベースからのエンティティクラス」により新規作成した時に生成されたものになります。

@NamedQueries({
    @NamedQuery(name = "Player.findAll", query = "SELECT p FROM Player p"),
    @NamedQuery(name = "Player.findById", query = "SELECT p FROM Player p WHERE p.id = :id"),
    @NamedQuery(name = "Player.findByLastname", query = "SELECT p FROM Player p WHERE p.lastname = :lastname"),
    @NamedQuery(name = "Player.findByFirstname", query = "SELECT p FROM Player p WHERE p.firstname = :firstname"),
    @NamedQuery(name = "Player.findByJerseynumber", query = "SELECT p FROM Player p WHERE p.jerseynumber = :jerseynumber"),
    @NamedQuery(name = "Player.findByLastspokenwords", query = "SELECT p FROM Player p WHERE p.lastspokenwords = :lastspokenwords")})

ここで生成されたものから、必要に応じて利用しています。ここでjpql文については自分で作成することもできるのでJoinしたものやLikeなどを使用したものを利用できるみたいです。これについてはまた改めて調べてみたいと思います。

ここでidによる検索を選択し、IDをsetParameterで指定することで検索します。IDはユニークなキーなのでgetSingleResult()を指定しました。

複数の結果が出てくる場合にはこのような方法ではなくListでデータが渡されるようなのでまた違う方法が必要になります。

selectPlayers.javaでは以下のように書きました。

        Query q2 = em.createNamedQuery("Player.findAll");
        List results = q2.getResultList();
        if (!results.isEmpty()) {
            Iterator itr = results.iterator();
            while (itr.hasNext()) {
                Player p3 = (Player) itr.next();
                System.out.print("ID:" + p3.getId());
                System.out.print("   NAME:" + p3.getFirstname() +":" + p3.getLastname());
                System.out.println();
            }
        } else {
            System.out.println("There is no any record.");
        }

getSingleResult()の代わりにgetResultList()を使用しています。またデータの方がlistなのでIteratorを利用して複数のデータを処理しています。

他にも方法があれば調べてみたいと思います。

あとはUpdateと複雑な検索について調べてみたらまたアップしたいと思っています。

コメントを残す