1. 程式人生 > >Spring Boot 整合 Spring Data Jpa 增刪改查示例

Spring Boot 整合 Spring Data Jpa 增刪改查示例

原文地址:https://renguangli.com/articles/spring-boot-jpa

使用 Spring Data Jpa 對資料庫進行操作

Jpa 與 Spring Data Jpa 的關係

JPA 是Java Persistence API 的簡稱,中文名 Java 持久層 API,是 JDK 5.0 註解或 XML 描述物件-關係表的對映關係,並將執行期的實體物件持久化到資料庫中。

Sun 引入新的 JPA ORM 規範出於兩個原因:

  • 簡化現有 Java EE 和 Java SE 應用開發工作;
  • Sun 希望整合 ORM 技術,實現天下歸一。

Spring Data Jpa 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套 JPA 應用框架,開發者用極簡的程式碼即可實現對資料的訪問。它提供了包括增刪改查等在內的常用功能,並且易於擴充套件!學習並使用 Spring Data JPA 可以極大提高開發效率!

快速開始

在 pom.xml 檔案新增 Jpa 依賴

使用 MySQL 資料庫作為儲存。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>
spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency>

Jpa 相關配置

application.properties

spring.thymeleaf.cache=false

spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=root

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

編寫 Entity

@Entity
@Table(name = "USER")
public class User {

    @Id
    @GeneratedValue
    private Long userId;

    @Column(name = "username", length = 16, unique = true)
    private String username;

    private String password;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")

    private char sex;

    private Integer age;

    public User(){}
    
    ...

}

編寫 Repository

public interface UserRepository extends JpaRepository<User, Long> {

    Page<User> findAll(Specification<User> spec, Pageable pageable);
   
    @Transactional
    void deleteByUserIdIn(Long[] userIds);

    @Transactional
    @Modifying
    @Query("update User set password = ?1 where username=?2")
    void updateUser(String password, String username);
}

編寫 Controller

為減少程式碼量就不寫 Service 了

@RestController
public class UserController {

    private final UserRepository userRepository;

    @Autowired
    public UserController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @GetMapping("/users")
    public Map<String, Object> listUsers(User user
            , @RequestParam(value = "page", defaultValue = "1") Integer page
            , @RequestParam(value = "limit", defaultValue = "10") Integer limit) {

        Pageable pageable = new PageRequest((page - 1) * limit, limit);
        Specification<User> specification = (root, query, cb) -> {
            List<Predicate> list = new ArrayList<>();
            String username = user.getUsername();
            if (username != null && !"".equals(username)){
                list.add(cb.like(root.get("username").as(String.class), username + "%"));
            }
            return cb.and(list.toArray(new Predicate[0]));
        };
        Page<User> userPage = userRepository.findAll(specification, pageable);

        Map<String, Object> data = new Hashtable<>();
        data.put("code", 0);
        data.put("msg", "success");
        data.put("data", userPage.getContent());
        data.put("count", userPage.getTotalElements());
        return data;
    }

    @GetMapping("/user")
    public boolean existsUser(Long userId) {
        return userRepository.exists(userId);
    }

    @PostMapping("/user")
    public boolean saveUser(User user) {
        user.setUsername(UUID.randomUUID().toString().replace("-", "").substring(0,15));
        user.setPassword(UUID.randomUUID().toString().replace("-", "").substring(0,11));
        if (new Random().nextInt(10) % 2 == 0) {
            user.setSex('男');
        } else {
            user.setSex('女');
        }
        user.setCreateTime(new Date());
        user.setAge(18);
        userRepository.save(user);
        return true;
    }

    @DeleteMapping("/user/{userId}")
    public boolean deleteUser(@PathVariable Long userId) {
        userRepository.delete(userId);
        return true;
    }

    @DeleteMapping("/users")
    public boolean deleteBatchUser(@RequestParam("userIds[]") Long[] userIds) {
        userRepository.deleteByUserIdIn(userIds);
        return true;
    }

    @PutMapping("/user")
    public boolean updateUser(User user) {
        userRepository.updateUser(user.getPassword(), user.getUsername());
        return true;
    }

}

效果圖

spring-boot-jpa

參考資料

本文所有程式碼放在 Github 上,地址:spring-boot-jpa