0
点赞
收藏
分享

微信扫一扫

Spring Data学习day93:Spring Data JPA

香小蕉 2021-09-21 阅读 37

一、Spring Data Jpa中的接口:

1.Repository接口:

  • 规则:


  • 创建接口:

public interface UsersRepositoryByName extends Repository<Users, Integer> {

    List<Users> findByName(String name);
    List<Users> findByNameAndAge(String name,Integer age);
    List<Users> findByNameLike(String name);
}
  • 测试类:
@SpringBootTest
public class ApplicationTest {

    @Autowired
    private Repositorys repositorys;

    @Test
    public void findUser() {
        List<Users> list = repositorys.findByusername("李四");
        for (Users user : list) {
            System.out.println(user);
        }
    }
}
  • 基于@Query注解的查询:
  • 创建接口:
public interface UserQuery extends Repository<Users,Integer> {

    @Query("from Users where username= :username")
    public List<Users> findByName(String username);

    @Query("from Users where username like %:username%")
    public List<Users> findLikeName(String username);

    @Query(value = "select *from users where username=?",nativeQuery = true)
    public List<Users> findByNameSQL(String username);

    @Query("update Users set username= :username where userid = :userid")
    @Modifying
    public void updateUser(String username,Integer userid);
}
  • 测试:
@SpringBootTest
public class TestQuery {

    @Autowired
    private UserQuery userQuery;

    @Test
    public void findByName() {
        List<Users> list = userQuery.findByName("李四");
        for (Users user:list) {
            System.out.println(user);
        }
    }
    @Test
    public void findLikeName(){
        List<Users> list = userQuery.findLikeName("李");
        for (Users user:list) {
            System.out.println(user);
        }
    }
    @Test
    public void findByNames(){
        List<Users> list = userQuery.findByNameSQL("李四");
        for (Users user:list) {
            System.out.println(user);
        }
    }

    @Test
    @Transactional
    @Rollback(false)
    public void updateUser(){
        this.userQuery.updateUser("王五",2);
    }
}

2.CrudRepository接口:

  • 创建接口:
public interface UserCrudRepository extends CrudRepository<Users,Integer> {
}
  • 测试:
@SpringBootTest
public class TestCrud {
    @Autowired
    private UserCrudRepository userCrudRepository;

    @Test
    public void saveUser() {
        Users users = new Users();
        users.setUsername("张三");
        users.setUserage(23);
        users.setAddress("上海");
        userCrudRepository.save(users);
    }
    @Test
    public void updateUser() {
        Users users = new Users();
        users.setUserid(3);
        users.setUsername("张小三");
        users.setAddress("郑州");
        users.setUserage(18);
    }
    @Test
    public void findOne() {
        Optional<Users> optianal = userCrudRepository.findById(3);
        Users users = optianal.get();
        System.out.println(users);
    }
    @Test
    public void findAll() {
        List<Users> list = (List<Users>) userCrudRepository.findAll();
        for (Users user : list) {
            System.out.println(user);
        }
    }
    @Test
    public void deleteUser() {
        userCrudRepository.deleteById(3);
    }
}

3.JpaRepository接口:

  • 创建接口:
public interface UsersRepository extends JpaRepository<Users,Integer> {
}
  • 测试:
@SpringBootTest
class SpringdataJpaApplicationTests {

    @Autowired
    private UsersRepository usersRepository;

    //添加
    @Test
    public void addUser() {
        Users users = new Users();
        users.setUsername("张三");
        users.setUserage(18);
        users.setAddress("郑州");
        usersRepository.save(users);
    }
    //查询所有
    @Test
    public void findAll(){
        List<Users> list = usersRepository.findAll();
        for (Users user:list) {
            System.out.println(user);
        }
    }
    //ID查找
    @Test
    public void findById(){
        Optional<Users> optional = usersRepository.findById(1);
        Users users = optional.get();
        System.out.println(users);
    }
    //修改
    @Test
    public void updateUser(){
        Users users = new Users();
        users.setUserid(1);
        users.setUsername("李四");
        users.setUserage(20);
        users.setAddress("北京");
        usersRepository.save(users);
    }
    //删除
    @Test
    public void deleteUser(){
        usersRepository.deleteById(2);
    }
}

4.PagingAndSortingRepository接口

  • 创建接口:
public interface UserPageAndSort extends PagingAndSortingRepository<Users,Integer> {
}
  • 测试:
/**
 * 排序分页测试
 */
@SpringBootTest
public class TestPageAndSort {

    @Autowired
    private UserPageAndSort userPageAndSort;

    @Test
    public void TestSort(){
        //创建Order对象
        Sort.Order order =  Sort.Order.desc("userid");
        Sort sort = Sort.by(order);
        Iterable<Users> iterable = userPageAndSort.findAll(sort);
        for (Users user:iterable){
            System.out.println(user);
        }
    }

    @Test
    public void TestPage(){
        //Pageable:封装了分页的参数,当前页,每页显示的条数。当前页是从0开始。
        //PageRequest(page,size) page:当前页。size:每页显示的条数
//        Pageable pageable = new PageRequest(1,2); //低版本
        PageRequest pageRequest = PageRequest.of(0, 2);
        Page<Users> page = userPageAndSort.findAll(pageRequest);
        System.out.println("总条数:"+page.getTotalElements()+";总页数:"+page.getTotalPages());
        List<Users> list = page.getContent();
        for (Users user:list){
            System.out.println(user);
        }
    }

    @Test
    public void PageAndSort(){
        Sort.Order order= Sort.Order.desc("userid");
        Sort sort= Sort.by(order);
        PageRequest pageRequest = PageRequest.of(0,2,sort);

        Page<Users> page = userPageAndSort.findAll(pageRequest);
        System.out.println("总条数:"+page.getTotalElements()+";总页数:"+page.getTotalPages());
        List<Users> list = page.getContent();
        for (Users user:list) {
            System.out.println(user);
        }
    }
}

5.JpaSpecificationException接口:

  • 创建接口:
public interface UserJpaSpecificationExecutor extends JpaSpecificationExecutor<Users>, JpaRepository<Users,Integer> {
}
  • 测试:
@SpringBootTest
public class TestJpaSpecificationExcutor {

    @Autowired
    private UserJpaSpecificationExecutor userJpaSpecificationExecutor;
    //单条件测试
    @Test
    public void TestJpaRepository(){
        //封装查询条件
        Specification<Users> specification = new Specification<Users>() {
            @Override
            public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                Predicate predicate = criteriaBuilder.equal(root.get("username"), "张三");
                return predicate;
            }
        };
        List<Users> list = userJpaSpecificationExecutor.findAll(specification);
        for (Users user:list) {
            System.out.println(user);
        }
    }
    //多条件查询
    @Test
    public void TestJapSpecificationExecutor(){
        Specification<Users> specification = new Specification<Users>() {
            @Override
            public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                ArrayList<Predicate> list = new ArrayList<>();
                list.add(criteriaBuilder.equal(root.get("username"),"张三"));
                list.add(criteriaBuilder.equal(root.get("userage"),23));
                Predicate[] predicates = new Predicate[1];
                return criteriaBuilder.and(list.toArray(predicates));
            }
        };
        List<Users> list = userJpaSpecificationExecutor.findAll(specification);
        for (Users user:list){
            System.out.println(user);
        }
    }

    @Test
    public void testFindAll(){
        Specification<Users> specification = new Specification<Users>() {
            @Override
            public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {

                return criteriaBuilder.and(criteriaBuilder.like(root.get("username"),"%张%"),criteriaBuilder.ge(root.get("userage"),23));
            }
        };
        Sort.Order o = Sort.Order.desc("userage");
        Sort sort = Sort.by(o);
        PageRequest pageRequest = PageRequest.of(0, 2, sort);
        Page<Users> page = userJpaSpecificationExecutor.findAll(specification,pageRequest);
        System.out.println("总条数:"+page.getTotalElements()+";总页数"+page.getTotalPages());
        for (Users user:page){
            System.out.println(user);
        }
    }
}

二、关联查询

1.一对一关联查询:

  • 创建用户:
@Entity
@Table
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int perid;
    @Column
    private String pername;

    public int getPerid() {
        return perid;
    }

    public void setPerid(int perid) {
        this.perid = perid;
    }

    public String getPername() {
        return pername;
    }

    public void setPername(String pername) {
        this.pername = pername;
    }
}
  • 创建IdCard:
@Entity
@Table
public class IdCard {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int cardid;
    @Column
    private String cardnum;

    //cascade代表级联操作
    @OneToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "perid")
    private Person person;//一对一关系

    public int getCardid() {
        return cardid;
    }

    public void setCardid(int cardid) {
        this.cardid = cardid;
    }

    public String getCardnum() {
        return cardnum;
    }

    public void setCardnum(String cardnum) {
        this.cardnum = cardnum;
    }

    public Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}
  • 创建接口:
public interface PersonJpaRepository extends JpaRepository<IdCard,Integer> {
}
  • 测试:
@SpringBootTest
public class TestPerson {

    @Autowired
    private PersonJpaRepository personJpaRepository;

    @Test
    public void testAdd() {
        Person person = new Person();
        person.setPername("张三");
        IdCard idCard = new IdCard();
        idCard.setCardnum("412722199910101234");
        idCard.setPerson(person);
        personJpaRepository.save(idCard);
    }

    @Test
    public void testFindAll(){
        List<IdCard> list = personJpaRepository.findAll();
        for (IdCard idcard:list) {
            System.out.println(idcard);
        }
    }
}

2.一对多关联查询:

  • 创建员工实体:
@Entity
@Table
public class Emp {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int empid;
    @Column
    private String empname;

    @ManyToOne(cascade = CascadeType.PERSIST)//多对一关系
    @JoinColumn(name = "deptid")
    private Dept dept;

    public int getEmpid() {
        return empid;
    }

    public void setEmpid(int empid) {
        this.empid = empid;
    }

    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }

    public Dept getDept() {
        return dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }
}
  • 创建部门实体:
@Entity
@Table
public class Dept {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int deptid;
    @Column
    private String deptname;

    @OneToMany(mappedBy = "dept")//mappedBy用于指定关系维护
    private Set<Emp> emp=new HashSet<>();

    public int getDeptid() {
        return deptid;
    }

    public void setDeptid(int deptid) {
        this.deptid = deptid;
    }

    public String getDeptname() {
        return deptname;
    }

    public void setDeptname(String deptname) {
        this.deptname = deptname;
    }

    public Set<Emp> getEmp() {
        return emp;
    }

    public void setEmp(Set<Emp> emp) {
        this.emp = emp;
    }
}
  • 创建接口:
public interface EmpJpaRepository extends JpaRepository<Emp,Integer> {
}
  • 测试:
@SpringBootTest
public class TestEmp {
    @Autowired
    private EmpJpaRepository empJpaRepository;

    @Test
    public void TestAdd(){
        Dept dept = new Dept();
        dept.setDeptname("人事部");
        Emp emp = new Emp();
        emp.setEmpname("Admin");
        emp.setDept(dept);
        empJpaRepository.save(emp);
    }
    @Test
    public void testFindAll(){
        List<Emp> list = empJpaRepository.findAll();
        for (Emp emp:list){
            System.out.println(emp);
        }
    }
}

3.多对多关联查询:

  • 创建学生实体:


@Entity
@Table
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int stuid;
    @Column
    private String stuname;
    @ManyToMany(cascade = CascadeType.PERSIST)
    @JoinTable(name = "stu_cou",joinColumns = @JoinColumn(name = "stuid"),
            inverseJoinColumns = @JoinColumn(name = "couid"))
    private Set<Course> course = new HashSet<>();

    public int getStuid() {
        return stuid;
    }

    public void setStuid(int stuid) {
        this.stuid = stuid;
    }

    public String getStuname() {
        return stuname;
    }

    public void setStuname(String stuname) {
        this.stuname = stuname;
    }

    public Set<Course> getCourse() {
        return course;
    }

    public void setCourse(Set<Course> course) {
        this.course = course;
    }
}
  • 创建课程实体:
@Entity
@Table
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int couid;
    @Column
    private String couname;
    //维护关系,mappedBy=“对方和当前对象关联的对象名称”
    @ManyToMany(mappedBy = "course")
    private Set<Student> students = new HashSet<>();

    public int getCouid() {
        return couid;
    }

    public void setCouid(int couid) {
        this.couid = couid;
    }

    public String getCouname() {
        return couname;
    }

    public void setCouname(String couname) {
        this.couname = couname;
    }

    public Set<Student> getStudents() {
        return students;
    }

    public void setStudents(Set<Student> students) {
        this.students = students;
    }
}
  • 创建接口:
public interface StudentJpaRepository extends JpaRepository<Student,Integer> {
}
  • 测试:
@SpringBootTest
public class TestStudent {

    @Autowired
    StudentJpaRepository studentJpaRepository;

    @Test
    public void testAdd(){
        Student student = new Student();
        student.setStuname("张三");
        Course course = new Course();
        course.setCouname("Java");
        Course course1 = new Course();
        course1.setCouname("C++");
        student.getCourse().add(course);
        student.getCourse().add(course1);
        studentJpaRepository.save(student);
    }
}

4.使用的注解:

  • mappedBy 属性:
  • 级联关系类型:
举报

相关推荐

0 条评论