【第八回】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…」
開いたポップアップでとくに変更はせずに「Finish」をクリックします。
JPAを使用したEntityの作成
JPAを使用してテーブルからEntityを作成していきます。
プロジェクトを右クリック⇒「New」⇒「other…」を選択します
開いたポップアップで「JPA」⇒「JPA Entities from Tables」を選択して「Next >」を押します。
開いたポップアップで前回作成したConnectionを選択。
「Schema」が選択されるので、つなぎたいテーブルを「Tables」でチェックしていきます。
チェック後、「Next >」を押します。
「Package」に「パッケージ.model」を指定します。指定後、「Finish」を押します。
modelパッケージの中にuser.javaが生成されました。
エラーが出ているので修正していきます。
エラーの原因は、「@Id」アノテーションがないからなのでIdに「@Id」アノテーションを付与します。
これでEntityの作成は完了です。
Repositoryの作成
まずはおき場所がないので、「repository」パッケージを作成していきます。
「src/main/java」で右クリック⇒「New」⇒「Package」を選択します。
Nameに「repository」と入力して「Finish」を押します。
作成した「repository」パッケージで右クリック⇒「New」⇒「Interface」を選択します。
userテーブルのリポジトリなので今回は「UserRepository」という名前でインターフェースを作成します。
このままでは使えないので編集していきます。
「@Repository」を付与することと「JpaRepository<クラス名,String>」を継承します。
データベース接続プロパティの作成
「src/main/resources」で右クリック⇒「New」⇒「File」を選択します。
FileNameに「jdbc.properties」と入力し、「Finish」を入力します。
「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&lt;User&gt; userList = userRep.findAll(); for(User user : userList) { if(user.getName().equals(loginForm.getLoginName())) { model.addAttribute("loginName", loginForm.getLoginName()); return "top"; } } return "index"; }
実行
実行結果
次回について
今回はいったん全件取得でログイン処理を実装しました。
次回はWHERE文を使用しログイン処理を実装していきます。