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