zoukankan      html  css  js  c++  java
  • Spring Data Jpa 使用方法 轻松做数据持久化

    Spring data jpa 不管是搭建环境还是书写代码可以说都简单到爆了。这正是Spring 框架广受java从业者喜欢的因素,简单优雅高效。我们可以先搭建一个Spring MVC项目,或者更简单的,可以快速生成一个Spring Boot项目。另外需要知道Spring data jpa只是对JPA的实现产品进行了一个封装,它并不具备操作数据库的详细code,所以一般是和一个实现JPA接口的产品一起使用的,比如hibernate-jpa。

    如果是Spring MVC项目,那么请加入下面依赖,版本自己选择:

    <dependency>
        <groupId>org.hibernate.javax.persistence</groupId>
        <artifactId>hibernate-jpa-2.1-api</artifactId>
        <version>1.0.2.Final</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>2.1.5.RELEASE</version>
    </dependency>

    如果是Spring Boot项目,非常简单,加入这个(默认包括了hibernate依赖):

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
        <version>2.1.3.RELEASE</version>
    </dependency>

    好了,工具就绪了,开干。

    新建一个BaseRepository接口,有点类似BaseDao,但这个接口我们不需要做任何事情,尽尽方便其他Repository继承。

    @NoRepositoryBean
    public interface BaseRepository<T, ID> extends JpaRepository<T, ID> {
    }

    简单吧,为什么要把这个抽出来而不是直接继承JpaRepository接口呢,原因是有可能我们还要继承更多的JPA接口,比如JpaSpecificationExecutor等,这些不同的接口里面有不同的方法,看你个人需要。但是作为其他的Repository,就只需要继承这个BaseRepository。@NoRepositoryBean注解的效果就是让Spring不要扫荡这个BaseRepository,因为它没有任何实体类的持久化操作。

    接下来,写个具体的Repository,BaseRepository的第一个类型参数是需要持久化的实体,第二个类型参数是ID的类型:

    public interface MessageRepository extends BaseRepository<Message, Long> {
    }

    不需要加任何注解它就能被Spring扫荡到,因为Spring会默认扫荡所有继承JpaRepository的接口,并未他们添加实现。我们只需要定义一些方法,然后再上面加@Query注解。甚至可以任何方法都不加,因为JpaRepository里面已经具备了增删改查的所有接口了。

    @Query("select m from Message m where m.subject = ?1")
    List<Message> findBySubject(String subject);

    这就是一个加@Query的示例,这个注解里面用的是JQL语法,和SQL很相似,非常简单,并且也足以支撑百分之九十业务需要。另外,Spring data jpa还提供了更为简单的方法名查询,比如:

    List<Message> findMessageBySubject(String subject);

    它会默认去找Message表的subject字段,方法名查询的规则可以去翻阅Spring data jpa文档。

    如果需要做更新的话,需要加上@Modifying注解,表示这是一个增删改操作。

    好了,repository这里面就几乎结束啦,和JAP的初次会面也结束咯。是不是很简单!接下来你只需要在Dao里面或者Service里面加入下面这个注入,就能操作数据库啦:

    @Autowired
    private MessageRepository messageRepository;

    有这些方法供你玩:

    List<T> findAll(); //查所有
    
    List<T> findAll(Sort var1);
    
    List<T> findAllById(Iterable<ID> var1);
    
    <S extends T> List<S> saveAll(Iterable<S> var1); //批量插入
    
    void flush();
    
    <S extends T> S saveAndFlush(S var1); //添加或更新(ID为空,添加,ID不为空,更新)
    
    void deleteInBatch(Iterable<T> var1);
    
    void deleteAllInBatch();
    
    T getOne(ID var1); //查单个
    
    <S extends T> List<S> findAll(Example<S> var1);
    
    <S extends T> List<S> findAll(Example<S> var1, Sort var2);

    自己慢慢研究下吧!

  • 相关阅读:
    C协程使用举例
    教你理解复杂的CC++声明(转)
    C语言学习趣事_关于指针转换
    Howard's Startup Game @meditic » 降级论
    认识C++语言关键字和语法extern和双冒号
    Linux操作系统的种种集成开发环境
    新建Android项目时使用project from existing source导入已经存在的项目报 AndroidManifest.xml file missing错误解决方案
    JAVA中IP和整数相互转化
    自定义Struts2实现
    Web编程所需的必要知识、环境工具相关
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407181.html
Copyright © 2011-2022 走看看