Tips

【第八回】Spring Frameworkを使ってみる ~データベースにアクセスする②~

前回の第七回ではデータソースの作成を行いました。
今回は、JPAを使用し、Entity作成してデータベースに接続していきます。

Spring Framework連載記事 目次

【第一回】Spring Frameworkを使ってみる ~Spring Framework概要と準備~
【第二回】Spring Frameworkを使ってみる ~プロジェクト作成からビルドまで~
【第三回】Spring Frameworkを使ってみる ~サーバで実行~
【第四回】Spring Frameworkを使ってみる ~画面遷移~
【第五回】Spring Frameworkを使ってみる ~データ受け渡し~
【第六回】Spring Frameworkを使ってみる ~入力値チェック~
【第七回】Spring Frameworkを使ってみる ~データベースにアクセスする①~
【第八回】Spring Frameworkを使ってみる ~データベースにアクセスする②~
【第九回】Spring Frameworkを使ってみる ~データベースにアクセスする③~
【第十回】Spring Frameworkを使ってみる ~データベースにアクセスする④~

準備

データベースとテーブルを作成

MySQLを開いて「sample」データベースを作成します。

CREATE DATABASE sample DEFAULT CHARACTER SET utf8

次に「user」テーブルを作成します。

CREATE TABLE user (id INTEGER,name VARCHAR(40));

テスト用のデータを挿入します。

INSERT INTO user (id,name) VALUES (1,'hoge');

実装

JPAプロジェクトに変更

プロジェクトをJPAプロジェクトに変更します。

プロジェクトを右クリック⇒「Configure」⇒「Convert to JPA Project…」
JPAプロジェクト-変更

開いたポップアップでとくに変更はせずに「Finish」をクリックします。
JPAプロジェクト-変更2

JPAを使用したEntityの作成

JPAを使用してテーブルからEntityを作成していきます。

プロジェクトを右クリック⇒「New」⇒「other…」を選択します
JPA-Entity作成

開いたポップアップで「JPA」⇒「JPA Entities from Tables」を選択して「Next >」を押します。
JPA-Entity作成2

開いたポップアップで前回作成したConnectionを選択。
「Schema」が選択されるので、つなぎたいテーブルを「Tables」でチェックしていきます。
チェック後、「Next >」を押します。
JPA-Entity作成3

「Next >」を押します。
JPA-Entity作成4

「Package」に「パッケージ.model」を指定します。指定後、「Finish」を押します。
JPA-Entity作成5

modelパッケージの中にuser.javaが生成されました。
JPA-Entity作成6

エラーが出ているので修正していきます。
エラーの原因は、「@Id」アノテーションがないからなのでIdに「@Id」アノテーションを付与します。
JPA-Entity作成7

これでEntityの作成は完了です。

Repositoryの作成

まずはおき場所がないので、「repository」パッケージを作成していきます。
「src/main/java」で右クリック⇒「New」⇒「Package」を選択します。
JPA-Repository作成

Nameに「repository」と入力して「Finish」を押します。
JPA-Repository作成2

作成した「repository」パッケージで右クリック⇒「New」⇒「Interface」を選択します。
JPA-Repository作成3

userテーブルのリポジトリなので今回は「UserRepository」という名前でインターフェースを作成します。
JPA-Repository作成4

「UserRepository」が作成されました。
JPA-Repository作成5

このままでは使えないので編集していきます。
「@Repository」を付与することと「JpaRepository<クラス名,String>」を継承します。
JPA-Repository作成6

データベース接続プロパティの作成

「src/main/resources」で右クリック⇒「New」⇒「File」を選択します。
データベース接続プロパティ作成

FileNameに「jdbc.properties」と入力し、「Finish」を入力します。
データベース接続プロパティ作成2

「jdbc.properties」に下記のコードを記述していきます。

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/sample
jdbc.username=root
jdbc.password=mysql

application-config.xmlの編集

「src/main/resources/spring/application-config.xml」を編集します。
下記のように書き換えます。


<?xml version="1.0" encoding="UTF-8"?>

<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:jpa="http://www.springframework.org/schema/data/jpa"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- Uncomment and add your base-package here:
<context:component-scan
base-package="org.springframework.samples.service"> -->

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" >
<property name="packagesToScan" value="jp.ssie.helloworld.model" >
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">none</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
</prop>
</props>
</property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" >
<property name="url" value="${jdbc.url}" >
<property name="username" value="${jdbc.username}" >
<property name="password" value="${jdbc.password}" >
<property name="removeAbandoned" value="true" >
<property name="initialSize" value="3" >
<property name="maxActive" value="30" >
<property name="validationQuery" value="select now()" >
</bean>

<context:property-placeholder location="classpath:jdbc.properties" >

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource" >
</bean>
<bean id="namedParameterJdbcTemplate"
class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource" >
</bean>

<jpa:repositories base-package="jp.ssie.helloworld.repository">

<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" >
</bean>

<tx:annotation-driven >
</beans>

ログイン確認処理の実装

ログイン処理の実装として、全件取得してから入力された値と同じユーザIDが存在するか確認します。
/loginにPOSTでリクエストされたときの処理を変更します。
入力されたユーザIDを受け取って、その値が存在した場合は「top.jsp」へ、存在しない場合は「index.jsp」に遷移するようにします。
具体的な実装は、下記に「LoginController.java」の処理の抜粋を示します。


@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(Model model, @Validated(GroupOrder.class) @ModelAttribute("loginForm") LoginForm loginForm, BindingResult result) {
if(result.hasErrors()) {
return "index";
}

List&amp;lt;User&amp;gt; userList = userRep.findAll();
for(User user : userList) {
if(user.getName().equals(loginForm.getLoginName())) {
model.addAttribute("loginName", loginForm.getLoginName());
return "top";
}
}

return "index";

}

実行

実行結果

ユーザ名にaaaaと入力した場合
実行結果

index.jspに戻りました。
実行結果2

ユーザ名にhogeと入力した場合
実行結果3

top.jspに進みました。
実行結果4

次回について

今回はいったん全件取得でログイン処理を実装しました。
次回はWHERE文を使用しログイン処理を実装していきます。

新連載はじまりました!新Java基礎 連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search