一、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 属性:
- 级联关系类型: