文章目录

  • ​​前情提要​​
  • ​​软件环境​​
  • ​​代码​​

前情提要

​​上回书​​说到,用Spring Boot写了一个Hello World小例子,那么今天就来完成上篇结尾留下的增删改查的实例。

软件环境

  • Windows 10
  • JDK 11
  • IDEA 2018.2
  • Maven 3.5.4
  • MySQL 8.0.12

代码

pom文件中需要添加一下依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.12</version>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.23.1-GA</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

yml文件:

server:
port: 8080
servlet:
path: /hello

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/helloboot?serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false
username: root
password: root
jpa:
show-sql: true

Controller:

@RestController()
public class UserController {

@Autowired
private UserRepository userRepository;

@PostMapping("/user")
public User save(User user) {
return userRepository.save(user);
}

@PutMapping("/user")
public User update(User user) {
return userRepository.save(user);
}

@GetMapping("/user/{id}")
public User findById(@PathVariable("id") Integer id) {
return userRepository.findById(id).get();
}

@DeleteMapping("/user/{id}")
public void delete(@PathVariable("id") Integer id) {
userRepository.deleteById(id);
}
}

由于过于简单,就省去Service层了。

Dao层:

public interface UserRepository extends JpaRepository<User, Integer> {
}

Dao层简单到令人发指!完成一个基本的CRUD只需要定义一个接口,不需要写任何实现和SQL。

实体

@Entity
@Data
public class User {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
private Integer age;
}

如果想要实现更多功能,依然简单到爆炸,只需要按照下表的规则,就能实现各种查询操作,不需要写任何实现和SQL。
​​​​​​​​​​​​​​
内置关键字:

Keyword

Sample

JPQL snippet

And

findByLastnameAndFirstname

… where x.lastname = ?1 and x.firstname = ?2

Or

findByLastnameOrFirstname

… where x.lastname = ?1 or x.firstname = ?2

Is,Equals

findByFirstname,findByFirstnameIs,findByFirstnameEquals

… where x.firstname = ?1

Between

findByStartDateBetween

… where x.startDate between ?1 and ?2

LessThan

findByAgeLessThan

… where x.age < ?1

LessThanEqual

findByAgeLessThanEqual

… where x.age <= ?1

GreaterThan

findByAgeGreaterThan

… where x.age > ?1

GreaterThanEqual

findByAgeGreaterThanEqual

… where x.age >= ?1

After

findByStartDateAfter

… where x.startDate > ?1

Before

findByStartDateBefore

… where x.startDate < ?1

IsNull

findByAgeIsNull

… where x.age is null

IsNotNull,NotNull

findByAge(Is)NotNull

… where x.age not null

Like

findByFirstnameLike

… where x.firstname like ?1

NotLike

findByFirstnameNotLike

… where x.firstname not like ?1

StartingWith

findByFirstnameStartingWith

… where x.firstname like ?1 (parameter bound with appended %)

EndingWith

findByFirstnameEndingWith

… where x.firstname like ?1 (parameter bound with prepended %)

Containing

findByFirstnameContaining

… where x.firstname like ?1 (parameter bound wrapped in %)

OrderBy

findByAgeOrderByLastnameDesc

… where x.age = ?1 order by x.lastname desc

Not

findByLastnameNot

… where x.lastname <> ?1

In

findByAgeIn(Collection ages)

… where x.age in ?1

NotIn

findByAgeNotIn(Collection ages)

… where x.age not in ?1

True

findByActiveTrue()

… where x.active = true

False

findByActiveFalse()

… where x.active = false

IgnoreCase

findByFirstnameIgnoreCase

… where UPPER(x.firstame) = UPPER(?1)