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 findByName(...)
其中,返回值根据业务需要进行设置;
方法名必须为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") 来返回对象本身

步履不停
原文地址:https://www.cnblogs.com/yuanyunjing/p/15414749.html