JPA学习笔记四:理论篇之CRUD
定义一个TestObjDao接口继承自JpaRepository接口
public interface TestObjDao extends JpaRepository<TestObj, Integer> {
// 继承其父接口中的全部方法
}
1. save : 保存/更新
如果指定了对象id,如在数据库中查到则更新;如未查到则添加;
如果没有指定id,则添加。
如:
TestObj testObj = new TestObj();
testObj.setName("Amy");
testObj.setAge(1);
testObjDao.save(testObj);
2. 查询
使用JpaRepository接口提供,并非自定义的查询方法
查到后封装到一个Optional中
列表查:findAll(),该方法可指定参数,如Sort,及升序、降序,分页查看。
分页查:在JpaRepository父接口中,
Pageable pageable = PageRequest.of(0, 2, Sort.Direction.DESC, "id");
testObjDao.findAll(pageable);
3. 删除
分为两步:
Step1: 根据id select查询到待删除记录
Step2: 删除该记录
4. 自定义查询
都是通过实体来操作数据库,而非sql
1)什么时候使用:当JpaRepository提供的接口无法满足业务需求时,使用自定义查询
2)自定义查询写在TestObjDao中,有严格定义规范:
List
其中,返回值根据业务需要进行设置;
方法名必须为findByXxx,Xxx需严格为属性名称;
参数也根据业务需要进行设置。
此外,也可通过方法名来实现条件查询,如findByNameAndAge、findByIdBetweenOrderById(Integer minId, IntegerMaxId)等。
5. jpql查询
如觉得自定义查询方法名比较繁琐,也可使用jpql查询。
jpql是Java持久化语言,是对对象实体进行的查询。
具体可为:
SELECT attrName1, attrName2 FROM entityname
需注意:
1)不能出现数据库中的表名
2)不能出现SELECT *
3) SELECT等关键字不区分大小写
4) 属性、实体名严格区分大小写
@Query(value = "SELECT attrName1, attrName2 FROM entityname") 返回为Object[],需用Arrays.toString转换
可用 @Query(value = "SELECT new ...(包名.类名) FROM entityname") 来返回对象本身