说明:在刚开始结束Spring Boot的时候,会感觉到一种莫名其妙的感觉。为什么我只需要继承Jpa就可以实现Dao层的简单查询?那有哪些是已经实现的?又有哪些是可以通过命名查询的?如果我想自定义查询我应该如何编写呢?下面就是一些常用到的查询方式,可以帮助你一一解决上述问题。
什么是Jpa?
SpringBoot为什么称它为微服务?我感觉就是因为它在项目初始化的时候相对于SSM更加的简介化,不仅仅省略了繁杂的各种XML而且推出更加简洁的yml。第二点就是当下讲的Jpa了。可以直接使用Jpa完成简单的查询,不需要各种映射文件,提高了开发效率。Jpa其实就是一套规范,底层进行了分装(简单的增删查改都已经实现了),供开发者直接调用。
findAll:就是无条件的查询所有列表数据
List orderDetailList = orderDetailRepository.findAll();
save():将数据插入到数据库
orderMasterRepository.save(orderMaster);
saveAndFlush(T):保存与更新。
productCategoryRepository.saveAndFlush(productCategory);
findOne():由于版本的问题,现在这个接口的虽然可以调用,但是无法查询数据,会报错误,现在修改为findById(主键id)。它的主要功能就是根据主键id查询对象信息。
productCategoryRepository.findById(1).get();
deleteById(主键ID):根据主键id删除对象信息。
orderDetailRepository.deleteById("3333");
count():统计对象的记录条数(不怎么常用)
Long l = orderDetailRepository.count();
自定义的简单查询就是根据方法名来自动生成SQL,主要的语法是findByxxx
,readByxxx
,queryByxxx
,getByxxx
后面跟属性名称(实体对对象里面的属性,开头字母大写):同时支持And和or等连接词当做条件的拼接。
查询的数据的方式比较多,可以根据具体语义选择不同的查询。下面演示根据订单id查询数据的所有方法。
orderDetailRepository.findByOrderId("123456");
orderDetailRepository.readByOrderId("123456");
orderDetailRepository.queryByOrderId("123456");
orderDetailRepository.getByOrderId("123456");
连接词的使用。这里是根据订单id或者商品id查找数据
orderDetailRepository.findByOrderIdOrProductId("123456","956434");
坑:在使用默认实现查询的时候有个函数叫 getOne(),这个函数获取到的是代理对象,因此里面可能有一些数据是完全获取不到的,很容易造成空指针异常
分页查询:
页查询在实际使用中非常普遍了,spring data jpa已经帮我们实现了分页的功能,在查询的方法中,需要传入参数Pageable
,当查询中有多个参数的时候Pageable
建议做为最后一个参数传入。
Page findALL(Pageable pageable);
public void testPageQuery() throws Exception {
int page=1,size=10;
Sort sort = new Sort(Direction.DESC, "id");
Pageable pageable = new PageRequest(page, size, sort);
userRepository.findALL(pageable);
userRepository.findByUserName("testName", pageable);
}
自定义SQL查询:
* 在SQL的查询方法上面使用@Query注解,
* 如涉及到删除和修改在需要加上@Modifying.
* 也可以根据需要添加 @Transactional 对事物的支持,查询超时的设置等
@Transactional
@Modifying
@Query("update OrderDetail u set u.productName = ?1 where u.orderId = ?2")
void updateByOrderId(String userName,String OrderId);
@Transactional
@Modifying
@Query("delete from OrderDetail where orderId = ?1")
void deleteByOrderId(String OrderId);
参考文章:https://mp.weixin.qq.com/s?__biz=MzI4NDY5Mjc1Mg==&mid=2247483697&idx=1&sn=4f0f120c9d5f6a880f0a40fb0e8f60b5&chksm=ebf6d94edc8150589a97aad7bc47d0e302a381b6ad56feb0df338095e44a57cd0227a80b8e47&scene=21#wechat_redirect