关于java:原创Spring-Boot-集成Spring-Data-JPA的玩法

37次阅读

共计 4380 个字符,预计需要花费 11 分钟才能阅读完成。

关注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.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/my_jpa?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=lwt123456@
spring.jpa.properties.hibernate.hbm2ddl.auto=update
#展现 sql(调试或者排查问题时候很有用)spring.jpa.show-sql=true
spring.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.*;
@Entity
public 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

@RestController
public 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。

启动类

@SpringBootApplication
public 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);

启动类

@RestController
public 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

正文完
 0