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


前回の第八回ではデータベースに接続し全件データを取得しました。
今回は、全件ではなくwhere文を使用してユーザIDからユーザ名を取り出していきます。

Spring Framework連載記事 目次

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

準備

ユーザ名からユーザIDに変更

Spring Frameworkとはあまり関係ないのですが、この連載まで「ユーザ名」を入力するように作成していたので「ユーザID」を入力するように変更します。

index.jsp

<!DOCTYPE html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="f" uri="http://www.springframework.org/tags/form"%>

<html>
 <head>
 <meta charset="utf-8">
 <title>ログイン</title>
 </head>
 <body>
 <f:form modelAttribute="loginForm" action="login" method="post">

<div>
 ユーザID:<input type="text" id="userId" name="userId">
 <f:errors path="userId" element="div" cssStyle="color:red" />
 </div>

<div>
 パスワード:<input type="text" id="loginPassword" name="loginPassword">
 <f:errors path="loginPassword" element="div" cssStyle="color:red" />
 </div>

<div>
 <input type="submit" value="ログイン">
 </div>

 </f:form>

 </body>
</html>

LoginForm.java

package jp.ssie.helloworld.form;

import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

import org.hibernate.validator.constraints.NotEmpty;

import jp.ssie.helloworld.validation.GroupOrder1;
import jp.ssie.helloworld.validation.GroupOrder2;

public class LoginForm {
 @NotEmpty(groups={GroupOrder1.class},message="ユーザIDを入力してください。")
 private int userId;

 @NotEmpty(groups={GroupOrder1.class},message="パスワードを入力してください。")
 @Size(min=8,max=16,groups={GroupOrder2.class},message="パスワードは{min}文字以上{max}文字以下です。")
 @Pattern(regexp="[a-zA-Z0-9]*",groups={GroupOrder2.class},message="パスワードは英数である必要があります。")
 private String loginPassword;

 public int getUserId() {
 return userId;
 }

 public void setUserId(int userId) {
 this.userId = userId;
 }

 public String getLoginPassword() {
 return loginPassword;
 }

 public void setLoginPassword(String loginPassword) {
 this.loginPassword = loginPassword;
 }
}

データ取得の実装

UserRepository.javaの編集

Springでは様々な書き方でクエリーを実装することができますが、今回は「Spring Data JPA」を使用していきます。
Repositoryを編集してデータを絞込みして取得するメソッドを実装します。
「UserRepository.java」を下記のように書き換えしましょう。

UserRepository.java

package jp.ssie.helloworld.repository;

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import jp.ssie.helloworld.model.User;

@Repository
public interface UserRepository extends JpaRepository<User, String>{
 public List<User> findById(int id);
}

追加されているのは12行目の「public List<User> findById(int id);」です。
「Spring Data JPA」では、メソッド名を命名規則に従って実装することでSQL文が自動で作成されます。
今回実装した例では、「findBy”カラム名”」で「SELECT u FROM User u WHERE id = ?」になり、メソッドの引数が「?」に代入されることになります。
「Spring Data JPA」の命名規則に関しては下記URLの「Table 2.3. Supported keywords inside method names」を確認してください。

URL:http://docs.spring.io/spring-data/data-jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html#jpa.query-methods

ログイン処理の変更

LoginController.javaの編集

前回の記事で実装した、「LoginController.java」の「login」メソッドの全件の取得結果から受け取ったユーザ名と一致しているかどうか確認していた部分を下記のように変更します。

LoginController.java

 List<User> userList = userRep.findById(loginForm.getUserId());

 if(userList.size() > 0) {
 model.addAttribute("userName", userList.get(0).getName());
 return "top";
 } else {
 return "index";
 }

ユーザリストが取得できた場合はモデルに取得したユーザリストのユーザ名を設定して「top.jsp」に遷移します。
ユーザリストが取得できなかった場合(0件だった場合)は、「index.jsp」に遷移します。

top.jspの編集

「LoginController.java」で設定された「userName」を表示します。
下記のように書き換えます。

top.jsp

<!DOCTYPE html>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<html>
 <head>
 <meta charset="utf-8">
 <title>トップ</title>
 </head>
 <body>
 ようこそ<c:out value="${userName}" />さん
 </body>
</html>

実行

結果確認

存在しないユーザID

存在しないユーザIDを入力します。
spring-framework-jpa-query1

「index.jsp」に遷移しました。
spring-framework-jpa-query2

存在するユーザID

存在するユーザIDを入力
spring-framework-jpa-query3

「top.jsp」に遷移しました。取得したユーザ名も表示されています。
spring-framework-jpa-query4

次回について

今回はクエリー条件の指定の仕方を紹介しました。次回はテーブル結合して取得する方法を紹介していきます。

  • このエントリーをはてなブックマークに追加

PAGE TOP