【原创】Spring Boot 集成Spring Data JPA的玩法
通过本文你可以收获:
- 什么是JPA?
- 认识Spring data JPA
- 快速搞定Spring boot集成Spring data JPA
- Spring data JPA高级用法入门
什么是JPA
JPA是Java Persistence API的简称
目前市面上比较流行的ORM框架有Mybatis、Hibernate、SpringJDBC等。
在没有JPA规范之前,由于没有官方的标准,使得每个ORM框架之间的API差距都蛮大的,只要使用了一种ORM框架后系统会严重受限于该ORM框架的标准。
基于上这些原因,Sun引入新的JPA ORM,主要原因有两点:
- 简化现有Java EE 应用开发工作
- 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/spring-data-jpa#overview
Spring data JPA 是Spring基于ORM框架、JPA规范的基础之上封装的一套JPA应用框架,可以让使用者(程序员)用最简单的代码即可实现对象数据的CRUD操作,上手容易,能提高开发效率。其实说白了Spring就是基于Hibernate之上构建的JPA使用解决方案,方便于大家在Spring Boot项目中的使用JPA技术。
快速上手Spring data jpa
首先是快速建一个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,今天就到这里。
- 使用jQuery Draggable和Droppable实现拖拽功能
- CSS魔法堂:重拾Border之——图片作边框
- Mobile Web中URL设计问题
- 使用root用户连接Ubuntu16.04时,提示SSH连接被拒绝
- CSS魔法堂:Box-Shadow没那么简单啦:)
- java操作redis: 将string、list、map、自定义的对象保存到redis中
- 运行第一个Docker容器-Docker for Web Developers(1)
- 手动实现jQuery Tools里面tab功能
- Angular企业级开发(9)-前后端分离之后添加验证码
- 基于thrift的微服务框架
- Sublime Text 快速格式化
- HTML中拖放介绍
- 打造高效前端工作环境 - tmux
- 基于thrift的微服务框架
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SecureCRT下Python脚本编写
- 一篇文章上手Vue3中新增的API
- 先电OpenStack卸载脚本
- 先电OpenStack之neutron-vlan脚本
- 【7】进大厂必须掌握的面试题-Java面试-Jsp
- HTML5+JS 可交互360°&柱状全景图浏览
- Spring编译源代码解决spring-core缺少cglib和objenesis的jar包的办法
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- CSS3旋转实例学习(附3D旋转实例)
- 学会23个linux常用命令,不做前端切图仔~
- Python新手之pycharm调试指南
- 【设计模式系列】行为型之状态模式
- PHP运行模式
- 马上2021年了线性表你还不知道原理?给老王整的明明白白
- 分治-芯片测试问题