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

springboot集成jpa的更多相关文章

  1. Spring Data JPA系列2:SpringBoot集成JPA详细教程,快速在项目中熟练使用JPA

    大家好,又见面了. 这是Spring Data JPA系列的第2篇,在上一篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring Data JPA,傻傻分不清楚?给你个 ...

  2. springboot 集成 jpa/hibernate

    pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  3. springboot支付项目之springboot集成jpa

    springboot集成spring-jpa 本文主要内容: 1:spring boot怎么集成spring-jpa以及第一个jpa查询示例 如jpa几个常用注解.lombok注解使用 2:怎么设置i ...

  4. Springboot - 集成 JPA

    1.什么是 JPA? JPA就是Java Persistence API的意思,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 2. JPA 具有什么优 ...

  5. SpringBoot系列:四、SpringBoot集成JPA

    首先要明白的是JPA不是产品,它是一个规范. Jpa (Java Persistence API) 是 Sun 官方提出的 Java 持久化规范.它为 Java 开发人员提供了一种对象/关联映射工具来 ...

  6. springboot集成jpa操作mybatis数据库

    数据库如下 CREATE TABLE `jpa`.`Untitled` ( `cust_id` bigint() NOT NULL AUTO_INCREMENT, `cust_address` var ...

  7. 12 — springboot集成JPA — 更新完毕

    1.什么是jpa? 一堆不想整在这博客里面的理论知识.这些理论玩意儿就应该自行领悟到自己脑海里 1).JPA & Spring Data JPA 1.1).JPA JPA是Java Persi ...

  8. springboot集成jpa,在postgresql数据库中创建主键自增表

    依赖文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...

  9. SpringBoot集成JPA根据实体类自动生成表

    数据库是mysql,在application.properties中的写法如下: 原来配置这样的时候确实可以生产表的 #spring.jpa.hibernate.ddl-auto=update 多方查 ...

随机推荐

  1. Android,资料分享(2015 版)

    Java 学习 我要再次强调,一定要有Java 基础(虽然现在使用其他语言也可以开发Android,但毕竟是很小众),也不要认为学习Java 两三周就可以不用管了,这会在以后的深入学习中暴露出问题,所 ...

  2. Spring MVC的handlermapping之RequestMappingHandlerMapping初始化

    RequestMappingHandlerMapping:这个handlerMapping是基于注解的同样,先上类图: 通过类图可以看到,同样是继承父类 AbstractHandlerMapping来 ...

  3. iOS之SQLite使用详解

    #pragma mark - 1.引入<sqlite3.h>头文件//添加libsqlite3.0.tbd#import <sqlite3.h>static sqlite3 * ...

  4. JavaWeb学习笔记五 会话技术Cookie&Session

    什么是会话技术? 例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识别客户端的状态.会话 ...

  5. 极光征文 | 写写文章就能赢 Filco,岂不美滋滋

    由极光社区举办的第二届征文大赛 --「我和极光的那些事儿」又来啦! 在简书平台发布文章并投稿至「我和极光的那些事」专题,只要参与就能 100% 获得京东购物卡,更有机会赢取象征信仰的 Filco 机械 ...

  6. 结合jenkins在Linux服务器搭建测试环境

    何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...

  7. 201621123050 《Java程序设计》第14周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 答 ...

  8. 201621123040《Java程序设计》第十四周学习总结

    1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 显示所有数据库: show databases; 创建数据库: create database test; 删除数据 ...

  9. Alpha冲刺第十二天

    Alpha冲刺第十二天 站立式会议 项目进展 项目核心功能,如学生基本信息管理模块,学生信用信息模块,奖惩事务管理模块等等都已完成,测试工作大体结束. 问题困难 项目结束后对项目的阶段性总结缺乏一定的 ...

  10. 冲刺NO.10

    Alpha冲刺第十天 站立式会议 项目进展 项目核心功能逐步构建完成,测试工作也已开始.主要对部分功能组合进行测试以测试系统可用性. 问题困难 项目的主要困难在这个时间点主要存在于测试工作中,测试工作 ...