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