いやーそうかぁ。
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サーバのアドレス類の設定
MySQL は http://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 ができる。
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 の設定を行う
(※ Eclipse で実行する場合、tomcat のインストールディレクトリではなく、Project Explorer の Servers/Tomcat v8.0 Server at localhost-config 等の下にあるものが使われるので注意。
<!-- 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.xml に tomcat の DataSource への接続を設定する。
http://d.hatena.ne.jp/ashura156/20170203/1486094264 の設定とは異なり、
<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>
Amazon Linux に deploy する。
- sudo service tomcat8 stop
- Amazon Linux の tomcat の 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 から接続して確認する。