Skip to content
On this page

基本增删改查

查询所有(findAll())

测试代码

java
package com.huangjiliang.jpa;

import com.huangjiliang.jpa.entity.Employee;
import com.huangjiliang.jpa.repository.EmployeeRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringDataJpaApplication.class)
public class SpringDataJpaBasicCrudTest {

    private static final Logger logger = LoggerFactory.getLogger(SpringDataJpaBasicCrudTest.class);

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testSearchAll() {
        List<Employee> all = employeeRepository.findAll();
        for (Employee employee : all) {
            logger.info(employee.getName());
            logger.info(employee.getDept().getDeptName());
        }
    }
}

注意:

  • 打印logger.info(employee.getName());不用使用System.out.println(employee);否则会报堆存溢出,如下图所示。打印实体类对象时,会调用toString()方法,toString()方法会触发Employee属性的懒加载,便会去调用Dept类的toString()方法,Dept类中的toString()方法,会触发employees属性的懒加载,接着会调用Employee类中的toString()方法。以上就是循环引用的过程,就会导致堆栈溢出

image-20220903121819574

查询一条数据

findById()

java
package com.huangjiliang.jpa;

import com.huangjiliang.jpa.entity.Employee;
import com.huangjiliang.jpa.repository.EmployeeRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringDataJpaApplication.class)
public class SpringDataJpaBasicCrudTest {

    private static final Logger logger = LoggerFactory.getLogger(SpringDataJpaBasicCrudTest.class);

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testSearchOne1() {
//        Employee employee = employeeRepository.getById(11);
//        Employee employee = optional.get();
//        logger.info(employee.getName());
        Optional<Employee> optional = employeeRepository.findById(11);
        if (optional.isPresent()) {
            Employee employee = optional.get();
            logger.info(employee.getName());
        }
    }
}

getOne()

java
package com.huangjiliang.jpa;

import com.huangjiliang.jpa.entity.Employee;
import com.huangjiliang.jpa.repository.EmployeeRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringDataJpaApplication.class)
public class SpringDataJpaBasicCrudTest {

    private static final Logger logger = LoggerFactory.getLogger(SpringDataJpaBasicCrudTest.class);

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testSearchOne2() {
        Employee employee = employeeRepository.getOne(1);
        logger.info(employee.getName());
    }
}

注意点:

getByOne()方法过时

java
/**
	 * Returns a reference to the entity with the given identifier. Depending on how the JPA persistence provider is
	 * implemented this is very likely to always return an instance and throw an
	 * {@link javax.persistence.EntityNotFoundException} on first access. Some of them will reject invalid identifiers
	 * immediately.
	 *
	 * @param id must not be {@literal null}.
	 * @return a reference to the entity with the given identifier.
	 * @see EntityManager#getReference(Class, Object) for details on when an exception is thrown.
	 * @deprecated use {@link JpaRepository#getById(ID)} instead.
	 */
	@Deprecated
	T getOne(ID id);

getById和findById区别

  • getById方法如果找不到实体类就会抛出异常
  • findById方法返回的是Optional对象,而Optional可以包含null和非null,可以在获取数据的先判断在获取

新增|修改方法

新增和修改均使用save()方法,该方法会根据传入的对象是否包含id属性值来决定是进行insert还是update操作,因为他们都是上层接口中提供的方法,所以EmployeeRepository中不需要添加任何代码就可以通过测试类的调用测试

java
@Test
    public void testSave() {
        Employee employee = new Employee();
        employee.setUserNumber(903).setGender("0903").setName("0903");
        Employee save = employeeRepository.save(employee);
    }
  • 执行testSave方法可以看到控制台执行insert语句
java
@Test
    public void testUpdate() {
        Employee employee = new Employee();
        employee.setUserNumber(9031).setGender("09031").setName("09031").setId(11);
        Employee save = employeeRepository.save(employee);
    }
  • 执行testUpdate方法可以看到控制台打印先select后再执行update语句

删除

deleteById(T id)或者delete(Empty empty)方法提供根据id删除数据的功能,需要注意的是spring data jpa提供的一些列删除方法均没有返回值,即无法通过返回值判断是否删除成功,如果需要检测则需要搭配tay-catch来完成。

在实际的项目开发中,一般不推荐使用哦个delete语句的物理删除,而是使用update某个预设字段来进行逻辑删除

java
@Test
    public void testDelete() {
        Employee employee = new Employee();
        employee.setId(11);
        employeeRepository.delete(employee);
    }
  • 执行testDelelte方法之后,会先执行根据id进行查询,而后才执行删除语句