zoukankan      html  css  js  c++  java
  • spring data jap的使用 1

    最近一直在研究Spring Boot,今天为大家介绍下Spring Data JPA在Spring Boot中的应用,如有错误,欢迎大家指正

    先解释下什么是JPA

    JPA就是一个基于O/R映射的标准规范(即实体类和数据库中的表的一种对映)

    Spring Data JPA是Spring Data 中的一个子项目,除了它还有Spring Data MongoDB等等(刚好最近项目中使用到了,下次可以做个介绍)

    在Spring Boot中使用Spring Data JPA非常方便,只需要三步,

    1.在maven中添加spring-boot-stater-data-jpa.如下图:

    2.在application.properties属性文件中定义好Datasuorce,如下图:

    3.创建与数据库中的表对映的实体类和数据访问层(JpaRepository)

    一,定义数据库访问层

    使用Spring Data JPA建立数据库十分简单,只需要定义一个继承了JpaRepository的接口,如下:

    public interface PersonRepository extends JpaRepository<Person, Integer> {}

    继承了JpaRepository就相当于有了下面的数据访问操作方法,

    复制代码
    @NoRepositoryBean
    public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
        List<T> findAll();
    
        List<T> findAll(Sort var1);
    
        List<T> findAll(Iterable<ID> var1);
    
        <S extends T> List<S> save(Iterable<S> var1);
    
        void flush();
    
        <S extends T> S saveAndFlush(S var1);
    
        void deleteInBatch(Iterable<T> var1);
    
        void deleteAllInBatch();
    
        T getOne(ID var1);
    }
    复制代码

     二.JPA的查询方法

    在JPA中有三种方式可以进行数据的查询(1,方法命名查询 2,@NamedQuery查询 3,@Query查询),

    假设有一张表叫PERSON,字段:ID(INT),NAME(VARCHAR),AGE(INT),ADDRESS(VARCHAR).

    实体类:id(integer),name(String),age(integer),address(String)

    先来介绍第一种:方法命名查询

    1. Spring Data JPA支持通过定义在Repository接口的方法来定义查询,方法名字是根据实体类的属性名来确定的,示例如下:

    复制代码
    public interface PersonRepository extends Repository<Person, Integer> {
           /*
        * 通过地址进行查询,参数为address,
        * 相当于JPQL:select p from Person p where p.address=?1
        * */
        List<Person> findByAddress(String address);
           /*
        * 通过地址和名字进行查询,参数为name,address
        * 相当于JPQL:select p from Person p where p.name=?1 and address=?2
        * */
        Person findByNameAndAddress(String name,String address);
       
    }
    复制代码

       从代码可以看出,使用findBy,And这样的关键字,其中的findBy可以用find,getBy,query,read来进行代替。

       而And就相当于sql语句中的and。

    2.用关键字限制结果数量,用top和first来实现,示例如下:

    /*
    *查询符合条件的前十条记录
    */
    List<Person> findFirst10ByName(String name)
    /*
    *查询符合条件的前30条记录
    */
    List<Person> findTop30ByName(String name);

    第二种:@NamedQuery查询

     Spring Data JPA 支持@NameQuery来定义查询方法,即一个名称映射一个查询语句(要在实体类上写,不是接口里写),示例如下:

    @Entity
    @NamedQuery(name="Person.findByName",
    query="select p from Person p where p.name=?1")
    public class Person{
    
    }

    这样子就重新定义了findByName这个方法了。

    如果要将多个方法都进行重新定义,可以使用@NameQueries标签,示例如下:

    复制代码
    @Entity
    @NamedQueries({
    @NamedQuery(name="Person.findByName",
    query="select p from Person p where p.name=?1"),
    @NamedQuery(name = "Person.withNameAndAddressNamedQuery",
    query = "select p from Person p where p.name=?1 and address=?2")
    })
    public class Person{
    
    }
    复制代码

    这个时候,接口里定义的findByName方法就是上面的方法了,不再是方法命名查询的方法了。

    第三种:@Query查询

     Spring Data JPA 支持@Query来定义查询方法,使用方法是将@Query写在接口的方法上面,示例如下:

    public interface PersonRepository extends Repository<Person, Integer> {
         @Query("select p from Person p where p.name=?1 and p.address=?2")
        Person withNameAndAddressQuery(String name,String address);
       
    }

    这里的参数是根据索引号来进行查询的。

    当然我们也是可以根据名称来进行匹配,然后进行查询的,示例如下:

    public interface PersonRepository extends Repository<Person, Integer> {   
    @Query("select p from Person p where p.name= :name and p.address= :address")
    Person withNameAndAddressQuery(@Param("name")String name,@Param("address")String address);
    }

    讲完查询,我们再来看看更新是如何写的。

    Spring Data JPA支持使用@Modifying和@Query注解组合来进行更新查询,示例如下:

    public interface PersonRepository extends Repository<Person, Integer> {
    @Modifying
    @Transcational
    @Query("update Person p set p.name=?1 ")
    int setName(String name);
    }
  • 相关阅读:
    springcloud-Ribbon之手写轮询算法
    springcloud-Ribbon负载均衡规则的替换
    git本地库和远程库的连接和断开
    本地项目第一次提交到码云或github
    python基础语法练习
    Xss-labs-level11-15
    Vulnhub-靶机-ESCALATE_LINUX: 1
    Xss-labs-level7-10
    Vulnhub-靶机-DC: 6
    Jenkins入门之执行Powershell脚本
  • 原文地址:https://www.cnblogs.com/cl-rr/p/9968051.html
Copyright © 2011-2022 走看看