@Entity → @Repository → @Service → @RestController
DBテーブルと対応
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// getter / setter
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
@Entity:このクラスがDBテーブルに対応することを示す@Id:主キー@GenerateValue:主キーの自動採番package com.example.demo.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import com.example.demo.entity.User;
public interface UserRepository extends JpaRepository<User, Long> {
// これだけでCRUDメソッドが自動生成される
}
JpaRepository<T, Id>:
save(entity):新規登録・更新findAll():全件取得findById(id):主キー検索deleteById(id):削除count():件数取得Spring Data JPAはメソッド名でSQLを自動生成する
findByName(String name):name列が一致
SELECT * FROM users WHERE name=?
findByAgeGreaterThan(int age):age列が指定より大きい
SELECT * FROM users WHERE age>?
existByName(String name):存在チェック
SELECT COUNT(*) > 0
package com.example.demo.service;
import org.springframework.stereotype.Service;
import com.example.demo.repository.UserRepository;
import com.example.demo.entity.User;
import java.util.List;
@Service
public class UserService {
private final UserRepository userRepository;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public List<User> getAllUsers() {
return userRepository.findAll();
}
public void addUser(User user) {
userRepository.save(user);
}
}
package com.example.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.example.demo.service.UserService;
@Controller
public class UserController {
private final UserService userService;
public UserController(UserService userService) {
this.userService = userService;
}
@GetMapping("/users")
public String listUsers(Model model) {
model.addAttribute("users", userService.getAllUsers());
return "users"; // → templates/users.html
}
}
application.properties:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=update
spring.h2.console.enabled=true
spring.jpa.hibernate.dd1-auto=update:Entity定義に合わせて自動でテーブルを作成するspring.h2.console.enabled=true:ブラウザでDBを確認可能(http://localhost:8080/h2-console)jdbc:h2:mem:testdbsaapplication.propertiesapplication.yml:より構造的で見やすいため、主流application.yml:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/demo_db?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Tokyo
username: root
password: your_password
jpa:
hibernate:
ddl-auto: update # create / create-drop / update / validate / none
show-sql: true # 実行SQLをログ出力
properties:
hibernate:
format_sql: true
thymeleaf:
cache: false # テンプレートキャッシュ無効(開発時用)
spring.datasource.url:接続先DBのURL
jdbc:mysql://…spring.datasource.username:DBユーザー名spring.datasource.password:DBパスワードspring.jpa.hibernate.ddl-auto:スキーマ操作モード
create:アプリ起動毎にテーブルを作り直す(毎回データが消える)create-dropupdate:既存テーブルを維持しつつ差分更新(開発向け)validate:Entity定義とDB構造の生合成をチェックnone:自動DDLを無効化(本番運用向け)spring.jpa.show-sql:SQL出力の有無(true/false)spring.jpa.properties.hibernate.format_sql:SQLを整形して出力(true)pom.xml:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
→ 次:フォーム送信 / バリデーション