1. 程式人生 > >菜鳥學Spring Boot——簡單到令人髮指的CRUD

菜鳥學Spring Boot——簡單到令人髮指的CRUD

文章目錄

前情提要

上回書說到,用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)