前回の続き。
https://qiita.com/YJ2222/items/8c29fc7fc2d886a9b35e
ファイル作成
・必要なファイルを作成する。以下画像と「各ファイルの説明」を参考に作成する。
・各ファイルの説明。
- SpringApp1/src/main/java/com.ex1/dao
- UserDAO.java → DBアクセス用のオブジェクト
- SpringApp1/src/main/java/com.ex1/model
- User.java → ユーザ情報のインスタンスを生成するオブジェクト
- UserFindLogic.java → DAOが取得した情報を受け取り、インスタンス化。その後controllerへ渡す。
- SpringApp1/src/main/resources/
- data.sql → schema.sqlが作ったテーブルにデータをinsertするファイル。
- schema.sql → プロジェクト起動時にDBへアクセスしテーブルを作成するファイル。
- templates/userResult.html → postの処理が成功したときにフォワードされるview
作ったファイルにコードを書き込む。
templates/userResult.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>User</title>
</head>
<body>
<h1>UserResult</h1>
<table>
<tr>
<!-- th:textはthymeleafの機能を使用しgetAttributeできる。 -->>
<td>ID:</td><td th:text="${id}"></td>
</tr>
<tr>
<td>ニックネーム:</td><td th:text="${nickname}"></td>
</tr>
</table>
<body>
</html>
controller/UserController.java
package com.ex1.Controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.ex1.model.User;
import com.ex1.model.UserFindLogic;
@Controller
public class UserController {
@Autowired // 依存性の注入。
private UserFindLogic userFindLogic;
@GetMapping("/")
public String getUser() {
return "user";
}
// user.htmlからのpostの処理。@RequestParamでnameの値を取得。
@PostMapping("/user/db")
public String postDbRequest(@RequestParam("text") String str, Model model) {
int id = Integer.parseInt(str); // 文字列変換。
// UserFindLogicをnewしなくても@Autowiredで依存性を注入しているため、User型としてUserFindLogicを実行することができる。
User user = userFindLogic.findUser(id); // UserFindLogic.javaのfindUserメソッドを実行。
// UserFindLogic.javaから戻り値を受け取ったら以下を実行。
model.addAttribute("id", user.getUserId()); // ユーザ情報をsetAttributeする。
model.addAttribute("nickname", user.getNickName());
return "userResult"; // userResult.htmlにフォワード。
}
}
model/UserFindLogic.java
package com.ex1.model;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ex1.dao.UserDAO;
@Service // ビジネスロジックに付与するアノテーション。
public class UserFindLogic {
@Autowired
private UserDAO userDAO;
public User findUser(int id) { // controllerからの指示によりメソッドを実行。
Map<String, Object> map = userDAO.findUser(id); // UserDAOのfindUserを実行。
// DAOからuser変数を受け取る。
int userId = (Integer) map.get("user_id"); // 受け取った変数をmapで分解し.getで情報取得。
String nickName = (String) map.get("nickname");
User user = new User(); // userインスタンスを生成(User.java)
user.setUserId(userId); // setterを実行。
user.setNickName(nickName);
return user; // controllerにuserインスタンスを戻り値として返す。
}
}
model/User.java
package com.ex1.model;
public class User {
private int userId;
private String nickName;
public void setUserId(int userId) {
this.userId = userId;
}
public void setNickName(String nickName) {
this.nickName = nickName;
}
public int getUserId() {
return userId;
}
public String getNickName() {
return nickName;
}
}
dao/UserDAO.java
package com.ex1.dao;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository // DAOクラスに付与するアノテーション。
public class UserDAO {
@Autowired
private JdbcTemplate jdbcTemplate; // DB接続できるインスタンス。
public Map<String, Object> findUser(int id) { // UserFindLogic.javaの指示によりメソッドを実行。
// SELECT文を生成
String query = "SELECT "
+ " * "
+ "FROM account "
+ "WHERE user_id=?";
// jdbcTemplateの機能によってDBに対しSQLを実行。
Map<String, Object> user = jdbcTemplate.queryForMap(query, id);
return user; // 上記の処理結果をUserFindLogic.javaに戻り値として返す。
}
}
templates/userResult.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"></meta>
<title>User</title>
</head>
<body>
<h1>UserResult</h1>
<table>
<tr>
<td>ID:</td><td th:text="${id}"></td>
</tr>
<tr>
<td>ニックネーム:</td><td th:text="${nickname}"></td>
</tr>
</table>
<body>
</html>
src/main/resources/application.properties
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
spring.datasource.driver-class-name=org.h2.Driver
spring.datasouce.username=sa
spring.datasouce.password=
spring.datasource.sql-script-encoding=UTF-8
spring.h2.console.enabled=true
spring.datasource.initialize=true
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
src/main/resources/data.sql
INSERT INTO account (user_id, nickname, password) VALUES (1, 'user1', 'user1+');
src/main/resources/schema.sql
CREATE TABLE IF NOT EXISTS account (
user_id INT PRIMARY KEY,
nickname VARCHAR(50),
password VARCHAR(50)
);
・処理の流れは、コードのコメント欄と以下の画像を参考にすると想像しやすい。
以上です。これでローカル環境でDBの接続までできました。