spring boot 整合 jpa (二) -- 之資料操作
阿新 • • 發佈:2018-11-19
spring boot 整合 jpa (一) – 之基礎配置
https://blog.csdn.net/qq_41463655/article/details/82939481
spring boot 整合 jpa (三) – 之表關係對映
https://blog.csdn.net/qq_41463655/article/details/82939791
dao層
package ws.cn.jpa.dao; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Component; import ws.cn.jpa.entity.User; /** * Created by Administrator on 2018/10/2/002. * JpaRepository<User,Long> 說明: * User 實體類 * Long 實體類主建的資料型別 */ @Component public interface UserDao extends JpaRepository<User,Long>,JpaSpecificationExecutor<User> { //自定義 sql 語句 @Query(value = "SELECT * FROM USER WHERE id = ?1", nativeQuery = true) User selectId(Integer id); /* * 我們在這裡直接繼承 JpaRepository * 這裡面已經有很多現成的方法 * 這也是JPA的一大優點 * * (1) CrudRepository: 繼承 Repository,實現了一組 CRUD 相關的方法 (2) PagingAndSortingRepository: 繼承 CrudRepository,實現了一組分頁排序相關的方法 (3)JpaRepository: 繼承 PagingAndSortingRepository,實現一組 JPA 規範相關的方法 (4)JpaSpecificationExecutor: 實現條件查詢 * */ }
此處直接呼叫的 dao 層,請自行把複雜程式碼防止 service層在用 contrller 層呼叫
package ws.cn.jpa.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.jpa.domain.Specification; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import ws.cn.jpa.dao.UserDao; import ws.cn.jpa.entity.User; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import java.util.ArrayList; import java.util.List; /** * Created by Administrator on 2018/10/2/002. */ @RestController public class UserController { //帶 Flush 的方法為sql 立即生效 /* @Autowired private UserService userService;*/ @Autowired private UserDao userDao; //============查詢所有=============== @GetMapping("/listuser") public List<User> findAll() { // Sort 第一個屬性為排序規則, 第二個屬性為按照那個欄位來排序 Sort sort = new Sort(Sort.Direction.DESC, "userId"); //findAll() 可以不帶sort屬性,預設排序 return userDao.findAll(sort); } //============ id 查詢=============== @GetMapping("/findById") public User findById(Long id) { id = 3L; //模擬 id User user = userDao.findById(Long.valueOf(id)).get(); return user; } //============ 多id 查詢=============== @GetMapping("/findAllById") public List findAllById(List<Long> ids) { // 模擬 id List list = new ArrayList(); list.add(Long.valueOf(2)); list.add(Long.valueOf(3)); List users = userDao.findAllById(list); return users; } //============ 分頁查詢=============== @GetMapping("/pageuser") public Page<User> pageuser() { // 開始頁數 / 每頁數量 / 排序規則 / 根據id排序 Pageable pageable = new PageRequest(0, 2, Sort.Direction.DESC, "id"); Page<User> page = userDao.findAll(pageable); System.out.println(page.getTotalElements() + "-->總資料數"+"/r/n"+ page.getTotalPages() + "-->總頁數"+"/r/n"+ page.getNumber() + "-->當前頁"+"/r/n"+ page.getSize() + "-->每頁條數"+"/r/n"+ page.getNumberOfElements() + "-->本頁條數"+"/r/n"+ "查詢到的資料:" + page.getContent() ); return page; } //============ 動態條件查詢 =============== /* * username = 666 and password = 666 * username = 666 or password = 666 **/ @GetMapping("/queryStudent") public List<User> queryStudent(User user) { user.setUsername("666"); user.setPassword("666"); //生成條件 Specification specification = new Specification() { @Override public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) { // and 條件 List<Predicate> ands = new ArrayList<>(); if (user.getUsername() != null && !"".equals(user.getUsername())) { ands.add(criteriaBuilder.equal(root.<String>get("username"), user.getUsername())); } if (user.getUsername() != null && !"".equals(user.getUsername())) { ands.add(criteriaBuilder.equal(root.<String>get("password"), user.getPassword())); } // or 條件 List<Predicate> ors = new ArrayList<>(); ors.add(criteriaBuilder.like(root.<String>get("username"), "%"+"9"+"%")); //模糊查詢 like ors.add(criteriaBuilder.like(root.<String>get("password"), "%"+"9"+"%")); //模糊查詢 like Predicate and = criteriaBuilder.and(ands.toArray(new Predicate[ands.size()])); //and 連線的條件集 Predicate or = criteriaBuilder.or(ors.toArray(new Predicate[ors.size()])); //or 連線的條件集 List<Predicate> predicate = new ArrayList<>(); //條件集集合 predicate.add(and); //新增 and 的條件集 predicate.add(or); //新增 or 的條件集 //return criteriaBuilder.and(predicate.toArray(new Predicate[predicate.size()]));// and 連線條件集 return criteriaBuilder.or(predicate.toArray(new Predicate[predicate.size()])); // or 連線條件集 } }; List userDaoAll = userDao.findAll(specification); return userDaoAll; } //============ 新增、修改資料=============== @GetMapping("/adduser") public void addUser(User user) { userDao.save(user); } //============ 新增多條資料=============== @GetMapping("/saveAll") public void saveAll() { List<User> list = new ArrayList<>(); for (int i = 0; i < 10; i++) { User user = new User("mm" + i, "123456"); list.add(user); } //儲存實體集合 userDao.saveAll(list); } //============ id 刪除資料=============== @GetMapping("/deleteId") public void deleteuser(Long id) { userDao.deleteById(id); } //============ 多 id 刪除資料=============== @GetMapping("/deleteIds") public void deleteAll(List<Long> ids) { List list = new ArrayList(); list.add(Long.valueOf(7)); list.add(Long.valueOf(8)); list.add(Long.valueOf(9)); userDao.deleteAll(list); } //============ 刪除所有資料 =============== @GetMapping("/deleteAll") public void deleteAll(Long id) { userDao.deleteAll(); } }