首页 > 代码库 > SpringData学习02

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="http://www.mamicode.com/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的每个操作上有事务,但都是一个只读事务,他们不能完成修改操作

 

—————————————————————————————————————————————————————————————————————————无论如何,心平气和

SpringData学习02