zoukankan      html  css  js  c++  java
  • SpringBoot JPA使用

    一、SpringBoot Jpa简介

    Jpa(Java Persistence API)是sun官方提出的java持久化规范。它为java开发人员提供了一种对象/关联映射工具,来管理java应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在hibernate、toplink、jdo等ORM框架各自为营的局面。

    值得注意的是,Jpa是在充分吸收了现有ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。从目前的开发社区的反应上看,Jpa受到了极大的支持和赞扬,其中就包括了spring和EJB的开发团队。

    注意:Jpa 是一套规范,不是一套产品,那么像 Hibernate,TopLink,JDO 他们是一套产品,如果说这些产品实现了这个 Jpa 规范,那么我们就可以叫他们为 Jpa 的实现产品。

    Spring Boot Jpa是Spring基于ORM框架、JPA规范的基础上封装的一套Jpa应用框架,可使开发者用极简的代码即可实现对数据库的访问和操作。它提供了包括增删改查等在内的常用功能,且易于扩展!学习并使用Spring Boot Jpa可以极大提高开发效率。

    二、基本查询

    基本查询也分为两种,一种是 Spring Data 默认已经实现,一种是根据查询的方法来自动解析成 SQL。

    1、预先生成方法

    Spring Boot Jpa默认预先生成了一些基本的CRUD方法。

    (1)继承JpaRepository

    public interface UserRepository extends JpaRepository<User, Long> {
    }

    (2)使用默认方法

    @Test
    public void testBaseQuery() throws Exception {
        User user=new User();
        userRepository.findAll();
        userRepository.findOne(1l);
        userRepository.save(user);
        userRepository.delete(user);
        userRepository.count();
        userRepository.exists(1l);
        // ...
    }

    2、自定义简单查询

    自定义的简单查询就是根据方法名来自动生成 SQL,主要的语法

    是findXXBy,readAXXBy,queryXXBy,countXXBy,getXXBy后面跟属性名称:

    User findByUserName(String userName);

    也使用一些加一些关键字 And、Or

    User findByUserNameOrEmail(String username, String email);

    修改、删除、统计也是类似语法

    Long deleteById(Long id);
    Long countByUserName(String userName);

    基本上 SQL 体系中的关键词都可以使用,例如: like、ignoreCase、OrderBy。

    List<User> findByEmailLike(String email);
    User findByUserNameIgnoreCase(String userName);
    List<User> findByUserNameOrderByEmailDesc(String email);

    3、复杂查询

    在实际的开发中我们需要用到分页、删选、连表等查询的时候就需要特殊的方法或者自定义 SQL

    4、分页查询

    分页查询在实际使用中非常普遍了,Spring Boot Jpa 已经帮我们实现了分页的功能,在查询的方法中,需要传入参Pageable,当查询中有多个参数的时候Pageable建议做为最后一个参数传入。

    Page<User> findALL(Pageable pageable);
    Page<User> findByUserName(String userName,Pageable pageable);

    Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则。

    @Test
    public void testPageQuery() throws Exception {
        int page=1,size=10;
        Sort sort = new Sort(Direction.DESC, "id");
        Pageable pageable = new PageRequest(page, size, sort);
        userRepository.findALL(pageable);
        userRepository.findByUserName("testName", pageable);
    }

    5、限制查询

    有时候我们只需要查询前N个元素,或者支取前一个实体。

    User findFirstByOrderByLastnameAsc();
    User findTopByOrderByAgeDesc();
    Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
    List<User> findFirst10ByLastname(String lastname, Sort sort);
    List<User> findTop10ByLastname(String lastname, Pageable pageable);

    6、自定义sql查询

    其实 Spring Data 觉大部分的 SQL 都可以根据方法名定义的方式来实现,但是由于某些原因我们想使用自定义的 SQL 来查询,Spring Data 也是完美支持的;在 SQL 的查询方法上面使用@Query注解,如涉及到删除和修改在需要加上@Modifying也可以根据需要添加@Transactional对事物的支持,查询超时的设置等。

    @Modifying
    @Query("update User u set u.userName = ?1 where u.id = ?2")
    int modifyByIdAndUserId(String  userName, Long id);
        
    @Transactional
    @Modifying
    @Query("delete from User where id = ?1")
    void deleteByUserId(Long id);
      
    @Transactional(timeout = 10)
    @Query("select u from User u where u.emailAddress = ?1")
    User findByEmailAddress(String emailAddress);

    7、多表查询

    多表查询 Spring Boot Jpa 中有两种实现方式,第一种是利用 Hibernate 的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询后的结果,这里主要第二种方式。

    首先需要定义一个结果集的接口类。

    public interface HotelSummary {
        City getCity();
        String getName();
        Double getAverageRating();
        default Integer getAverageRatingRounded() {
            return getAverageRating() == null ? null : (int) Math.round(getAverageRating());
        }
    }
  • 相关阅读:
    leetcode 48. Rotate Image
    leetcode 203. Remove Linked List Elements 、83. Remove Duplicates from Sorted List 、82. Remove Duplicates from Sorted List II(剑指offer57 删除链表中重复的结点) 、26/80. Remove Duplicates from Sorted ArrayI、II
    leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes
    leetcode 58. Length of Last Word
    安卓操作的一些问题解决
    leetcode 378. Kth Smallest Element in a Sorted Matrix
    android studio Gradle Build速度加快方法
    禁用gridview,listview回弹或下拉悬停
    Android Studio找不到FragmentActivity类
    安卓获取ListView、GridView等滚动的距离(高度)
  • 原文地址:https://www.cnblogs.com/Gazikel/p/14911369.html
Copyright © 2011-2022 走看看