转:http://blog.csdn.net/linzhiqiang0316/article/details/52639265

先来介绍一下JPA中一些常用的查询操作:

  1. //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex);
  2. public List<User> findByHeightAndSex(int height,char sex);
  3. // Or --- 等价于 SQL 中的 or 关键字,比如 findByHeightOrSex(int height,char sex);
  4. public List<User> findByHeightOrSex(int height,char sex);
  5. //Between --- 等价于 SQL 中的 between 关键字,比如 findByHeightBetween(int min, int max);
  6. public List<User> findByHeightBetween(int min,int max);
  7. //LessThan --- 等价于 SQL 中的 "<",比如 findByHeightLessThan(int max);
  8. public List<User> findByHeightLessThan(int max);
  9. //GreaterThan --- 等价于 SQL 中的">",比如 findByHeightGreaterThan(int min);
  10. public List<User> findByHeightGreaterThan(int min);
  11. //IsNull --- 等价于 SQL 中的 "is null",比如 findByNameIsNull();
  12. public List<User> findByNameIsNull();
  13. //IsNotNull --- 等价于 SQL 中的 "is not null",比如 findByNameIsNotNull();
  14. public List<User> findByNameIsNotNull();
  15. //NotNull --- 与 IsNotNull 等价;
  16. public List<User> findByNameNotNull();
  17. //Like --- 等价于 SQL 中的 "like",比如 findByNameLike(String name);
  18. public List<User> findByNameLike(String name);
  19. //NotLike --- 等价于 SQL 中的 "not like",比如 findByNameNotLike(String name);
  20. public List<User> findByNameNotLike(String name);
  21. //OrderBy --- 等价于 SQL 中的 "order by",比如 findByNameNotNullOrderByHeightAsc();
  22. public List<User>findByNameNotNullOrderByHeightAsc();
  23. //Not --- 等价于 SQL 中的 "! =",比如 findByNameNot(String name);
  24. public List<User> findByNameNot(String name);
  25. //In --- 等价于 SQL 中的 "in",比如 findByNameIN(String name);
  26. public List<User> findByNameIn(String name);
  27. //NotIn --- 等价于 SQL 中的 "not in",比如 findByNameNotIN(String name);
  28. public List<User> findByNameNotIn(String name);

JPA中的风格就是这样,每个方法其实都是一条SQl命令,通过一些关键字就可以实现SQL中类似于like in等等之类的命令了。

最重要的是我们再开发的过程中,只需要编写dao中一个个方法,不需要我们编写dao的实现类,这样就可以大大的挺高代码的复用率、提高我们的开发效率。

说道这里不免会有人会问,那一些比较复杂的关联查询要怎么实现呢,JPA的处理方法是:利用原生的SQl命令来实现那些复杂的关联查询,下面就来看下案例。

  1. //利用原生的SQL进行查询操作
  2. @Query(value = "select o.* from orders o ,user u where o.uid=u.id and u.name=?1", nativeQuery = true)
  3. @Modifying
  4. public List<Order> findOrderByName(String name);
  5. //利用原生的SQL进行删除操作
  6. @Query(value = "delete from orders where id=?1 ", nativeQuery = true)
  7. @Modifying
  8. public void deleteOrderById(int id);
  9. //利用原生的SQL进行删除操作
  10. @Query(value = "delete from orders where uid=?1 ", nativeQuery = true)
  11. @Modifying
  12. public void deleteOrderByUId(int uid);
  13. //利用原生的SQL进行修改操作
  14. @Query(value = "update orders set name=?1 where id=?2 ", nativeQuery = true)
  15. @Modifying
  16. public void updateOrderName(String name,int id);
  17. //利用原生的SQL进行插入操作
  18. @Query(value = "insert into orders(name,uid) value(?1,?2)", nativeQuery = true)
  19. @Modifying
  20. public void insertOrder(String name,int uid);

上面的案例中给出了,利用JPA实现原生的SQL操作,可以很方便的进行数据库表的操作。
所以如果是那种查询语句不是非常复杂,对查询时间要求不是特别苛刻的项目,完全可以采用JPA来进行项目的开发。

下面接着来介绍JPA是怎么实现分页的效果,其实JPA脱胎于hibernate,所以本身就对分页功能有很好的支持。下面给出具体例子:

  1. //实现分页功能
  2. Page<User> findByNameNot(String name,Pageable pageable);
  1. @RequestMapping(value = "/params", method= RequestMethod.GET)
  2. @ResponseBody
  3. public String getEntryByParams(@RequestParam(value = "name", defaultValue = "林志强") String name, @RequestParam(value = "page", defaultValue = "0") Integer page, @RequestParam(value = "size", defaultValue = "15") Integer size) {
  4. Sort sort = new Sort(Sort.Direction.DESC, "id");
  5. Pageable pageable = new PageRequest(page, size, sort);
  6. Page<User> pages=userDao.findByNameNot(name,pageable);
  7. Iterator<User> it=pages.iterator();
  8. while(it.hasNext()){
  9. System.out.println("value:"+((User)it.next()).getId());
  10. }
  11. return "success...login....";
  12. }

上面的代码一个是在dao层中的,一个是在controller中的。

dao层中添加一个返回值为Page,参数值为Pageable。controller层中通过实例化Pageable这个类,然后调用dao层这个分页方法。

通过这些步骤就可以轻轻松松的实现分页的效果啦,看起来是不是特别方便。

最后在给大家介绍一下JPA是如何实现事务操作的。其实因为SpringBoot中已经对事务做了很好的封装了,使用起来特别方便。下面看一下案例:

  1. @RequestMapping("/saveOrder")
  2. @ResponseBody
  3. @Transactional()
  4. public String saveOrder(){
  5. Order o1=new Order("11",2);
  6. Order o2=new Order("22",2);
  7. Order o3=new Order("33",2);
  8. Order o4=new Order("44",2);
  9. orderDao.save(o1);
  10. orderDao.save(o2);
  11. orderDao.save(o3);
  12. orderDao.save(o4);
  13. return "successfull....saveOrder......";
  14. }

只要在方法的上面加上@Transaction 这个注解就可以轻轻松松的实现事务的操作了,是不是特别方便啊。

不过这里有几点需要注意的是:

1.这个注解实现的事务管理器是默认的,如果不想要默认是事务管理器,可以自己进行添加,我这里就不多介绍了。

2.事务的隔离级别也是可以自己设置的,具体请看这篇博客 点击打开链接

3.事务的传播行为也是可以自己设置的,具体请看这篇博客点击打开链接

jpa 总结的更多相关文章

  1. 快速搭建springmvc+spring data jpa工程

    一.前言 这里简单讲述一下如何快速使用springmvc和spring data jpa搭建后台开发工程,并提供了一个简单的demo作为参考. 二.创建maven工程 http://www.cnblo ...

  2. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  3. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  4. springmvc+jpa实现分页的两种方式

    1.工具类 public final class QueryTool { public static PageRequest buildPageRequest(int pageNumber, int ...

  5. spring boot(五):spring data jpa的使用

    在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spr ...

  6. 转:使用 Spring Data JPA 简化 JPA 开发

    从一个简单的 JPA 示例开始 本文主要讲述 Spring Data JPA,但是为了不至于给 JPA 和 Spring 的初学者造成较大的学习曲线,我们首先从 JPA 开始,简单介绍一个 JPA 示 ...

  7. 一步步学习 Spring Data 系列之JPA(一)

    引入: Spring Data是SpringSource基金会下的一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服 ...

  8. 一步步学习 Spring Data 系列之JPA(二)

    继上一篇文章对Spring Data JPA更深( )一步剖析. 上一篇只是简单的介绍了Spring Data JPA的简单使用,而往往在项目中这一点功能并不能满足我们的需求.这是当然的,在业务中查询 ...

  9. jpa+springmvc+springdata(一)

    学习尚硅谷笔记: 首先配置application.xml: <?xml version="1.0" encoding="UTF-8"?> <b ...

  10. jpa

    学习尚硅谷jpa笔记: 所依赖的jar包: 首先在META-INF下创建配置文件,persistence.xml <?xml version="1.0" encoding=& ...

随机推荐

  1. Go语言——概念

    静态类型.动态类型.潜在类型 静态类型:指在变量声明中示出的那个类型.绝大多数类型都只有静态类型.唯独接口类型的变量例外,他除了拥有静态类型之外,还拥有动态类型. 动态类型:指在运行时与该变量绑定在一 ...

  2. 若干简单的进程和作业调度的C++模拟程序

    进程调度(时间片轮转,动态优先级,链表形式): #include<cstdio> #include<cstdlib> struct PCB { ]; char state; / ...

  3. JNI线程、Linux常用命令、权限、防火墙配置

    JNI_OnLoad: 调用System.loadLibrary()函数时, 内部就会去查找so中的 JNI_OnLoad 函数,如果存在此函数则调用. JNI_OnLoad会: 告诉 VM 此 na ...

  4. APP支付宝登录--PHP处理代码

    1.首先需要参数: aucth_code  udid re_id极光推送id 2.https://open.alipay.com/platform/keyManage.htm 配置公钥私钥 3.需要s ...

  5. 单元测试框架之unittest(六)

    一.摘要 本片博文将介绍unittest框架的一些轻便有效的特性,在我们的测试中经常可以用到 如果有一些测试方法不想执行,如果有些测试方法在某些条件下不执行 该当如何? 如果有些方法未在unittes ...

  6. Web UI开发速速种草—Kendo UI for jQuery网格编辑操作概述

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  7. Mongo Backup

    #!/bin/sh # This script is run on every mongo node. However, it checks to see if this node is the pr ...

  8. easyui-filebox上传图片到阿里

    应用场景:在fixbox图片上传时在预览图片img标签底下点击按钮触发一下函数 参考:https://www.cnblogs.com/awzf/p/9843814.html js //修改该时上传产品 ...

  9. CF662C Binary Table (FWT板题)

    复习了一发FWT,发现还挺简单的... 没时间写了,就放一个博客吧:Great_Influence 的博客 注意这一句ans[i]=∑j⊗k=i​f[j]∗dp[k]ans[i]= ∑_{j⊗k=i} ...

  10. 使用docker配置gitlab服务器

    下载gitlab镜像,导入 [root@gitlab ~]# docker load < gitlab_zh.tar 容器需要22端口,所以修改ssh的默认端口 [root@gitlab ~]# ...