<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>技術ブログ &#124; 株式会社クラウディア &#187; O/Rマッパー</title>
	<atom:link href="https://cloudear.jp/blog/?cat=36&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://cloudear.jp/blog</link>
	<description>クラウド専門の業務システム・社内ツール開発</description>
	<lastBuildDate>Fri, 12 Nov 2021 05:00:35 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0.1</generator>
	<item>
		<title>JPAを深掘りする〜Criteria APIで型安全な検索を追求しよう！【応用編】</title>
		<link>https://cloudear.jp/blog/?p=2143</link>
		<comments>https://cloudear.jp/blog/?p=2143#comments</comments>
		<pubDate>Fri, 18 Mar 2016 03:11:58 +0000</pubDate>
		<dc:creator><![CDATA[tomo]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[O/Rマッパー]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=2143</guid>
		<description><![CDATA[JPAを深掘りするシリーズの応用編です。 前回はCriteria APIの基本と利点をご紹介しました。今回はCriteria APIの実戦的な機能をいろいろとご紹介します。 準備・エンティティクラスとメタモデルクラスのサ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>JPAを深掘りするシリーズの応用編です。</p>
<p>前回はCriteria APIの基本と利点をご紹介しました。今回はCriteria APIの実戦的な機能をいろいろとご紹介します。</p>
<p><span id="more-2143"></span></p>
<h2>準備・エンティティクラスとメタモデルクラスのサンプル</h2>
<p>次のようなエンティティクラスとメタモデルクラスが存在することを前提に進めていきます。</p>
<p>まずはUserエンティティクラスです。</p>
<pre class="lang:java decode:true" title="User.java">package sandbox.entity;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long      id;

    @Column(length = 150, unique = true, nullable = false)
    String    name;

    // getter/setterは省略
}
</pre>
<p>次にUserエンティティのプロパティの型を表すメタモデルクラスです。</p>
<pre class="lang:java decode:true " title="User_.java">package sandbox.entity;

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value="Dali", date="2016-02-12T22:59:19.623+0900")
@StaticMetamodel(User.class)
public class User_ {
	public static volatile SingularAttribute&lt;User, String&gt; name;
	public static volatile SingularAttribute&lt;User, Long&gt; id;
}
</pre>
<p>それではCriteria APIを見ていきましょう。</p>
<h2>Where条件にメタモデルクラスを使う</h2>
<p><strong>メタモデルクラス</strong>は、Criteria APIによるクエリの型安全性を高めるという重要な役割を持っています。</p>
<p>冒頭で示したUserというエンティティクラスをnameプロパティの値で絞り込むクエリを作ってみましょう。</p>
<pre class="lang:java decode:true ">private static void selectUsersByName(final EntityManager em, final String pUserName) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;User&gt; query = builder.createQuery(User.class);
    final Root&lt;User&gt; root = query.from(User.class);
    query.where( //
            // メタモデルクラスを使ってカラムを指定する
            builder.equal(root.get(User_.name), pUserName) //
    );
    final List&lt;User&gt; result = em.createQuery(query).getResultList();
    for (final User user : result) {
        System.out.println(user);
    }
}
</pre>
<p>eclipseの入力補完の様子を見ると、fromに指定したエンティティクラスに応じたメタモデルクラスが候補として表示されることが分かると思います。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/jps-typesafe-query.png"><img class="alignnone size-full wp-image-2123" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/jps-typesafe-query.png" alt="jps-typesafe-query" width="593" height="170" /></a></p>
<p>&nbsp;</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/jps-typesafe-query-2.png"><img class="alignnone size-full wp-image-2124" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/jps-typesafe-query-2.png" alt="jps-typesafe-query-2" width="644" height="135" /></a></p>
<h2>Where句に複雑な条件を設定する</h2>
<p>検索画面のようにWhere句が動的かつ複雑になる時に、Criteria APIは威力を発揮します。例えば入力のある条件はWhere句に加えるが、入力のない条件はWhere句に加えない、という処理をJPQLで書くのは割と大変です。</p>
<pre class="lang:java decode:true">private static void selectUsersByName(final EntityManager em, final String name) {
    final StringBuilder s = new StringBuilder("select e from User e where 1 = 1");
    if (name != null) {
        s.append(" and e.name = :name");
    }

    final TypedQuery&lt;User&gt; query = em.createQuery(new String(s), User.class);

    if (name != null) { // 存在しないパラメータを設定すると例外が生じるため、再度チェックせざるを得ない！
        query.setParameter("name", name);
    }

    final List&lt;User&gt; result = query.getResultList();
    for (final User user : result) {
        System.out.println(user);
    }
}
</pre>
<p>これをCriteria APIで書き直すと、とても素直なプログラムになります。</p>
<pre class="lang:java decode:true ">private static void selectUsersByName(final EntityManager em, final String name) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;User&gt; query = builder.createQuery(User.class);
    final Root&lt;User&gt; root = query.from(User.class);

    final List&lt;Predicate&gt; where = new ArrayList&lt;&gt;();
    if (name != null) {
        where.add(builder.equal(root.get(User_.name), name));
    }

    query.where(where.toArray(new Predicate[where.size()]));

    final List&lt;User&gt; result = em.createQuery(query).getResultList();
    for (final User user : result) {
        System.out.println(user);
    }
}
</pre>
<h2> 関連クラスを同時に取得する</h2>
<p>JPAの強みの１つにエンティティクラスの関連をコードで表現出来ることがあります。下記はUserを親に持つTagというエンティティを作っています。</p>
<pre class="lang:java decode:true">package sandbox.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Tag {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long   id;

    @Column(length = 50, unique = false, nullable = false)
    String name;

    @ManyToOne(fetch = FetchType.LAZY)
    User   user;

    @Column(nullable = false)
    long   starCount;

    // getter/setterは省略
}</pre>
<p>Tagを取得する際、親のUserも同時に取ってくるようなクエリを作ってみましょう。</p>
<pre class="lang:java decode:true">private static void selectTagWithUser(final EntityManager em) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;Tag&gt; query = builder.createQuery(Tag.class);
    final Root&lt;Tag&gt; root = query.from(Tag.class);

    root.fetch(Tag_.user, JoinType.LEFT); // 関連エンティティを同時に取ってくるように指定

    final List&lt;Tag&gt; result = em.createQuery(query).getResultList();
    for (final Tag tag : result) {
        System.out.println(tag.getUser());
    }
}
</pre>
<p>9行目がポイントです。実はこの行がなくても関連エンティティは取得できるのですが、SQLの実行回数が格段に変わってきます。俗に言う「N+1問題」を回避する手法です。</p>
<h2>関連先のエンティティの条件を指定する</h2>
<p>JPAの強力な機能の１つに、関連先エンティティの条件指定がとても簡単な点があります。</p>
<pre class="lang:java decode:true">private static void selectTagByUserName(final EntityManager em, final String pUserName) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;Tag&gt; query = builder.createQuery(Tag.class);
    final Root&lt;Tag&gt; root = query.from(Tag.class);

    query.where(builder.equal(root.get(Tag_.user).get(User_.name), pUserName));

    final List&lt;Tag&gt; result = em.createQuery(query).getResultList();
    for (final Tag tag : result) {
        System.out.println(tag);
    }
}</pre>
<p>6行目がポイントです。「Tagクラス#userプロパティ」→「Userクラス#nameプロパティ」とたどって条件指定しています。SQLで同じことをしようとするとJOINを書く必要があり手間がかかるところですが、JPAではかなりシンプルに書けることが分かります。</p>
<h2>Where句に IN条件を指定する</h2>
<p>IN条件は少し特殊な書き方をするのでハマることがあります。</p>
<pre class="lang:java decode:true">private static void selectUsersByNames(final EntityManager em, final String... names) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;User&gt; query = builder.createQuery(User.class);
    final Root&lt;User&gt; root = query.from(User.class);

    if (names != null &amp;&amp; names.length &gt; 0) {
        query.where(root.get(User_.name).in(names));
    }

    final List&lt;User&gt; result = em.createQuery(query).getResultList();
    for (final User user : result) {
        System.out.println(user);
    }
}
</pre>
<p>7行目でIN条件を指定しています。CriteriaBuilderを使わない点に注意してください。</p>
<p>また要素数が0の時の挙動は、残念ながらDB製品依存となるようなので、プログラムで明示的にチェックするのが無難でしょう。</p>
<h2>Tupleを使って柔軟な結果を得る</h2>
<p>Tupleという汎用クラスを使えばエンティティにとらわれない形でデータを取得できます。例えば、JOINを使って複数のテーブルからデータを取得しつつ集計するような用途に有用です。</p>
<p>ただし、型安全性が失われる点には注意が必要です。</p>
<pre class="lang:java decode:true">private static void selectTupleWithJoin(final EntityManager em) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();

    // Tupleで結果を受け取る
    final CriteriaQuery&lt;Tuple&gt; query = builder.createTupleQuery();

    // Tagを主テーブルにする
    final Root&lt;Tag&gt; root = query.from(Tag.class);

    // JOINする
    final Join&lt;Tag, User&gt; join = root.join(Tag_.user);

    final Path&lt;String&gt; userName = join.get(User_.name);

    // ユーザ名で集計する
    query.groupBy(userName);

    // Userから特定のカラムのみ取得しつつTagのstarCountを合計する
    // 後で取り出しやすいように、カラムには別名を付けておく
    query.multiselect( //
            userName.alias("user_name") //
            , builder.sum(root.get(Tag_.starCount)).alias("tag_count") //
    );

    final List&lt;Tuple&gt; result = em.createQuery(query).getResultList();
    for (final Tuple e : result) {
        System.out.println(e.get("user_name") + " " + e.get("tag_count"));
    }
}</pre>
<h2>任意のデータクラスをクエリの結果の型にする</h2>
<p>Tupleの弱点は、Tupleが汎用的すぎて「どんなデータがいくつ入っているか分かりにくい」ことです。これを補うために、任意の型をクエリの結果とすることができます。</p>
<p>Tupleの例を書き直してみます。まずは結果を受け取るためのクラスを作ります。コンストラクタで全ての値を受け取るようにする必要があります。</p>
<pre class="lang:java decode:true">public class StarSummary {

    private final String userName;
    private final long   tagCount;

    public StarSummary(final String pUserName, final long pTagCount) {
        this.userName = pUserName;
        this.tagCount = pTagCount;
    }

    // getterは省略
}</pre>
<p>作ったクラスをクエリの結果とするには、<code>CriteriaBuilder#construct(Class, Selection&lt;?&gt;...)</code>を使ってクエリを組み立てます。</p>
<pre class="lang:java decode:true">    private static void selectStartSummary(final EntityManager em) {
        final CriteriaBuilder builder = em.getCriteriaBuilder();
        final CriteriaQuery&lt;StarSummary&gt; query = builder.createQuery(StarSummary.class);
        final Root&lt;Tag&gt; root = query.from(Tag.class);

        final Join&lt;Tag, User&gt; join = root.join(Tag_.user);

        query.select( //
                builder.construct(StarSummary.class //
                , join.get(User_.name) //
                , builder.sum(root.get(Tag_.starCount)) //
        ));
        query.groupBy(join.get(User_.name));

        final List&lt;StarSummary&gt; result = em.createQuery(query).getResultList();
        for (final StarSummary e : result) {
            System.out.println(e);
        }
    }
</pre>
<p>9〜11行目でデータクラスを扱っています。</p>
<p>Tupleに比べ扱いやすい型で結果を得られますが、一方でコンストラクタ引数の順番に依存するプログラムとなってしまうのが弱点です。ですがTupleの「どんなデータがいくつ入っているか分かりにくい」という欠点はとても重大ですので、できれば、こちらのデータクラスを使う方が望ましいです。</p>
<h2>型安全になりきれていない箇所</h2>
<p>ここまで見てきたように、Criteria APIは型安全にクエリを組み立てられる非常に便利な機能なのですが、残念ながら型安全になりきれていない箇所があります。代表的なのは<code>CriteriaBuilder#equal(Expression&lt;?&gt; exp, Object value)</code>メソッドです。</p>
<p>例えば次のコードを見てください。</p>
<pre class="lang:java decode:true">    query.where( //
        builder.equal(root.get(User_.name), pUserName) //
    );
</pre>
<p>これを次のように書き間違えたとしても、コンパイルエラーにはならないのです。</p>
<pre class="lang:java decode:true">    query.where( //
        builder.equal(root.get(User_.id), pUserName) //
    );
</pre>
<p>このケースでは実行時例外がスローされますが、場合によっては例外がスローされず普通に実行されてしまうため、分かりにくいバグの原因となる可能性があります。</p>
<p>このメソッドのシグニチャが</p>
<pre class="lang:java decode:true ">&lt;C&gt; Predicate equal(Expression&lt;C&gt; exp, C value)</pre>
<p>となっていればよかったのに・・・と思えてなりません。頻繁に使うメソッドだけに残念です。</p>
<h2>JPAのその他の機能</h2>
<p>最後に、ちょっとした便利機能をいくつか紹介しておきます。</p>
<h3>ページングに使える２つのメソッド</h3>
<p>Webアプリケーションでは検索結果が大量になる場合、ページング表示するのが普通です。JPAには簡単にページングを実装するためのメソッドがあります。</p>
<p><code>setFirstResult()/setMaxResults()</code>です。</p>
<pre class="lang:java decode:true">private static List&lt;User&gt; selectUsersWithPaging(final EntityManager em, final int pPageIndex, final int pCountPerPage) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;User&gt; query = builder.createQuery(User.class);
    query.from(User.class);
    return em.createQuery(query) //
            .setFirstResult(pPageIndex * pCountPerPage) //
            .setMaxResults(pCountPerPage) //
            .getResultList();
}
</pre>
<p>7行目と8行目でページングを指定しています。</p>
<h3>結果が必ず1件と分かっている場合に使えるメソッド</h3>
<p>結果が必ず1件と分かっている時には<code>getSingleResult()</code>メソッドが使えます。</p>
<pre class="lang:java decode:true">private static void countAllUsers(final EntityManager em) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;Long&gt; query = builder.createQuery(Long.class);
    final Root&lt;User&gt; root = query.from(User.class);

    query.select(builder.count(root));

    final long count = em.createQuery(query).getSingleResult().longValue();
    System.out.println(count);
}
</pre>
<p>ただし、結果が1件でなかった時は例外がスローされますので、絶対に1件と確信が持てる場合にのみ使ってください。</p>
<h2> まとめ</h2>
<p>Criteria APIを中心に、２回に渡ってJPAの様々な機能を解説してきましたがいかがでしたでしょうか。</p>
<p>JPAには他にも便利で重要な機能がたくさんあります。特にエンティティクラスの設計は工夫のしがいがあり、別の機会でご紹介したいところです。</p>
<p>非常にパワフルなJPA。JavaEEを使う場合はぜひJPAを使って効率的かつ安全にDBアクセスを実装していただきたいと思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=2143</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JPAを深掘りする〜Criteria APIで型安全な検索を追求しよう！【基本編】</title>
		<link>https://cloudear.jp/blog/?p=2101</link>
		<comments>https://cloudear.jp/blog/?p=2101#comments</comments>
		<pubDate>Mon, 22 Feb 2016 02:10:59 +0000</pubDate>
		<dc:creator><![CDATA[tomo]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[O/Rマッパー]]></category>
		<category><![CDATA[データベース]]></category>
		<category><![CDATA[フレームワーク]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=2101</guid>
		<description><![CDATA[今回はJavaEEの中でも特に重要な「JPA（Java Persistence API）」を深掘りしてみます。基本編と応用編の２回に渡ってじっくりとJPAをご紹介します。 JPAとは JPAは一言で言えば「高機能なDBア [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>今回はJavaEEの中でも特に重要な<strong>「JPA（Java Persistence API）」</strong>を深掘りしてみます。基本編と応用編の２回に渡ってじっくりとJPAをご紹介します。</p>
<h2>JPAとは</h2>
<p>JPAは一言で言えば「高機能なDBアクセスフレームワーク」です。DBアクセスフレームワークは実に様々なものがありますが、JPAの特徴は</p>
<p><span id="more-2101"></span></p>
<ul>
<li>エンティティクラスへの操作を通してDB操作を実現する（DBの都合はプログラマから極力隠される）</li>
<li>型安全を追求するための様々な機能を備える</li>
</ul>
<p>が挙げられます。Javaの良さを引き出す工夫に満ちたフレームワークと言えるでしょう。</p>
<p>様々な機能を備えたJPAですが、本エントリでは、検索、中でもCriteria APIを使った型安全な検索を中心にご紹介します。コードをしっかり載せていきますので、Criteria APIのコンセプトを感じ取っていただけると思います。</p>
<p>なお、JPAを動作させる環境を構築する方法は「<a title="JavaEEだけでここまで出来る！GlassFish+Eclipseで高速Webアプリ開発【環境構築編】" href="https://cloudear.jp/blog/?p=1375">JavaEEだけでここまでできる！GlassFish+Eclipseで高速Webアプリ開発【環境構築編】</a>」をご覧下さい。</p>
<h2>準備１・メタモデルクラスを自動生成する設定</h2>
<p>メタモデルクラスとは、エンティティクラスのプロパティに関する情報を表すクラスであり、型安全にJPAを使うためには欠かせないクラスです。</p>
<p>例えば次のようなエンティティクラスがあったとしましょう。</p>
<pre class="lang:java decode:true" title="User.java">package sandbox.entity;

import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    Long      id;

    @Column(length = 150, unique = true, nullable = false)
    String    name;

    // getter/setterは省略
}
</pre>
<p>このエンティティクラスに対するメタモデルクラスは次のようになります。</p>
<pre class="lang:java decode:true " title="User_.java">package sandbox.entity;

import javax.annotation.Generated;
import javax.persistence.metamodel.SingularAttribute;
import javax.persistence.metamodel.StaticMetamodel;

@Generated(value="Dali", date="2016-02-12T22:59:19.623+0900")
@StaticMetamodel(User.class)
public class User_ {
	public static volatile SingularAttribute&lt;User, String&gt; name;
	public static volatile SingularAttribute&lt;User, Long&gt; id;
}
</pre>
<p>メタモデルクラスはeclipseのような開発環境に自動で作ってもらうことができますので、有効にしておきましょう。</p>
<p>ecliseの場合の手順を紹介しておきます。プロジェクトのプロパティを開き、「プロジェクト・ファセット」から「Convert to faceted form&#8230;」をクリックします。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/convert-to-faceted-form.png"><img class="alignnone size-full wp-image-2107" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/convert-to-faceted-form.png" alt="convert-to-faceted-form" width="833" height="348" /></a></p>
<p>&nbsp;</p>
<p>プロジェクト・ファセットが有効になったので、JPAサポートを有効にします。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/project-facets-jpa.png"><img class="alignnone size-full wp-image-2109" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/project-facets-jpa.png" alt="project-facets-jpa" width="806" height="408" /></a></p>
<p>ここで「 OK」を押していったんプロパティ画面を閉じます。</p>
<p>再びプロパティ画面を開くと「JPA」という設定項目が増えていますので、メタモデルクラスの自動生成を有効にします。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/eclipse-jpa-metamodel.png"><img class="alignnone size-full wp-image-2110" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/eclipse-jpa-metamodel.png" alt="eclipse-jpa-metamodel" width="834" height="713" /></a></p>
<p>これで、エンティティクラスに変更が入る度にメタモデルクラスが自動生成されます。メタモデルクラスの名前はエンティティクラスの名前の後ろに _ を付けたものになります。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/entity-metamodel.png"><img class="alignnone size-full wp-image-2113" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/entity-metamodel.png" alt="entity-metamodel" width="268" height="81" /></a></p>
<p>&nbsp;</p>
<h2>準備２・SQLをコンソールに出力する設定</h2>
<p>JPAを使いこなすコツはJavaコードを中心に考えることですが、さすがにSQLが見えないと辛すぎます。せめてコンソールにSQLを出力するようにしておきましょう。JPAの設定ファイルであるpersistence.xmlにプロパティを追記します。</p>
<h3>EclipseLinkの場合</h3>
<pre class="lang:xhtml decode:true">&lt;property name="eclipselink.logging.level.sql" value="FINE" /&gt;
&lt;property name="eclipselink.logging.parameters" value="true" /&gt;
&lt;property name="eclipselink.logging.logger" value="org.eclipse.persistence.logging.DefaultSessionLog"/&gt;</pre>
<h3>OpenJPAの場合</h3>
<pre class="lang:xhtml decode:true">&lt;property name="openjpa.Log" value="DefaultLevel=WARN, Runtime=INFO, Tool=INFO, SQL=TRACE"/&gt;
&lt;property name="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" /&gt;</pre>
<p>APサーバにGlassFishを使っているのであれば、EclipseLinkの方を設定してください。</p>
<h2>スキーマ定義をエンティティクラスで行う</h2>
<p>JPAの良さを引き出すコツは、Javaコードを中心に考えることです。まずはスキーマ定義をエンティティクラスで行うようにしてみましょう。</p>
<p>ただ、実はJPAの仕様にはエンティティクラスからDDLを作る機能は含まれていません。JPAの実装であるEclipseLinkやOpenJPAの機能を使います。通常、persistence.xmlにプロパティを追記します。</p>
<h3>EclipseLinkの場合</h3>
<pre class="lang:xhtml decode:true" title="persistence.xml">&lt;property name="eclipselink.ddl-generation" value="create-tables" /&gt;</pre>
<h3>OpenJPAの場合</h3>
<pre class="lang:default decode:true">&lt;property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema(ForeignKeys=true)" /&gt;</pre>
<p>APサーバにGlassFishを使っているのであれば、EclipseLinkの方を設定してください。</p>
<h2>Criteria APIによる検索</h2>
<p>JPAの検索には、JPQLとCriteria APIの２つのやり方があります。JPQLは文字列でクエリを記述するため、コンパイル時に型チェックが全く働きません。</p>
<p>例えば以下のコードは実行時にClassCastExceptionがスローされてしまいます。</p>
<pre class="lang:java decode:true">private static void selectByJPQL(final EntityManager em) {
    final String q = "select e from Tag e";
    for (final User user : em.createQuery(q, User.class).getResultList()) {
        System.out.println(user);
    }
}
</pre>
<p>よく見ると、クエリ文字列が<code>from Tag</code>となっています。結果のエンティティは<code>User</code>型で受けていますから、型が異なっていおり、<strong>実行時に</strong>ClassCastExceptionがスローされるのです。</p>
<p>しかしCriteria APIを使うと、このようなミスは<strong>コンパイル時に</strong>検出できるようになります。上のJPQLをCriteria APIで描き直してみましょう。</p>
<pre class="lang:java decode:true">private static void selectByCriteria(final EntityManager em) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();
    final CriteriaQuery&lt;Tag&gt; criteria = builder.createQuery(Tag.class);
    criteria.from(User.class);

    final TypedQuery&lt;User&gt; query = em.createQuery(criteria);
    for (final User user : query.getResultList()) {
        System.out.println(user);
    }
}</pre>
<p>eclipseでこのコードを書くと、以下のようにコンパイルエラーとしてミスを教えてくれます。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2016/02/jpa-criteria-error.png"><img class="alignnone size-full wp-image-2116" src="https://cloudear.jp/blog/wp-content/uploads/2016/02/jpa-criteria-error.png" alt="jpa-criteria-error" width="708" height="104" /></a></p>
<p>&nbsp;</p>
<p>このように、Criteria APIを使うと<span style="font-size: 12pt;"><strong>クエリのミスをコンパイル時にチェックできる</strong></span>ようになります。これがCriteria APIの最大の利点です。</p>
<p>また、副次的な効果ですが<strong>変なクエリが書かれない</strong>ようになります。実際の開発現場では、変態的なSQLが横行してチューンングの足枷になったり、特定のDB製品でしか実行できない書き方がされていたりと、SQL周りの問題が起きやすいです。しかしCriteria APIを使えばクエリの記述方法がある程度統一されるため、問題が起きにくく、またレビューしやすくなります。</p>
<h2>Criteria APIによるクエリの基本形</h2>
<p>Criteria APIはJPQLの構造をJavaクラスで表現したものと考えることができます。JPQLの構成要素の基本は次の３つです。</p>
<ol>
<li>from句：どのエンティティ（≒テーブル）からデータを取得するか</li>
<li>where句：抽出条件</li>
<li>select句：どのエンティティ、あるいはプロパティなどを取得するか</li>
</ol>
<p>この３つを踏まえると、Criteria APIを使ったプログラムの基本形は次のようになります。</p>
<pre class="lang:java decode:true">private static void selectUsersByName(final EntityManager em, final String pUserName) {
    // クエリを組み立てるためのオブジェクトを得る
    final CriteriaBuilder builder = em.getCriteriaBuilder();

    // クエリ全体を表現するオブジェクトを作成.
    // 引数として、クエリ結果の型を指定する.
    final CriteriaQuery&lt;User&gt; query = builder.createQuery(User.class);

    // from句指定
    final Root&lt;User&gt; root = query.from(User.class);

    // where句指定
    query.where( //
            builder.equal(root.get(User_.name), pUserName) //
            , builder.isNotNull(root.get(User_.name)) //
    );

    // select句指定.
    // ここではプロパティではなくエンティティそのものを指定.
    // ただしfromと同じエンティティを指定する場合はこの行は省略可能.
    query.select(root);

    // クエリ実行
    final List&lt;User&gt; result = em.createQuery(query).getResultList();
    for (final User user : result) {
        System.out.println(user);
    }
}
</pre>
<p>結果の型を指定できるのがとても強力です。例えば全件数を得るクエリは次のように書けます。</p>
<pre class="lang:java decode:true ">private static void countAllUsers(final EntityManager em) {
    final CriteriaBuilder builder = em.getCriteriaBuilder();

    // 件数なので結果は数値で得るようにする
    final CriteriaQuery&lt;Long&gt; query = builder.createQuery(Long.class);
    final Root&lt;User&gt; root = query.from(User.class);

    // count関数を使う
    query.select(builder.count(root));

    final long count = em.createQuery(query).getSingleResult().longValue();
    System.out.println(count);
}</pre>
<hr />
<p>基本編はここまでです。次回の応用編では、Criteria APIの実戦的な機能をご紹介します。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=2101</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyBatis から MySQL を操作する</title>
		<link>https://cloudear.jp/blog/?p=712</link>
		<comments>https://cloudear.jp/blog/?p=712#comments</comments>
		<pubDate>Sun, 01 Mar 2015 08:23:04 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[O/Rマッパー]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=712</guid>
		<description><![CDATA[みなさんこんにちは masa です。前回は MyBatis Generator により、初期ファイルを自動生成しました。今回はそれらを使い、実際に MySQL を操作する方法とカスタマイズ方法をご紹介します。 さて、前回 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは masa です。前回は MyBatis Generator により、初期ファイルを自動生成しました。今回はそれらを使い、実際に MySQL を操作する方法とカスタマイズ方法をご紹介します。<br />
<span id="more-712"></span></p>
<p>さて、前回　<a title="MyBatis Generator の使い方" href="https://cloudear.jp/blog/?p=708" target="_blank">MyBatis Generator の使い方</a> で以下の4つのファイルが自動生成されました。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/02/tcar.png"><img class="alignnone size-full wp-image-786" src="https://cloudear.jp/blog/wp-content/uploads/2015/02/tcar.png" alt="tcar" width="193" height="76" /></a></p>
<p><span style="font-size: 8pt;"><span style="font-size: 10pt;"><strong>・データを格納するエンティティクラス</strong></span><br />
<span style="font-size: 10pt;"> <strong> ・抽出条件を設定するサンプルクラス</strong></span><br />
<span style="font-size: 10pt;"> <strong> ・データ操作のメインとなるマッパークラス</strong></span><br />
<span style="font-size: 10pt;"> <strong>・上のマッパークラスに紐づいた実際の SQL を書く XML ファイル</strong></span></span></p>
<p><span style="font-size: 8pt;">※ファイル名は DB のテーブル名が頭につきますので、みなさんは違うファイル名でも気にしないでOKです。</span></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 18pt;"><strong>　1. ライブラリとデータソースの設定をする</strong></span></p>
<p>1.  Maven もしくは Gradle から以下のライブラリを入れてください。</p>
<p><strong>・mybatis</strong><br />
<strong>・mysql-connector-java</strong><br />
<strong>・commons-dbcp2</strong></p>
<pre class="lang:default decode:true ">        &lt;dependency&gt;
            &lt;groupId&gt;org.mybatis&lt;/groupId&gt;
            &lt;artifactId&gt;mybatis&lt;/artifactId&gt;
            &lt;version&gt;3.2.8&lt;/version&gt;
            &lt;type&gt;jar&lt;/type&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;mysql&lt;/groupId&gt;
            &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
            &lt;artifactId&gt;commons-dbcp2&lt;/artifactId&gt;
        &lt;/dependency&gt;</pre>
<p>&nbsp;</p>
<p>2. applicationContext.xml を以下の情報で src/main/resources/ に作成</p>
<pre class="lang:default decode:true">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
  xsi:schemaLocation="

http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans-4.0.xsd


http://www.springframework.org/schema/context


http://www.springframework.org/schema/context/spring-context-4.0.xsd


http://mybatis.org/schema/mybatis-spring

    http://mybatis.org/schema/mybatis-spring.xsd"&gt;

&lt;!-- DataSource --&gt;
&lt;bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"&gt;
  &lt;property name="driverClassName" value="com.mysql.jdbc.Driver" /&gt;
  &lt;property name="url" value="jdbc:mysql://localhost/car" /&gt;   //接続サーバーとMySQLスキーマ名
  &lt;property name="username" value="root" /&gt;   //データベースのユーザー名
  &lt;property name="password" value="" /&gt;   //接続パスワード
&lt;/bean&gt;

&lt;!-- SqlSessionFactory --&gt;
&lt;bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" &gt;
  &lt;property name="dataSource" ref="dataSource" /&gt;
&lt;/bean&gt;

&lt;!-- Mapper --&gt;
//↓id名は呼び出すために使う名前なので任意でOKです
&lt;bean id="mp" class="org.mybatis.spring.mapper.MapperFactoryBean"&gt;
//↓valueには自動生成された *Mapper.java クラスをパッケージ名込みで指定してください
  &lt;property name="mapperInterface" value="jp.gmo.myfirstspringboot.mybatis.TCarMapper" /&gt;
  &lt;property name="sqlSessionFactory" ref="sqlSessionFactory" /&gt;
&lt;/bean&gt;

&lt;/beans&gt;</pre>
<p><span style="font-size: 8pt;"> ※applicationContext.xml は、データベースの接続情報とマッパークラスにID名をつけて登録する設定ファイルです。</span></p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 18pt;"><strong>　2. データにアクセスするメインクラスを作成</strong></span></p>
<p>今回準備したテーブルはこんな感じです。<br />
(データベース名 car  テーブル名 t_car)</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/tcar_table.png"><img class="alignnone size-full wp-image-814" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/tcar_table.png" alt="tcar_table" width="571" height="154" /></a></p>
<p>&nbsp;</p>
<p>src/main/resources 配下に同パッケージ名でマッパー *.xml ファイルを配置します。<br />
これにより、ビルド後に classファイルと同じディレクトリに入ります。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/target_maven.png"><img class="alignnone size-full wp-image-838" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/target_maven.png" alt="target_maven" width="373" height="346" /></a></p>
<p>&nbsp;</p>
<p>早速以下のメインクラスを作って  id, name, brand のデータを取り出してみましょう。</p>
<div>
<div>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/datacaller.png"><img class="alignnone size-full wp-image-828" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/datacaller.png" alt="datacaller" width="195" height="94" /></a></p>
</div>
<pre class="lang:default decode:true">public class DataCaller {

    public static void main(String[] args) throws IOException {

        String resource = "src/main/resources/applicationContext.xml";
        ApplicationContext ac = new FileSystemXmlApplicationContext(resource);
        TCarMapper tcarmapper = (TCarMapper) ac.getBean("mp");

        TCar record = new TCar();
        TCarExample example = new TCarExample();
        example.setDistinct(true);
              
        ArrayList&lt;TCar&gt; result = (ArrayList&lt;TCar&gt;)tcarmapper.selectByExample(example);
        for (TCar r : result) {
            System.out.println(r.getId() + " " +r.getName() + " " + r.getBrand());
        }
    }
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 18pt;"><strong>　3. MySQL テーブルからデータを取り出す</strong></span></p>
<div></div>
<div></div>
<div>DataCaller.java メインクラスを実行します。</div>
<div></div>
<div><a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/result_tcar.png"><img class="alignnone size-full wp-image-839" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/result_tcar.png" alt="result_tcar" width="521" height="199" /></a></div>
<div>ちゃんとデータが取れました。</div>
<div></div>
<p>&nbsp;</p>
<div><strong>insert する場合はこんな感じで出来ます↓</strong></div>
<pre class="lang:default decode:true">		TCar record = new TCar();
		record.setId(6);
		record.setName("JULIETA");
		record.setBrand("ALPHA_ROMEO");
		tcarmapper.insert(record);</pre>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/alpa_romeo.png"><img class="alignnone size-full wp-image-868" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/alpa_romeo.png" alt="alpa_romeo" width="491" height="211" /></a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span class="hcss1" style="font-size: 18pt;"><strong>　おまけ： カスタマイズして SQL を作ってみる</strong></span></p>
<div>TCarExample.java, TCarmapper.xml をカスタマイズすることでオリジナルの SQL を組み立てることができます。ここでは カラムを指定する SQL を足してみましょう。</div>
<div></div>
<div>
<p><strong> (TCarExample.java)</strong></p>
<pre class="lang:default decode:true">     /**
     * original
     */
    public void setColumn(String column) {
        this.column = column;
    }</pre>
<p><strong> </strong></p>
<p><strong>(TCarmapper.xml )</strong></p>
<pre class="lang:default decode:true ">    &lt;!-- 
    &lt;include refid="Base_Column_List" /&gt;
    --&gt;
    
    &lt;!-- original --&gt;
    &lt;if test="column == 'id'"&gt;
      id
    &lt;/if&gt;
    &lt;if test="column == 'name'"&gt;
      name
    &lt;/if&gt;
    &lt;if test="column == 'brand'"&gt;
      brand
    &lt;/if&gt;
    &lt;if test="column == null"&gt;
        &lt;include refid="Base_Column_List" /&gt;
    &lt;/if&gt;
    &lt;!-- original --&gt;</pre>
<p>&nbsp;</p>
<p><strong> (DataCaller )</strong></p>
<pre class="lang:default decode:true">public class DataCaller {

    public static void main(String[] args) throws IOException {

        String resource = "src/main/resources/applicationContext.xml";
        ApplicationContext ac = new FileSystemXmlApplicationContext(resource);
        TCarMapper tcarmapper = (TCarMapper) ac.getBean("mp");
 
        TCarExample example = new TCarExample();
        example.setColumn("name");  //originalメソッドの呼び出し
                
        ArrayList&lt;TCar&gt; result = (ArrayList&lt;TCar&gt;)tcarmapper.selectByExample(example);
        for (TCar r : result) {
            System.out.println(r.getId() + " " +r.getName() + " " + r.getBrand());
        }
    }
}</pre>
<p>&nbsp;</p>
<p>実行します。<br />
<a href="https://cloudear.jp/blog/wp-content/uploads/2015/03/original_example.png"><img class="alignnone size-full wp-image-877" src="https://cloudear.jp/blog/wp-content/uploads/2015/03/original_example.png" alt="original_example" width="486" height="205" /></a><br />
name カラムだけデータが取れましたね。</p>
<p>いかがでしたか？今回は MyBatis の使い方をサンプルファイルを交えて解説しました。旧 iBatis として知られる MyBatis は昔からの実績や、現在でも大規模な案件で使われる安定性をもっています。個人的には Java のデファクトスタンダード O/Rマッパーとして認知されたら嬉しいなと思っています。</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=712</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MyBatis Generator の使い方</title>
		<link>https://cloudear.jp/blog/?p=708</link>
		<comments>https://cloudear.jp/blog/?p=708#comments</comments>
		<pubDate>Sun, 22 Feb 2015 13:41:03 +0000</pubDate>
		<dc:creator><![CDATA[masa]]></dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[O/Rマッパー]]></category>
		<category><![CDATA[プログラム]]></category>

		<guid isPermaLink="false">https://cloudear.jp/blog/?p=708</guid>
		<description><![CDATA[みなさんこんにちは、masa です。今日は、前々から書きたいと思っていた Java の O/Rマッパーネタの中で、MyBatis Generator の使い方をご紹介します。 最近は『Spring MVC + MyBat [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>みなさんこんにちは、masa です。今日は、前々から書きたいと思っていた Java の O/Rマッパーネタの中で、<strong>MyBatis Generator</strong> の使い方をご紹介します。<br />
<span id="more-708"></span><br />
最近は『Spring MVC + MyBatis』という IT研修をやっている会社もあるみたいですね。MyBatis は他の O/Rマッパーと違い、オブジェクトと SQL をマッピングしますので、DB の環境に依存することなく SQL の実行を完全に制御したいときにオススメです。</p>
<p>しかし、最初にマッパーやエンティティクラスなどを自分で書くのは非常にしんどいです。そんなとき、手っ取り早く使えるようにファイルを自動生成してくれるのが <strong>MyBatis Genarator</strong> です。とりあえずこれを使って、あとからファイルをカスタマイズして覚えていくのが良いと思います。</p>
<p><span style="color: #0c6fa8; font-size: 12pt;"><strong>今回は Maven 経由で MyBatis を入れます。</strong></span></p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　MyBatis Generator を手っ取り早くインストール</span></strong></p>
<p>最近の Eclipse, NetBeans, IntelliJ ならどれでも Maven はすぐ使えるはずですので、pom.xml に以下を追記しましょう。</p>
<pre class="lang:default decode:true">&lt;project ...&gt;
     ...
     &lt;build&gt;
       ...
       &lt;plugins&gt;
        ...
        &lt;plugin&gt;          //ここから
      	  &lt;groupId&gt;org.mybatis.generator&lt;/groupId&gt;
      	  &lt;artifactId&gt;mybatis-generator-maven-plugin&lt;/artifactId&gt;
          &lt;version&gt;1.3.0&lt;/version&gt;
        &lt;/plugin&gt;         //ここまで　※入れるカテゴリはpluginsの中です
        ...
      &lt;/plugins&gt;
      ...
    &lt;/build&gt;
    ...
  &lt;/project&gt;</pre>
<p>これでプラグインとしてインストールされます。</p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　generatorConfig.xml を配置する<br />
</span></strong></p>
<p>この xml ファイルを元にして各ファイルが自動生成されますのでサンプルをもとに作りましょう。<br />
作る場所はプロジェクトの resources 直下です。</p>
<p><strong>プロジェクト名 &gt; src &gt; main &gt; resources &gt; generatorConfig.xml</strong></p>
<pre class="toolbar:1 lang:default decode:true">&lt;?xml version="1.0" encoding="UTF-8" ?&gt;
&lt;!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" &gt;
&lt;generatorConfiguration &gt;
  &lt;classPathEntry location="C:\Program Files\MySQL\Connector.J 5.1\mysql-connector-java-5.1.33-bin.jar"/&gt;
  // ↑ MySQLに接続するConnectorJのjarファイルを指定します
  &lt;context id="context1" &gt;
    &lt;jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/car" userId="root" password="password" /&gt;
    // ↑　ローカルのMySQLに接続するパスとDB名、それからMySQLのユーザーIDとパスを指定します
    &lt;javaModelGenerator targetPackage="jp.cloudear.test.db" targetProject="C:\Users\masa\Documents\NetBeansProjects\project\src\main\java\" /&gt;
    &lt;sqlMapGenerator targetPackage="jp.cloudear.test.db" targetProject="C:\Users\masa\Documents\NetBeansProjects\project\src\main\java\" /&gt;
    &lt;javaClientGenerator targetPackage="jp.cloudear.test.db" targetProject="C:\Users\masa\Documents\NetBeansProjects\project\src\main\java\" type="XMLMAPPER" /&gt;
    // ↑  3行すべてに、MyBatisのクラスを入れたいパッケージ名と、プロジェクトのファイルパスを入れてください
    &lt;table schema="student" tableName="classA" &gt;
    // ↑　DB名とテーブル名を入れてください
    &lt;/table&gt;
  &lt;/context&gt;
&lt;/generatorConfiguration&gt;</pre>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　いよいよファイルを自動生成する<br />
</span></strong></p>
<p>上で作った xml ファイルを Maven から実行します。</p>
<p>※NetBeans の場合</p>
<p><strong>pom.xml を右クリック &gt; Mavenの実行 &gt; ゴール &gt; ゴール欄に<br />
「mybatis-generator:generate」を入力してOK</strong></p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/02/maven_run.png"><img class="alignnone size-full wp-image-741" src="https://cloudear.jp/blog/wp-content/uploads/2015/02/maven_run.png" alt="maven_run" width="499" height="376" /></a></p>
<p>生成に失敗した場合 MySQL への接続失敗の可能性が高いです。以下の点を確認してみてください。</p>
<ul>
<li>ローカルの MySQL に指定の ID と PW でちゃんと接続できるか</li>
<li>generatorConfig.xml の Connector/Jのパス指定を間違えていないか</li>
<li>generatorConfig.xml の DB名、テーブル名の指定を間違えていないか</li>
</ul>
<p>他の IDE をご使用の方は IDE から Maven ゴールを実行する方法を調べてみてください。</p>
<p>&nbsp;</p>
<p><strong><span class="hcss1" style="font-size: 14pt;">　Generator によって生成されたファイルを見てみる</span></strong></p>
<p>生成に成功するとテーブル名が先頭についた以下のような4ファイルが出来ているはずです。</p>
<p><a href="https://cloudear.jp/blog/wp-content/uploads/2015/02/tcar.png"><img class="alignnone size-full wp-image-786" src="https://cloudear.jp/blog/wp-content/uploads/2015/02/tcar.png" alt="tcar" width="193" height="76" /></a></p>
<ol>
<li><strong>エンティティクラス</strong></li>
<li><strong>クエリ条件サンプルクラス</strong></li>
<li><strong>マッパークラス</strong></li>
<li><strong>マッパー設定XMLファイル</strong></li>
</ol>
<p>これらを使えば簡単に DBアクセスのプログラムが作れます。generatorConfig.xml を作るのがちょっとめんどくさいかもしれませんが、仮に手動で4つのファイルを作ろうとすると10倍時間がかかりますｗ　それに比べたらだいぶ楽だと思います。</p>
<p>いかがでしたか？今回は MyBatis を簡単に使い始めるためのファイルを Generator を使って生成してみました。これらのファイルを使って DB操作してみると、カスタマイズして使いこなす一助になると思います。</p>
]]></content:encoded>
			<wfw:commentRss>https://cloudear.jp/blog/?feed=rss2&#038;p=708</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
