1. 程式人生 > >spring boot 整合 jpa (二) -- 之資料操作

spring boot 整合 jpa (二) -- 之資料操作

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();
    }
}