Appearance
基本增删改查
查询所有(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()方法。以上就是循环引用的过程,就会导致堆栈溢出
查询一条数据
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进行查询,而后才执行删除语句