目录

  • 目录

    • Spring Data JPA简介
    • 与mybatis对比
    • 入手使用
      • (一)引入依赖
      • (二)添加配置文件:
      • (四)实体类
      • (五)Repository:
      • (六)使用:
    • 自定义简单查询
    • 复杂查询
      • (一)分页
      • (二)限制查询
      • (三)自定义SQL
      • (四)多表查询

Spring Data JPA简介

JPA(Java Persistence API)是 Sun 官方提出的 Java 持久化规范。它为 Java 开发人员提供了一种对象/关联映射工具来管理 Java 应用中的关系数据。它的出现主要是为了简化现有的持久化开发工作和整合 ORM 技术,结束现在 Hibernate、TopLink、JDO 等 ORM 框架各自为营的局面。值得注意的是,JPA 是在充分吸收了现有 Hibernate、TopLink、JDO 等 ORM 框架的基础上发展而来的,具有易于使用、伸缩性强等优点。

注意:JPA 是一套规范,不是一套产品,那么像 Hibernate、TopLink、JDO 它们是一套产品,如果说这些产品实现了这个 JPA 规范,那么就可以叫它们为 JPA 的实现产品。

与mybatis对比

  • jpa是对象与对象之间的映射,而mybatis是对象和结果集的映射。
  • jpa移植性比较好,不用关心用什么数据库,因为mybatis自由写sql语句,所以当项目移植的时候还需要改sql。
  • 修改字段时JPA更简单,mybatis需要修改一堆的xml,mapper等文件很麻烦。
  • mybatis自定义sql,比较灵活,也可以写复杂的sql,JPA只适合简单的单表sql

    总结:mybatis和JPA各有优势,如果sql简单,则jpa使用效率更高,如果sql较复杂,需要自定义,则使用mybatis更加顺手。

入手使用

(一)引入依赖

<dependency><groupId>org.Springframework.boot</groupId><artifactId>Spring-boot-starter-data-jpa</artifactId>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>

(二)添加配置文件:

spring:profiles:active: devdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/soilusername: lxtestpassword: adminjpa:hibernate:ddl-auto: updateshow-sql: true

注意: 我是用的是yml的语法,注意空格的长度,show-sql是在jpa下面的,不是hibernate.show-sql>
重点关注下ddl-auto这个配置项:

create:每次加载 hibernate 时都会删除上一次的生成的表,然后根据 model 类再重新来生成新表,哪怕两次没有任何改变也要这样执行,这就是导致数据库表数据丢失的一个重要原因。
create-drop:每次加载 hibernate 时根据 model 类生成表,但是 sessionFactory 一关闭,表就自动删除。
update:最常用的属性,第一次加载 hibernate 时根据 model 类会自动建立起表的结构(前提是先建立好数据库),以后加载 hibernate 时根据 model 类自动更新表结构,即使表结构改变了,但表中的行仍然存在,不会删除以前的行。要注意的是当部署到服务器后,表结构是不会被马上建立起来的,是要等应用第一次运行起来后才会。
validate:每次加载 hibernate 时,验证创建数据库表结构,只会和数据库中的表进行比较,不会创建新表,但是会插入新值。

  • show-sql:是否打印出自动生产的 SQL,方便调试的时候查看。

(四)实体类

@Entity
@Data
public class User {@Id@GeneratedValueprivate Integer id;private String name;private String pwd;private Integer age;public User(){}}

(五)Repository:

public interface UserRepository extends JpaRepository<User,Integer>{}

(六)使用:

 @GetMapping(value = "/users",  produces = { "application/json;charset=UTF-8" })public List<User> userList(){return  userRepository.findAll();}

自定义简单查询

Spring Data Jpa有个很赞的功能就是可以自动根据方法名去生成相应的简单sql,具体的方法名和sql如下:
例如:

User findByUserNameOrEmail(String username, String email);Long countByUserName(String userName);Long deleteById(Long id);//获得符合查询条件的前10条数据
List<Person> findFirst10ByName(String name);
//获取符合查询条件的前30条数据
List<Person> findTop30ByName(String name); 

具体的方法名和语句如下:

关键字 方法命名 sql where字句
And findByNameAndPwd where name= ? and pwd =?
Or findByNameOrSex where name= ? or sex=?
Is,Equals findById,findByIdEquals where id= ?
Between findByIdBetween where id between ? and ?
LessThan findByIdLessThan where id < ?
LessThanEquals findByIdLessThanEquals where id <= ?
GreaterThan findByIdGreaterThan where id > ?
GreaterThanEquals findByIdGreaterThanEquals where id > = ?
After findByIdAfter where id > ?
Before findByIdBefore where id < ?
IsNull findByNameIsNull where name is null
isNotNull,NotNull findByNameNotNull where id= ?
Like findByNameLike where name like ?
NotLike findByNameNotLike where name not like ?
StartingWith findByNameStartingWith where name like ‘?%’
EndingWith findByNameEndingWith where name like ‘%?’
Containing findByNameContaining where name like ‘%?%’
OrderBy findByIdOrderByXDesc where id=? order by x desc
Not findByNameNot where name <> ?
In findByIdIn(Collection c) where id in (?)
NotIn findByIdNotIn(Collection c) where id not in (?)
True findByAaaTue where aaa = true
False findByAaaFalse where aaa = false
IgnoreCase findByNameIgnoreCase where id= ?

复杂查询

(一)分页

@Query("select u from User u")
Page<User> findALL(Pageable pageable);
Page<User> findByNickName(String nickName, Pageable pageable);

Pageable 是 Spring 封装的分页实现类,使用的时候需要传入页数、每页条数和排序规则。

@Test
public void testPageQuery(){int page=1,size=10;Sort sort = new Sort(Direction.DESC, "id");Pageable pageable = new PageRequest(page, size, sort);userRepository.findALL(pageable);userRepository.findByNickName("testName", pageable);
}

(二)限制查询

User findFirstByOrderByLastnameAsc();
User findTopByOrderByAgeDesc();
Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);
List<User> findFirst10ByLastname(String lastname, Sort sort);
List<User> findTop10ByLastname(String lastname, Pageable pageable);

(三)自定义SQL

在 SQL 的查询方法上面使用 @Query 注解,如涉及到删除和修改需要加上 @Modifying,也可以根据需要添加 @Transactional 对事物的支持,查询超时的设置等。

@Transactional(timeout = 15)
@Modifying
@Query("update User set name= ?1 where id = ?2")
int modifyById(String  name, Long id);@Transactional
@Modifying
@Query("delete from User where id = ?1")
void deleteById(Long id);@Query("select u from User u where u.pwd= ?1")
User findByPwd(String pwd);

(四)多表查询

再新建一个用户详情的实体类:

@Data
@Entity
public class UserInfo {@Id@GeneratedValueprivate Integer id;private Integer userId;private String address;private String tel;}

再新建一个接口,用于接受连表查询结果。

/*** @author : Aslan* @version : v1.0* @time : 2018-06-26 14:11* @desc : 定义一个结果集的接口类,接口类的内容来自于用户表和用户详情表,用于接收连表查询后的结果*/
public interface UserDetail {String getTel();String getAddress();String getName();
}

新建一个Repository,也就是类似于DAO。

public interface UserInfoRepository extends JpaRepository<UserInfo,Integer> {/*** 特别注意这里的 SQL 是 HQL,需要写类的名和属性,不是数据库里面的字段名,若写错则会报错:** 传入电话,查找用户信息* @param tel* @return*/@Query("select u.name,d.address,d.tel  from User u , UserInfo d " +"where u.id = d.userId  and  d.tel = ?1 ")List<UserDetail> findUserInfo(String tel);
}

使用:

  @GetMapping(value = "/testUserInfo")public void testUserInfo(){List<UserDetail> userDetails = userInfoRepository.findUserInfo("111");for(UserDetail detail:  userDetails){System.out.println("name = "+detail.getName());}}

Spring Boot 学习总结之JPA【分页+自定义SQL+多表查询】相关推荐

  1. Spring Boot 学习系列(08)—自定义servlet、filter及listener

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...

  2. Spring Boot 学习系列(05)—自定义视图解析规则

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 自定义视图解析 在默认情况下Spring Boot 的MVC框架使用的视图解析ViewResolver类是C ...

  3. Spring Boot 学习系列(09)—自定义Bean的顺序加载

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Bean 的顺序加载 有些场景中,我们希望编写的Bean能够按照指定的顺序进行加载.比如,有UserServ ...

  4. spring boot学习(5): 进程exit code自定义

    在线上环境中,应用可能因为一些异常而终止,我们如果需要及时找到原因,根据 exit code 来定位,是个很好的途径. spring boot 为开发者提供了相关的接口,方便开发者通过异常类型来定义自 ...

  5. Spring Boot学习笔记-实践建言

    2019独角兽企业重金招聘Python工程师标准>>> 本文延续<Spring Boot学习笔记-快速示例>,从开发指南中摘出一些实践经验可供参考.这也是笔者看到的眼前一 ...

  6. Spring Boot学习笔记-基础(2)

    Spring Boot学习笔记-基础(2) Spring Boot 优点: – 快速创建独立运行的Spring项目以及与主流框架集成 – 使用嵌入式的Servlet容器,应用无需打成WAR包 – st ...

  7. Spring Boot学习笔记(1)

    文章目录 Spring Boot学习笔记(1) Spring Boot 整合 JSP Spring Boot HTML Thymeleaf 常用语法 Spring Boot 数据校验 Spring B ...

  8. 2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)

    作者:bug菌 博客:CSDN.掘金.infoQ.51CTO等 简介:CSDN/阿里云/华为云/51CTO博客专家,博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金/ ...

  9. Spring Boot学习笔记-进阶(3)

    文章目录 Spring Boot学习笔记-进阶(3) 一.Spring Boot与缓存 二.Spring Boot与消息 三.Spring Boot与检索 四.Spring Boot与任务 异步任务 ...

最新文章

  1. SM$TS_USED,SM$TS_FREE,SM$TS_AVAIL
  2. OO第一单元总结博客
  3. 《赛博朋克 2077》与《对马岛之魂》的「不自由感」究竟从何而来?
  4. Java中的事务——全局事务与本地事务
  5. java私有变量和_java – 大内部类和私有变量
  6. python 梯度提升树_机器学习:梯度提升算法|python与r语言代码实现
  7. 自考计算机非笔试英语怎么考,自考中的非笔试课程是什么,怎么进行考核?
  8. ubuntu HackRF One相关环境搭建
  9. STM32 F4 General-purpose Timers for Periodic Interrupts
  10. GARFIELD@02-13-2005
  11. unlock-music-desktop解锁加密音乐桌面版
  12. geotools中等值面的生成与OL3中的展示
  13. 开学季好物怎么选,学生党必备的几款好物分享
  14. 《C++程序设计》第十章总结
  15. 医学图像处理涉及到的窗宽窗位 1
  16. 高质量的外链怎么去挖掘?
  17. 【行为分析】(二)前端埋点实现及原理分析
  18. php属于c,c语言属于哪个?php还是java?
  19. android 短信迁移到iphone,将安卓手机上的短信导入到iphone上的方法
  20. 如何写好新基建概念介绍总结PPT?

热门文章

  1. ElementUI组件中el-upload上传图片不显示问题
  2. 疯狂的折叠屏!不买折叠手机的 5 个理由
  3. PaddlePaddle学习笔记1
  4. H.266/VVC SCC技术学习:帧内块拷贝(Intra block copy, IBC)
  5. python日期格式统一化: 各种日期时间格式处理为标准统一日期时间格式
  6. 聚苯乙烯泡沫(XPS)EN 13164建筑用隔热产品--CE认证
  7. pl-------------linux执行.pl文件
  8. mysql truncate 授权_MySQL_TRUNCATE
  9. Derek Sivers:别像头驴(译)
  10. ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室(十四)之漏掉的客服消息