SpringData学习02
滴水川石
关于Springdata自带的一些关键字查询就不做记录了,不能完成复杂SQL,实际工作中不会使用。
写个样子:
/** * Repository 声明方法的规范 * 1. 查询以 find | read | get 开头 * 2. 涉及到条件查询的时候,需要使用关键字(首字母大写)连接 * */ //根据名称查询 Person getByName(String name);
1、关于 Repository
其子类后边再说,这里先大概了解 Repository
1.1.Repository 接口是一个空接口,即标记接口
1.2.若我们定义的接口继承类了Repository接口,则该接口会被Spring容器识别为一个Repository Bean,纳入到IOC容器中。
extends Repository<Person, Integer>
1.3.也可以通过 @RepositoryDefinition 注解声明
@RepositoryDefinition(domainClass = Person.class, idClass = Integer.class)
2、关于查询
2.1 使用 @Query 注解查询(无参)
@Query("SELECT p FROM Person p")
List<Person> getPersons();
自动解析执行的SQL:
2.2 占位符 传参
@Query("SELECT p FROM Person p WHERE p.name = ?1 AND p.age = ?2")
Person getPersonByNameAndAge(String name,Integer age);
占位符传参的要求是 参数传递必须按照占位符的顺序
2.3 命名参数绑定传参
@Query("SELECT p FROM Person p WHERE p.name = :name AND p.age = :age")
Person getPersonByNameAndAge2(@Param("age") Integer age, @Param("name") String name);
命名参数绑定可以不要求传参顺序
注意实参 的 传递和形参的名称没有任何关系
2.4 使用原生SQL进行查询
//使用原生SQL查询 @Query(value="SELECT * FROM jpa_persons", nativeQuery=true) List<Person> getPersonList();
注意要设置 : nativeQuery=true
3、关于更新
需要注意:
需要 @Modifying 声明
//更新 @Modifying @Query(value="UPDATE Person p SET p.name = :name WHERE p.id = :id") int updatePersonNameById(@Param("id")Integer id, @Param("name")String name);
更新的方法需要添加事务
事务在service层添加
@Service public class PersonService { @Autowired private PersonRepository pRepository; @Transactional public void updateNameById(String name,Integer id){ pRepository.updatePersonNameById(id, name); } }
注意要在配置文件中开启自动扫描包
否则@Service 注解扫描不到
<!-- 配置自动扫描的包 --> <context:component-scan base-package="com.cfb.learn"></context:component-scan>
修改成功
小结归纳:
1.可以通过自定义的JPQL完成 UPDATE 和 DELETE 操作. 注意:JPQL不支持使用INSERT
2.在@Query注解中编写JPQL语句,但必须使用@Modifying注解进行修饰,以通知SpringData这是一个update或delete操作
3.UPDATE 或 DELETE 操作需要使用事务。此时需要在service层的方法上添加事务操作
::默认情况下SpringData的每个操作上有事务,但都是一个只读事务,他们不能完成修改操作
—————————————————————————————————————————————————————————————————————————无论如何,心平气和