springboot集成jpa


spring data jpa簡介

spring data jpa是spring基於hibernate及jpa規范封裝出來的一套持久層框架。該框架極大的降低了開發者工作量,提升開發效率。提供的關鍵字可以在不編寫sql的情況下滿足大部分需求。

 

1.集成spring data jpa,增加maven依賴

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.7</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

 

2.配置數據源,application.properties文件添加配置信息

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.15.129:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

spring.jpa.properties.hibernate.hbm2ddl.auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.show-sql=true

 

3.增加pojo數據表映射類(部分代碼)

@Entity
@Table(name="orders")
public class Order {
    @Id
    @GeneratedValue
    private Integer id;
    @Column(nullable = false, unique = true)
    private String orderNo;
    @Column(nullable = false)
    private String orderName;
    @Column(nullable = false)
    private BigDecimal amount;
    @Column(nullable = false)
    private Date addTime;
}

 

4.增加數據持久層操作方法

public interface OrderRepository extends JpaRepository<Order, Integer>{
    @Transactional
    @Modifying
    @Query("update orders o set o.orderName = ?1 where o.id = ?2")
    int modifyOrder(String orderName, Integer id);
    
    Order findByOrderNo(String orderNo);
    
    List<Order> findByOrderNameStartingWith(String orderName);
    
    List<Order> findByAmountAndOrderName(BigDecimal amount, String orderName);
    
    Page<Order> findByAmount(BigDecimal amount, Pageable page);
}

 

5.增加TestCase,通過Junit測試

@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderRepositoryTests {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    
    @Autowired
    private OrderRepository orderRps;
    
    @Test
    public void base_add(){
        //測試jpa默認封裝insert方法
        Order order = orderRps.saveAndFlush(
                new Order(String.valueOf(System.currentTimeMillis()), "訂單名稱", new BigDecimal(100)));
        Assert.assertNotNull(order);
        Assert.assertNotNull(order.getId());
    }
    
    @Test
    public void base_delete(){
        //測試jpa默認封裝delete方法
        //為保證此案例執行時有數據,增加校驗邏輯
        List<Order> list = orderRps.findAll();
        if(CollectionUtils.isEmpty(list)){
            base_add();
            base_delete();
            return;
        }
        
        //獲取列表中第一個訂單
        Order order = list.get(0);
        orderRps.delete(order);
        
        //刪除成功后,再次查詢
        order = orderRps.findOne(order.getId());
        Assert.assertNull(order);
    }
    
    @Test
    public void base_getAll(){
        //測試jpa默認封裝select方法
        List<Order> list = orderRps.findAll();
        logger.info(list.toString());
        Assert.assertNotNull(list);
    }
    
    @Test
    public void zdy_update(){
        //測試自定義update方法
        //為保證此案例執行時有數據,增加校驗邏輯
        List<Order> list = orderRps.findAll();
        if(CollectionUtils.isEmpty(list)){
            base_add();
            zdy_update();
            return;
        }
        
        //獲取列表中第一個訂單
        Order order = list.get(0);
        
        //修改訂單名稱
        String orderName = "訂單"+System.currentTimeMillis();
        int count = orderRps.modifyOrder(orderName, order.getId());
        
        //驗證修改結果
        Assert.assertEquals(count, 1);
        
        //修改成功后,再次查詢訂單信息
        order = orderRps.findOne(order.getId());
        Assert.assertEquals(orderName, order.getOrderName());
    }
    
    @Test
    public void zdy_query1(){
        //測試自定義select方法(jpa自動增加查詢條件)
        //為保證此案例執行時有數據,增加校驗邏輯
        List<Order> list = orderRps.findAll();
        if(CollectionUtils.isEmpty(list)){
            base_add();
            zdy_query1();
            return;
        }
        
        Order order = orderRps.findByOrderNo(list.get(0).getOrderNo());
        logger.info(order.toString());
        Assert.assertNotNull(order);
    }
    
    @Test
    public void zdy_query2(){
        //測試自定義select方法(jpa自動增加like條件)
        List<Order> list = orderRps.findByOrderNameStartingWith("訂單");
        logger.info(list.toString());
        Assert.assertNotNull(list);
    }
    
    @Test
    public void zdy_query3(){
        //測試自定義select方法(jpa自動增加多個查詢條件)
        List<Order> list = orderRps.findByAmountAndOrderName(new BigDecimal(100), "訂單名稱");
        logger.info(list.toString());
        Assert.assertNotNull(list);
    }
    
    @Test
    public void zdy_query4(){
        //測試自定義select方法(jpa支持分頁查詢)
        int page = 1;//第幾頁(分頁從0開始)
        int size = 10;//每頁返回條數
        Sort sort = new Sort(Direction.DESC, "addTime");
        Pageable pg = new PageRequest(page, size, sort);
        Page<Order> list = orderRps.findByAmount(new BigDecimal(100), pg);
        logger.info(ToStringBuilder.reflectionToString(list));
        Assert.assertNotNull(list);
    }
}

 

6.spring data jpa日常操作

6.1)基礎方法

基礎方法操作簡單,但只能滿足小部分需求。

通過JpaRepository繼承下來的基礎方法有:

增:save、saveAndFlush

刪:delete、deleteAll、deleteInBatch

改:無

查:findOne、findAll、getOne

 

 6.2)自定義查詢

spring data jpa提供了一套sql增強規范,可通過約定好的關鍵字實現多條件查詢、過濾。

使用關鍵字后可以通過后台日志查看增強的sql語句。

 

6.3)復合查詢(多表聯查)

本篇spring data jpa內核是基於hibernate5.0版本實現。

如需實現一對一、一對多、多對多請參考hibernate5.0注解版。

 

 

源代碼:https://gitee.com/skychenjiajun/spring-boot

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM