Spring Boot 整合 Spring Data Jpa 增刪改查示例
阿新 • • 發佈:2018-11-10
原文地址: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;
}
}
效果圖
參考資料
本文所有程式碼放在 Github 上,地址:spring-boot-jpa