写点什么

【原创】Spring Boot 集成 Spring Data JPA 的玩法

用户头像
田维常
关注
发布于: 2020 年 11 月 04 日

关注公众号Java 后端技术全栈”**


回复“面试”获取全套大厂面试资料


通过本文你可以收获:


  1. 什么是 JPA?

  2. 认识 Spring data JPA

  3. 快速搞定 Spring boot 集成 Spring data JPA

  4. Spring data JPA 高级用法入门


什么是 JPA


JPA 是 Java Persistence API 的简称


目前市面上比较流行的 ORM 框架有 Mybatis、Hibernate、SpringJDBC 等。


在没有 JPA 规范之前,由于没有官方的标准,使得每个 ORM 框架之间的 API 差距都蛮大的,只要使用了一种 ORM 框架后系统会严重受限于该 ORM 框架的标准。


基于上这些原因,Sun 引入新的 JPA ORM,主要原因有两点:


  1. 简化现有 Java EE 应用开发工作

  2. Sun 希望整合 ORM 技术,实现统一的 API 调用接口


JPA 由 EJB 3.0 软件专家组开发,作为 JSR-220 实现的一部分。但它又不限于 EJB 3.0,你可以在 Web 应用、甚至桌面应用中使用。JPA 的宗旨是为 POJO 提供持久化标准规范,由此可见,经过这几年的实践探索,能够脱离容器独立运行,方便开发和测试的理念已经深入人心了。Hibernate3.2+、TopLink 10.1.3 以及 OpenJPA 都提供了 JPA 的实现。


JPA 是一套规范,不是产品。那么像 Hibernate、TopLink、JDO 他是一套产品。如果某产品实现了这个 JPA 规范,我们就称之为 JPA 的实现产品。


总的来说 jap 包含三个方面的技术:


  • ORM 映射元数据,支持 xml 和注解两种元数据的形式,元数据描述对象和表之间的映射关系。

  • API,操作实体对象来执行增删改查操作(CRUD)

  • 查询语言,通过面向对象非面向数据库的查询语言(JPQL)查询数据,避免程序的 SQL 语句紧密耦合。


以下是 JPA 的架构图



Spring data JPA 入场


Spring data JPA  是 spring 家族下的 Spring data 下面的一个子项目。


官网地址:


https://spring.io/projects/sp...



Spring data JPA  是 Spring 基于 ORM 框架、JPA 规范的基础之上封装的一套 JPA 应用框架,可以让使用者(程序员)用最简单的代码即可实现对象数据的 CRUD 操作,上手容易,能提高开发效率。其实说白了 Spring 就是基于 Hibernate 之上构建的 JPA 使用解决方案,方便于大家在 Spring Boot 项目中的使用 JPA 技术。


快速上手 Spring data jpa


首先是快速建一个 Spring Boot 项目。


参考:如何快速构建Spring Boot基础项目?


添加依赖


<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency>
复制代码


添加相关配置项


#mysql配置spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/my_jpa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=falsespring.datasource.username=rootspring.datasource.password=lwt123456@spring.jpa.properties.hibernate.hbm2ddl.auto=update#展示sql(调试或者排查问题时候很有用)spring.jpa.show-sql=truespring.jpa.properties.hibernate.format_sql=true
复制代码


配置项简单说明


spring.data 配置的是数据库相关信息


spring.jpa.properties.hibernate.hbm2ddl.auto=update
复制代码


  • create:每次运行程序时,都会重新创建表,故而数据会丢失

  • create-drop:每次运行程序时会先创建表结构,然后待程序结束时清空表

  • upadte:每次运行程序,没有表时会创建表,如果对象发生改变会更新表结构,原有数据不会清空,只会更新(推荐使用)

  • validate:运行程序会校验数据与数据库的字段类型是否相同,字段不同会报错

  • none: 禁用 DDL 处理


建表语句


CREATE TABLE `tuser` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(32) DEFAULT NULL,`password` varchar(16) DEFAULT NULL,`phone` varchar(11) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
复制代码


初始化一条数据


INSERT INTO `my_jpa`.`tuser`( `name`, `password`, `phone`) VALUES ('zhangsan', '123456', '17256154321');
复制代码


Entity


import javax.persistence.*;@Entitypublic class TUser {   @Id   @GeneratedValue   private Integer id ;   private String name;   private String password;   private String phone;   //get set} 
复制代码


UserJpaDao 继承 JpaRepository。有的项目可能会定义成 UserRepository,跟上父类的命名方式。这个是项目规范而已,不在本次技术讨论范围,这里还是采用传统方式:


controller--service--dao模式
复制代码


UserJpaDao 的代码如下


import com.tian.usercenter.jpa.TUser;import org.springframework.data.jpa.repository.JpaRepository;public interface  UserJpaDao extends JpaRepository<TUser,Integer> {}
复制代码


UML 图如下



其中 JpaRepository 中已有的方法



另外 QueryByExampleExecutor 中已有的方法,通过方法名可以看出是查询使用:



另外 CrudRepository 中定义的方法,CRUD 就是增删改查的意思,顾名思义,这个类主要是增删改查的基本方法的定义。



写一个 Controller


@RestControllerpublic class JpsController {   @Resource   private UserJpaDao userJpaDao;   @GetMapping("/testjpa")   public Object test(){      long count = userJpaDao.count();       System.out.println("cout="+count);       return userJpaDao.findAll();  }}
复制代码


这里使用了 count 方法和 findAll 方法,都是使用已有的方法,细心的人看出来了,这两个方法并不是我们 dao 里实现的。


提醒:这里是为了演示,所以 controller 直接调用 dao 了,通常开发的时候中间至少还有一层 service。


启动类


@SpringBootApplicationpublic class UserCenterApplication {   public static void main(String[] args) {SpringApplication.run(UserCenterApplication.class, args);}}
复制代码


启动 main 方法


已经成功启动了。


访问一下:http://localhost:8080/testjpa



sql 日志打印



这样 spring data jpa 就这么简单的集成到 Spring Boot 项目中明了。


高级用法

自定义 sql


在实际项目开发中,简单的增删改查通常是很难满足的,基本都会使用到一些自定义 sql 来实现业务。下面就是用自定义 sql


public interface  UserJpaDao extends JpaRepository<TUser,Integer> {   @Query(value = "select * from tuser tu where tu.name= ?1 ", nativeQuery = true)   TUser findByName(String name);}
复制代码


很多人都习惯于原生态 sql,所以这里需要加上一个 nativeQuery=true


sql 中的?1 表示方法参数中的第一个参数。


除了上面指定参数以外还有可以使用。


注意:注解 @Param 别导错包


@Query(value = "select tu from TUser tu where tu.id= :id ")TUser findByPId(@Param("id") Integer id);
复制代码


启动类


@RestControllerpublic class JpsController {   @Resource   private UserJpaDao userJpaDao;   @GetMapping("/testjpa")   public Object test() {       TUser user = userJpaDao.findByName("zhangsan");       System.out.println("findByName=" + user);       return userJpaDao.findByPId(1);  }}
复制代码


启动项目。


请求:http://localhost:8080/testjpa



后台输出



OK,今天就到这里。


推荐阅读


终于明白为什么要加 final 关键字了!


如何优雅的导出 Excel



用户头像

田维常

关注

关注公众号:Java后端技术全栈,领500G资料 2020.10.24 加入

关注公众号:Java后端技术全栈,领500G资料

评论

发布
暂无评论
【原创】Spring Boot 集成Spring Data JPA的玩法