首先根据图示创建项目:
_1.png)
_2.png)
完成后目录结构:
_3.png)
1.配置MySQL数据库
修改application.properties文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| spring.application.name=HibernateDemo001
server.port=8001
spring.datasource.url=jdbc:mysql://localhost:3306/testdata?useSSL=false&serverTimezone=UTC spring.datasource.username=test spring.datasource.password=test123
spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.format_sql=true
|
2.创建实体类和DAO
User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package com.laisc.hibernatedemo001.model;
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;
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; } }
|
UserRepository.java
1 2 3 4 5 6 7 8 9 10 11
| package com.laisc.hibernatedemo001.repository;
import org.springframework.data.jpa.repository.JpaRepository; import com.laisc.hibernatedemo001.model.User;
public interface UserRepository extends JpaRepository<User, Long> { User findByName(String name); }
|
3.创建Service层
UserService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| package com.laisc.hibernatedemo001.service;
import com.laisc.hibernatedemo001.model.User; import com.laisc.hibernatedemo001.repository.UserRepository; import org.springframework.stereotype.Service; 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 User createUser(User user) { return userRepository.save(user); }
public User getUserById(Long id) { return userRepository.findById(id).orElse(null); }
public void deleteUser(Long id) { userRepository.deleteById(id); } }
|
4.创建Controller层
TestController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| package com.laisc.hibernatedemo001.controller;
import com.laisc.hibernatedemo001.model.User; import com.laisc.hibernatedemo001.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller @RequestMapping("/test") public class TestController {
private final UserService userService;
public TestController(UserService userService) { this.userService = userService; }
@ResponseBody @RequestMapping("/hello") public String hello() { return "Hello, SpringBoot!"; }
@ResponseBody @RequestMapping("/get") public List<User> getAllUsers() { return userService.getAllUsers(); }
@ResponseBody @RequestMapping("/add") public User createUser() { User user = new User(); user.setEmail("laisc7301@gmail.com"); return userService.createUser(user); }
@ResponseBody @RequestMapping("/getbyid") public User getUserById() { long id = 1; return userService.getUserById(id); }
@ResponseBody @RequestMapping("/delbyid") public void deleteUser() { long id = 1; userService.deleteUser(id); }
}
|
现在可以查看相关页面了
接下来详细介绍 Spring Data JPA 的命名查询方法(Derived Query Method)
1.Spring Data JPA 命名查询方法的基本概念
命名查询方法是 Spring Data JPA 的一种功能,通过在 Repository 接口中定义特定格式的方法,Spring 会根据方法名称解析并自动生成 SQL 查询。你无需手动编写 SQL,大幅提升开发效率。
命名查询方法的核心规则:
方法名以findBy、readBy、queryBy 开头。
后面紧跟实体类字段名,表示根据哪个字段进行查询。
使用关键字(如 And、Or)组合多个查询条件。
可以通过 OrderBy 指定排序规则。
使用限定词(如 GreaterThan、Between)完成范围查询。
2.修改文件
修改下面的文件为这样:
User.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| package com.laisc.hibernatedemo001.model;
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; private int age;
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; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; } }
|
UserRepository.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.laisc.hibernatedemo001.repository;
import org.springframework.data.jpa.repository.JpaRepository; import com.laisc.hibernatedemo001.model.User;
import java.util.List;
public interface UserRepository extends JpaRepository<User, Long> { User findByName(String name);
List<User> findByNameAndAge(String name, int age);
List<User> findByNameContaining(String keyword);
List<User> findByAgeGreaterThanOrderByAgeDesc(int age);
List<User> findByAgeBetween(int startAge, int endAge); }
|
UserService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package com.laisc.hibernatedemo001.service;
import com.laisc.hibernatedemo001.model.User; import com.laisc.hibernatedemo001.repository.UserRepository; import org.springframework.stereotype.Service; 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 User createUser(User user) { return userRepository.save(user); }
public User getUserById(Long id) { return userRepository.findById(id).orElse(null); }
public void deleteUser(Long id) { userRepository.deleteById(id); }
public User getUserByName(String name) { return userRepository.findByName(name); }
public List<User> getUsersByNameAndAge(String name, int age) { return userRepository.findByNameAndAge(name, age); }
public List<User> getUsersByNameContaining(String keyword) { return userRepository.findByNameContaining(keyword); }
public List<User> getOlderUsersSorted(int age) { return userRepository.findByAgeGreaterThanOrderByAgeDesc(age); }
public List<User> getUsersByAgeBetween(int startAge, int endAge) { return userRepository.findByAgeBetween(startAge, endAge); } }
|
TestController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| package com.laisc.hibernatedemo001.controller;
import com.laisc.hibernatedemo001.model.User; import com.laisc.hibernatedemo001.service.UserService; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller @RequestMapping("/test") public class TestController {
private final UserService userService;
public TestController(UserService userService) { this.userService = userService; }
@ResponseBody @RequestMapping("/hello") public String hello() { return "Hello, SpringBoot!"; }
@ResponseBody @RequestMapping("/get") public List<User> getAllUsers() { return userService.getAllUsers(); }
@ResponseBody @RequestMapping("/add") public User createUser() { User user = new User(); user.setEmail("laisc7301@gmail.com"); return userService.createUser(user); }
@ResponseBody @RequestMapping("/getbyid") public User getUserById() { long id = 1; return userService.getUserById(id); }
@ResponseBody @RequestMapping("/delbyid") public void deleteUser() { long id = 1; userService.deleteUser(id); }
@ResponseBody @RequestMapping("/findbyname") public User findUserByName() { String name = "aaa1"; return userService.getUserByName(name); }
@ResponseBody @RequestMapping("/findbynameandage") public List<User> findByNameAndAge() { String name = "aaa"; int age = 100; return userService.getUsersByNameAndAge(name, age);
}
}
|
2.命名查询方法的关键字详解
关键字 |
作用 |
示例方法 |
SQL 示例 |
And |
并且条件查询 |
findByNameAndAge |
SELECT * FROM user WHERE name=? AND age=? |
Or |
或者条件查询 |
findByNameOrEmail |
SELECT * FROM user WHERE name=? OR email=? |
Is / Equals |
精确匹配 |
findByNameIs 或 findByNameEquals |
SELECT * FROM user WHERE name=? |
Between |
范围查询 |
findByAgeBetween |
SELECT * FROM user WHERE age BETWEEN ? AND ? |
LessThan |
小于 |
findByAgeLessThan |
SELECT * FROM user WHERE age<? |
GreaterThan |
大于 |
findByAgeGreaterThan |
SELECT * FROM user WHERE age>? |
Containing / Like |
模糊匹配 |
findByNameContaining |
SELECT * FROM user WHERE name LIKE %?% |
OrderBy |
排序 |
findByAgeOrderByNameDesc |
SELECT * FROM user ORDER BY name DESC |
问:为什么会有 Is
或 Equals
?
Is
和 Equals
是为了增强方法命名的可读性而设计的:
Is
更像自然语言,适合需要强调逻辑上“是”的语义。
Equals
明确表达“相等”这个概念。
这两个关键字完全是可选的,Spring Data JPA 的解析器会自动忽略它们(视为等价)。
例如:
findByName
会被解析为 SELECT * FROM user WHERE name = ?
findByNameIs
会被解析为同样的 SELECT * FROM user WHERE name = ?