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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏名山丶深处

springboot集成jpa

2105
来自专栏13blog.site

Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

前言 前一篇文章《Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试》讲了不为和不能两个状态,针对不为,只能自己调整心态了,...

2795
来自专栏软件开发

MyBatis学习总结(一)——ORM概要与MyBatis快速起步

程序员应该将核心关注点放在业务上,而不应该将时间过多的浪费在CRUD中,多数的ORM框架都把增加、修改与删除做得非常不错了,然后数据库中查询无疑是使用频次最高、...

541
来自专栏.NET后端开发

ADO.NET入门教程(七) 谈谈Command对象高级应用

摘要 在上一篇文章《你必须知道的ADO.NET(六) 谈谈Command对象与数据检索》中,我详细讲解了Command对象的基础知识以及基本用法。作为ADO.N...

3768
来自专栏郭霖

Android Volley完全解析(三),定制自己的Request

经过前面两篇文章的学习,我们已经掌握了Volley各种Request的使用方法,包括StringRequest、JsonRequest、ImageRequest...

1946
来自专栏从零开始学自动化测试

Selenium2+python自动化67-用例失败自动截图

前言: 装饰器其实就是一个以函数作为参数并返回一个替换函数的可执行函数 上一篇讲到用装饰器解决异常后自动截图,不过并没有与unittest结合,这篇把截图的装...

2573
来自专栏逆向技术

框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解)

           框架原理第二讲,RTTI,运行时类型识别.(以MFC框架讲解) 一丶什么是RTTI,以及RTTI怎么设计 通过第一讲,我们知道了怎么样升成...

19010
来自专栏java达人

Spring声明式事务的一个注意点及原理简析

以前我们说过,Spring通过ThreadLocal机制解除了事务管理模块与数据访问层的紧密耦合,提高了模块的可重用性,也保证了多线程环境下的对connecti...

2066
来自专栏xingoo, 一个梦想做发明家的程序员

JSP 内置对象

  本篇继前两篇内置对象,继续记录JSP中的其他的内置对象:application,page,pageContext,config,exception   ap...

1827
来自专栏difcareer的技术笔记

JNI实现源码分析【四 函数调用】正文0x01:dvmCallMethodV0x02:nativeFunc0x03: 何时赋值

有了前面的铺垫,终于可以说说虚拟机是如何调用JNI方法的了。JNI方法,对应Java中的native方法,所以我们跟踪对Native方法的处理即可。

684

扫码关注云+社区