ASi

Eclipse で MySQL & JPA servlet を作成

http://d.hatena.ne.jp/ashura156/20170202/1486020592 の続き


JPA とは Java Persistence API のことで、JSR で標準化された OR mapper。

Dynamic Web Project に JPA Project 機能を付加する。

  • Project Explorer の Dynamic Web Project を選択して右クリック。
  • Configure - Convert to JPA Project...
  • Configuration のドロップダウンは 、下の Facet は Dynamic Web Module, Java, JavaScript, JPA が選択されている。Next >
  • Platform に EclipseLink 2.5.x を選択


JPA implementation を設定する。

  • Type: User Library となっているはず
  • フロッピーディスクに↓矢印のアイコンを押し、EclipseLink2.5.2 を選ぶ (Eclipse Public License)。ダウンロードを待つ。
  • Finish
  • Include libraries with this application にチェックがついているのを確認する。無ければ付ける。


Connector の設定。

  • Connection の Add connection... をクリックし、MySQL を選択、Name: に EC2_MySQL などと設定。Next>
  • Drivers: のドラップダウンの右の○の中に※のアイコンをクリック
  • My SQL JDBC Driver を選ぶ。System Version 5.1 を選択。
  • https://dev.mysql.com/downloads/connector/j/ から mysql-connector-java-5.1.40.zip をダウンロード。適当に解凍。
  • JAR List のタブに移り Add JAR/Zip... ボタンを押し mysql-connector-java-5.1.40/mysql-connector-java-5.1.40-bin.jar を設定する。
  • Add driver library to build path のチェックをつける。
  • Finish


MySQLサーバのアドレス類の設定
MySQLhttp://d.hatena.ne.jp/ashura156/20170201/1485938855 で作ったものに、ssh トンネルを繋いである前提。まずは local PC で動かす設定。

  • Database: DB1
  • URL: jdbc:mysql://localhost:6501/DB1
  • User name: root
  • Password: (blank)
  • Test connection ボタンを押し、Ping succeeded!
  • Finish


persistence.xml

  • 開き、Connection タブを開く。
  • Transaction type: Resource Local にする。まずは local PC で動かす設定。
  • Native SQL をクリックしチェックをつける。"(False)" が付いている場合もう一度クリックして消す。
  • 下の EclipseLink connection pool にあるリンク Populate from connection... をクリックすると、先に Connector の設定をした内容が反映される。

下記の内容になっている。

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
	<persistence-unit name="dynamic_web" transaction-type="RESOURCE_LOCAL">
		<class>model.Tb1</class>
		<properties>
			<property name="eclipselink.jdbc.native-sql" value="true"/>
			<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
			<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:6501/DB1"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
		</properties>
	</persistence-unit>
</persistence>


Entity class を作る

  • New - Other - JPA - JPA Entities from Tables
  • Tables: 内の table名 にチェックをつけて、finish
  • Java Resources に model/table名.java ができる。
  • mysql-connector-java-5.1.40-bin.jar を local PC の /lib 下に コピーする。


Servlet から DB に JPA を使用してアクセスする。
servlet のクラスを下記のように編集。

	private static final EntityManagerFactory factory_ = Persistence.createEntityManagerFactory("dynamic_web");
	private static final EntityManager manager_ = factory_.createEntityManager();

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		PrintWriter rWriter = response.getWriter();
		
		Query query = manager_.createNativeQuery("select * from DB1.TB1;", Tb1.class);
		
		@SuppressWarnings("unchecked")
		List<Tb1> entities = query.getResultList();
		for(Tb1 e : entities){
			rWriter.print("" + e.getField1() + ",");
			rWriter.print(e.getField2() + ",");
			rWriter.println(e.getField3());
		}

		manager_.clear();
	}

Eclipseで実行すると、DBの内容がブラウザ上に表示される。


Metamodel
JPA の Canonical Metamodel を生成するには、project設定の "Canonical metamodel (JPA 2.0)" にソースディレクトリを設定する。

Amazon Linux / MySQL JPA servlet を tomcat に deploy

http://d.hatena.ne.jp/ashura156/20170203/1486094264 の続き


下記を参考
http://www.javaroad.jp/opensource/js_tomcat8.htm
http://edgegram.hatenablog.jp/entry/2015/11/17/171300

tomcat の DataSource の設定を行う


/conf/server.html
(※ Eclipse で実行する場合、tomcat のインストールディレクトリではなく、Project Explorer の Servers/Tomcat v8.0 Server at localhost-config 等の下にあるものが使われるので注意。


の子として下記を追加。 EclipseAmazon Linux で url が異なる。この例の Amazon Linux では自身の中で MySQL が走っているので、MySQL の listeningポートを指定している。Eclipse では sshトンネルの入り口を指定。 Context タグの source も Amazon Linux では不要。

<!-- Eclipse -->
<Context docBase="dynamic_web" path="/dynamic_web" reloadable="true" 
  source="org.eclipse.jst.jee.server:dynamic_web">
    <Resource
      name="jdbc/MySQL"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      maxActive="20"
      maxIdle="10"
      maxWait="-1"
      username="root"
      password=""
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:6501/DB1"/>

<!-- Amazon Linux -->
<Context docBase="dynamic_web" path="/dynamic_web" reloadable="true">
    <Resource
      name="jdbc/MySQL"
      auth="Container"
      type="javax.sql.DataSource"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
      maxActive="20"
      maxIdle="10"
      maxWait="-1"
      username="root"
      password=""
      driverClassName="com.mysql.jdbc.Driver"
      url="jdbc:mysql://localhost:3306/DB1"/>

Servlet プロジェクトの persistence.xmltomcat の DataSource への接続を設定する。


http://d.hatena.ne.jp/ashura156/20170203/1486094264 の設定とは異なり、下に MySQL の接続情報は書かない。これは tomcat の DataSource を使用するから。

<persistence-unit name="dynamic_web" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
	<non-jta-data-source>java:comp/env/jdbc/MySQL</non-jta-data-source>
	<class>model.Tb1</class>
	<properties>
		<property name="eclipselink.jdbc.native-sql" value="true"/>
	</properties>
</persistence-unit>

data-source名が java:comp/env/ から始まるのはtomcatの仕様

Amazon Linux に deploy する。

  • sudo service tomcat8 stop
  • Amazon Linuxtomcat の server.xml を更新する。場所は /usr/share/tomcat8/conf/server.xml
  • Amazon Linux の /usr/share/tomcat8/lib/ に mysql-connector-java-5.1.40-bin.jar をコピー
  • Amazon Linux の /usr/share/tomcat8/webapps/dynamic_web ディレクトりを削除
  • Amazon Linux の /usr/share/tomcat8/webapps/ に dynamic_web.war を copy
  • sudo service tomcat8 start


ブラウザで remote PC から接続して確認する。