SpringBoot使用Hibernate(基于MySQL)

首先根据图示创建项目:

完成后目录结构:

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

# Hibernate配置
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;

// 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;
}
}

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() { //根据id查找数据
long id = 1;
return userService.getUserById(id);
}

@ResponseBody
@RequestMapping("/delbyid")
public void deleteUser() { //根据id删除数据
long id = 1;
userService.deleteUser(id);
}

}

现在可以查看相关页面了

接下来详细介绍 Spring Data JPA 的命名查询方法(Derived Query Method)

1.Spring Data JPA 命名查询方法的基本概念

命名查询方法是 Spring Data JPA 的一种功能,通过在 Repository 接口中定义特定格式的方法,Spring 会根据方法名称解析并自动生成 SQL 查询。你无需手动编写 SQL,大幅提升开发效率。

命名查询方法的核心规则:

  1. 方法名以findByreadByqueryBy 开头。

  2. 后面紧跟实体类字段名,表示根据哪个字段进行查询。

  3. 使用关键字(如 AndOr)组合多个查询条件。

  4. 可以通过 OrderBy 指定排序规则。

  5. 使用限定词(如 GreaterThanBetween)完成范围查询。

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;

// 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;
}

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() { //根据id查找数据
long id = 1;
return userService.getUserById(id);
}

@ResponseBody
@RequestMapping("/delbyid")
public void deleteUser() { //根据id删除数据
long id = 1;
userService.deleteUser(id);
}


@ResponseBody
@RequestMapping("/findbyname")
public User findUserByName() { //根据name查找数据
String name = "aaa1";
return userService.getUserByName(name);
}

@ResponseBody
@RequestMapping("/findbynameandage")
public List<User> findByNameAndAge() { //根据name和age查找数据
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 精确匹配 findByNameIsfindByNameEquals 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

问:为什么会有 IsEquals

IsEquals 是为了增强方法命名的可读性而设计的:

  1. Is 更像自然语言,适合需要强调逻辑上“是”的语义。
  2. Equals 明确表达“相等”这个概念。

这两个关键字完全是可选的,Spring Data JPA 的解析器会自动忽略它们(视为等价)。

例如:

  • findByName 会被解析为 SELECT * FROM user WHERE name = ?
  • findByNameIs 会被解析为同样的 SELECT * FROM user WHERE name = ?