欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot学习录(3)- SpringBoot、JPA之强大的JpaRepository

程序员文章站 2022-04-22 08:02:47
...

上一节已经准备好了数据库,建好了实体,现在就来具体操作数据库
SpringBoot JPA异常简单,只需要在dao层建一个接口,再继承JpaRepository就可以快速进行CURD操作了,你只需要声明接口,都不需要写实现,一切都交给SpringBoot来完成,简单到无话可说,直接上例子。

public interface ArticleRepository extends JpaRepository<Article,String> {

     //根据ID查询文章
    public Article getById(String id);

    //根据作者和状态查询文章列表
    public List<Article> findByAuthorAndStatus(String author,int status);

    //分页查询数据文章
    public Page<Article> findByStatus(int status,Pageable pageable);

    //分页搜索,自己写jpql语句
    @Query("select a from Article a where a.title like ?1 or a.content like ?1")
    public Page<Article> search(String keys, Pageable page);

    //原生sql查询
    @Query(value = "select * from article from title =?1 and status=1 order by tm desc ",nativeQuery =true)
    public List<Article> finddata(String title);

    //更新操作,指定参数名
    @Modifying
    @Transactional(readOnly = false)
    @Query("update Article a set a.status = :status ")
    int setStatus(@Param("status") int status);
}

下面是service层调用的代码

@Service
public class ArticleService {
    @Autowired
    private ArticleRepository articleRepository;

    /**
     * 保存文章
     */
    public void saveArticle(){
        Article article=new Article();
        article.setId(UUID.randomUUID().toString());
        article.setTitle("新的文章");
        article.setContent("文章内容,仅做测试!");
        article.setAuthor("佚名");
        article.setTm(new Date());
        article.setSystm(new Date());
        article.setStatus(1);
        articleRepository.save(article);
    }

    /**
     * 根据ID查询文章
     * @param id  文章ID
     * @return
     */
    public Article getById(String id){
        return articleRepository.getById(id);
    }

    /**
     * 查询作者发布的文章
     * @param author    作者
     * @return
     */
    public List<Article> findArticlesByAuthor(String author){
        return articleRepository.findByAuthorAndStatus(author,1);
    }

    /**
     * 列表分页数据查询
     * @param page  页码
     * @param size  数量
     * @return
     */
    public Page<Article> findIndexData(int page,int size){
        Pageable pageable= PageRequest.of(page, size, Sort.by(Sort.Direction.DESC,"tm"));
        Page<Article> pagedata=articleRepository.findByStatus(1,pageable);
        return pagedata;
    }

    /**
     * 根据标题或内容关键字搜索,返回分页数据
     * @param keys     关键字
     * @param page     分页信息
     * @return
     */
    public Page<Article> search(String keys, int page,int size){
        Pageable pageable= PageRequest.of(page, size, Sort.by(Sort.Direction.DESC,"tm"));
        Page<Article> pagedata=articleRepository.search("%"+keys+"%",pageable);
        return pagedata;
    }


}

一切近乎完美,就是这么简单,可以完全不需要写任何sql,不需要写任何实现,仅仅只需要定义一个接口,SpringBoot会自动根据方法名帮你实现。当然你也可以通过@Query注解自定义sql,这个sql是jpql语句,如果是原生sql查询,设置nativeQuery =true即可。修改更新时需要加@Modifying注解
以下是我在Spring Data JPA 文档中找到的命名规则表:

Keyword Sample JPQL snippet
And findByLastnameAndFirstname … where x.lastname = ?1 and x.firstname = ?2
Or findByLastnameOrFirstname … where x.lastname = ?1 or x.firstname = ?2
Is,Equals findByFirstname,findByFirstnameIs,findByFirstnameEquals … where x.firstname = ?1
Between findByStartDateBetween … where x.startDate between ?1 and ?2
LessThan findByAgeLessThan … where x.age < ?1
LessThanEqual findByAgeLessThanEqual … where x.age <= ?1
GreaterThan findByAgeGreaterThan … where x.age > ?1
GreaterThanEqual findByAgeGreaterThanEqual … where x.age >= ?1
After findByStartDateAfter … where x.startDate > ?1
Before findByStartDateBefore … where x.startDate < ?1
IsNull findByAgeIsNull … where x.age is null
IsNotNull,NotNull findByAge(Is)NotNull … where x.age not null
Like findByFirstnameLike … where x.firstname like ?1
NotLike findByFirstnameNotLike … where x.firstname not like ?1
StartingWith findByFirstnameStartingWith … where x.firstname like ?1 (parameter bound with appended %)
EndingWith findByFirstnameEndingWith … where x.firstname like ?1 (parameter bound with prepended %)
Containing findByFirstnameContaining … where x.firstname like ?1 (parameter bound wrapped in %)
OrderBy findByAgeOrderByLastnameDesc … where x.age = ?1 order by x.lastname desc
Not findByLastnameNot … where x.lastname <> ?1
In findByAgeIn(Collection<Age> ages) … where x.age in ?1
NotIn findByAgeNotIn(Collection<Age> age) … where x.age not in ?1
True findByActiveTrue() … where x.active = true
False findByActiveFalse() … where x.active = false
IgnoreCase findByFirstnameIgnoreCase … where UPPER(x.firstame) = UPPER(?1)

@Transactional 事务支持说明

默认情况下,Springboot JPA 实现的方法都是使用事务的。针对查询类型的方法,其等价于 @Transactional(readOnly=true);增删改类型的方法,等价于 @Transactional。可以看出,除了将查询的方法设为只读事务外,其他事务属性均采用默认值。
如果用户觉得有必要,可以在接口方法上使用 @Transactional 显式指定事务属性,该值覆盖 Springboot JPA 提供的默认值。同时,开发者也可以在业务层方法上使用 @Transactional 指定事务属性,这主要针对一个业务层方法多次调用持久层方法的情况。持久层的事务会根据设置的事务传播行为来决定是挂起业务层事务还是加入业务层的事务。

转载于:https://www.jianshu.com/p/cb97e4a10dc2