• 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

  • 相关阅读:
    数学(动态规划,GCD):COGS 469. [NOI2010]能量采集
    网络流(二分):BZOJ 3993: [SDOI2015]星际战争
    分治(CDQ):[BOI2007]摩基亚Mokia
    树状数组(二维):COGS 1532 [IOI2001]移动电话
    斜率优化(CDQ分治,Splay平衡树):BZOJ 1492: [NOI2007]货币兑换Cash
    树形结构的维护:BZOJ 3991: [SDOI2015]寻宝游戏
    贪心 uvaoj 11134 Fabled Rooks
    动态规划(模型转换):uvaoj 1625 Color Length
    贪心 BZOJ 3671:[Noi2014]随机数生成器
    字符串(后缀数组):POJ 3415 Common Substrings
  • 原文地址:https://www.cnblogs.com/skychenjiajun/p/8583864.html
Copyright © 2020-2023  润新知