JPA 是 Spring Boot 官方推荐的数据库访问组件,其充分体现了面向对象编程思想,有点像 asp.net 的 EFCore。JPA 也是众多 ORM 的抽象。

从本系列开始,都需要用到 mysql 数据库 和其他一些参考的数据库。请准备相关环节。本章需要以下环境支撑:

mysql 5.6+

jdk1.8+

spring boot 2.1.6

idea 2018.1

1 数据准备

数据库教程系列都是使用相同的数据,如在 Spring Boot JDBC 使用教程使用的一样

字段

类型

主键

说明

id

int

自动编号

user_name

varchar(100)

用户名

password

varchar(255)

密码

last_login_time

date

最近登录时间

sex

tinyint

性别 0男 1女 2其他

SET NAMES utf8mb4;

SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------

-- Table structure for t_user

-- ----------------------------

DROP TABLE IF EXISTS `t_user`;

CREATE TABLE `t_user` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`user_name` varchar(255) DEFAULT NULL,

`password` varchar(255) DEFAULT NULL,

`last_login_time` datetime DEFAULT NULL,

`sex` tinyint(4) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=armscii8;

-- ----------------------------

-- Records of t_user

-- ----------------------------

BEGIN;

INSERT INTO `t_user` VALUES (1, 'json', '123', '2019-07-27 16:01:21', 1);

INSERT INTO `t_user` VALUES (2, 'jack jo', '123', '2019-07-24 16:01:37', 1);

INSERT INTO `t_user` VALUES (3, 'manistal', '123', '2019-07-24 16:01:37', 1);

INSERT INTO `t_user` VALUES (4, 'landengdeng', '123', '2019-07-24 16:01:37', 1);

INSERT INTO `t_user` VALUES (5, 'max', '123', '2019-07-24 16:01:37', 1);

COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

2 新建 Spring Boot 工程项

File > New > Project,如下图选择 Spring Initializr 然后点击 【Next】下一步

填写 GroupId(包名)、Artifact(项目名) 即可。点击 下一步

groupId=com.fishpro

artifactId=jpa

选择依赖 Spring Web Starter 前面打钩,勾选SQL选项的 Spring Data JPA , MySQL

项目名设置为 spring-boot-study-jpa.

3 依赖引入 Pom.xml 配置

如果您已经勾选了 勾选SQL选项的 Spring Data JPA , MySQL,那么无须手动增加依赖。

org.springframework.boot

spring-boot-starter-data-jpa

org.springframework.boot

spring-boot-starter-webflux

mysql

mysql-connector-java

runtime

org.springframework.boot

spring-boot-starter-test

test

io.projectreactor

reactor-test

test

4 JPA 的工程配置 application.yml

server:

port: 8086

spring:

#通用的数据源配置

datasource:

driverClassName: com.mysql.jdbc.Driver

url: jdbc:mysql://localhost:3306/demo_test?useSSL=false&useUnicode=true&characterEncoding=utf8

username: root

password: 123

jpa:

#这个参数是在建表的时候,将默认的存储引擎切换为 InnoDB 用的

database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

#配置在日志中打印出执行的 SQL 语句信息。

show-sql: true

hibernate:

#配置指明在程序启动的时候要删除并且创建实体类对应的表

ddl-auto: create

spring.jpa.database-platform 设置为 org.hibernate.dialect.MySQL5InnoDBDialect 这个参数是在建表的时候,将默认的存储引擎切换为 InnoDB 用的

spring.jpa.show-sql 设置为true 配置在日志中打印出执行的 SQL 语句信息。

spring.jpa.hibernate.ddl-auto 设置为 create 配置指明在程序启动的时候要删除并且创建实体类对应的表

5 编写示例代码

代码方便不同的是,在命名方便,JPA 把 Dao 改成了 Repository,继承了 CrudRepository。

本示例包括新增的页面

src/main/java/com/fishpro/jpa/controller/UserController.java 控制层 rest api

src/main/java/com/fishpro/jpa/domain/UserDO.java 实体对象

src/main/java/com/fishpro/jpa/dao/UserRepository.java Repository 数据库访问层

src/test/java/fishpro/com/UserRepositoryTest.java 测试类

5.1 新建实体对象 UserDao.java

建立基于 POJO 的实体对象,需要注意的是 JPA 与 Mybatis 是有区别的

实体类需要使用 @Entity 注解标注

需要对实体类的属性进行标注,使用 @Id 标注主键

使用 @Column 标注非主键

/**

* 用户实体类

* */

@Entity

@Table(name="t_user")

public class UserDO {

@Id

private Integer id;

@Column(name="user_name",length = 200)

private String userName;

@Column(name="password",length = 200)

private String password;

@Column(name="sex")

private Integer sex;

@Column(name="last_login_time")

private Date lastLoginTime;

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPassword() {

return password;

}

public void setPassword(String password) {

this.password = password;

}

public Integer getSex() {

return sex;

}

public void setSex(Integer sex) {

this.sex = sex;

}

public Date getLastLoginTime() {

return lastLoginTime;

}

public void setLastLoginTime(Date lastLoginTime) {

this.lastLoginTime = lastLoginTime;

}

}

5.2 新建仓库接口类 UserRepository

仓库接口类 UserRepository 就是我们常用的 Dao 接口,需要注意的是 JPA 的仓储接口需要

使用 @Repository 注解

继承 JPARepository

UserRepository 不需要编写任何代码,就可实现增删改查

@Repository

public interface UserRepository extends JPARepository {

}

6 编写 UserRepository 的测试用例

在 src/test/java/com/fishpro/jpa/ 下新增 UserRepositoryTest.java 使用 @RunWith(SpringRunner.class) 和 @SpringBootTest 注解标注类。

@RunWith(SpringRunner.class)

@SpringBootTest

public class UserRepositoryTest{

}

6.1 新增用户数据

初始化一个对象 UserDO 测试Insert过程

/**

* 初始化一个对象 UserDO 测试Insert过程

* */

@Before

public void before(){

UserDO userDO=new UserDO();

userDO.setId(1);

userDO.setUserName("fishpro");

userDO.setSex(1);

userDO.setLastLoginTime(new Date());

userDO.setPassword("passWord");

userRepository.save(userDO);

}

6.2 查询单个数据

@Test

public void testFind(){

Optional optionalUserDO=userRepository.findById(1);

if(optionalUserDO.isPresent()){

UserDO userDO=optionalUserDO.get();

System.out.println("testFind user"+userDO.getUserName());

}

}

6.3 查询多个数据

@Test

public void testFindAll(){

List list=userRepository.findAll();

for (UserDO user:list

) {

System.out.println("user_name:"+user.getUserName());

}

}

6.4 更新数据

@Test

public void testUpdate(){

Optional optionalUserDO=userRepository.findById(1);

if(optionalUserDO.isPresent()){

UserDO userDO=optionalUserDO.get();

userDO.setUserName("fishpro001");

userRepository.save(userDO);

System.out.println("testFind user"+userDO.getUserName());

}

}

6.5 删除数据

@After

public void after(){

userRepository.deleteById(1);

userRepository.deleteById(2);

userRepository.deleteById(3);

}

7 问题思考

7.1 联合主键设置

假设我们定义了用户角色表包括了 userId,roleId 两个都是主键。

定义一个主键类

public class UserRoleKey implements Serializable {

private Integer userId;

private Integer roleId;

}

定义实体类

注意实体类上 是用来 @IdClass 注解来实现复合主键定义

@Entity

@Table(name="t_user_role")

@IdClass(UserRoleKey.class) //注意这里是引入了 定义的符合主键类

public class UserRoleDO {

@Id

private Integer userId;

@Id

private Integer roleId;

public Integer getUserId() {

return userId;

}

public void setUserId(Integer userId) {

this.userId = userId;

}

public Integer getRoleId() {

return roleId;

}

public void setRoleId(Integer roleId) {

this.roleId = roleId;

}

}

7.2 自定义查询

java jpa 教程 查询_Spring Boot JPA 使用教程相关推荐

  1. jpa分页查询_spring data jpa 居然提供了这么多查询方式!

    spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...

  2. jpa的查询api_为JPA的本机查询API键入安全查询

    jpa的查询api 当您使用JPA时-有时-JPQL不能解决问题,您将不得不使用本机SQL. 从一开始,像Hibernate这样的ORM就为这些情况保留了开放的"后门",并为Spr ...

  3. springboot项目识别不了pom.xml文件_Spring Boot Web 项目教程,Spring Boot的环境配置

    这节课,我们来学习一下SpringBoot的环境配置,在SpringBoot中,所有的配置都写在application.properties中: 我们启动项目,默认端口是8080,我们现在给他配置一个 ...

  4. springboot设置默认值_spring boot jpa存储数据的默认值为java的默认值

    问题描述 使用jpa的save方法保存数据后返回的实体类为java数据类型的默认值 问题出现的环境背景及自己尝试过哪些方法 环境背景: 用户新增功能,调用新增接口后根据返回对象的id去查询等级表的等级 ...

  5. java jpa自身关联查询_Spring Hibernate JPA 联表查询 复杂查询

    关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...

  6. jpa 去重_spring boot jpa 表关联查询分组 group by 去重

    使用jpa操作多张表进行关联查询时,有重复数据需要分组去重 1)确定主表:将有重复数据的表格作为主表,表明关系 public class AttendanceRuleTypeItem implemen ...

  7. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  8. 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式

    Spring Data JPA的运行原理: @PersistenceContext(name="entityManagerFactory") private EntityManag ...

  9. java怎么新建模块_spring boot添加新模块的方法教程

    前言 在springboot项目框架里,把一个项目两大模块,主项目main和测试项目test,而我们的测试项目根据功能又可以再分,比如可以有单元测试,集成测试,业务测试等等. 对于一个初学者来说,建立 ...

  10. jpa连接mysql报错_Spring boot jpa mysql 连接数据库SSL错误

    Fri Dec 20 21:53:24 CST 2019 WARN: Establishing SSL connection without server's identity verificatio ...

最新文章

  1. copy一下面试题目
  2. 摘自ubantuer-Linux防火墙iptables学习笔记(三)iptables命令详解和举例
  3. 哈希表(散列表)知识点概述
  4. 类variant解剖
  5. pcl之解决No CMAKE_CUDA_COMPILER could be found.
  6. apt-get install 的参数(add-apt-repository)
  7. yolov3损失函数改进_YOLO V3 深度解析 (下)
  8. UNIX环境--线程
  9. jmeter性能测试之录制脚本
  10. html+css实现天猫官网
  11. 认识COFF文件格式
  12. Mindmanager 安装过程中 ERROR 1320. The specified path is too long (文件路径) 等问题
  13. 游戏服务器开发环境搭建
  14. STM32H743使用PA0,PA1作为ADC输入的坑!!
  15. oracle之trunc函数
  16. 【宋红康 MySQL数据库 】【高级篇】【03】MySQL的数据目录
  17. Phython做小鸟飞行游戏
  18. 实现单选框的css,7款纯CSS实现不错的自定义单选框
  19. qemu学习之添加一个新machine
  20. Python滞后相关系数(Lagged correlation)代码分享,气象相关

热门文章

  1. 图像识别算法_图像识别—MobileNets算法详解
  2. php js attr,php如何像js一样解析DOM?
  3. 求多个数最小公倍数的一种变换算法
  4. 机器学习中的numpy的array_机器学习阶段总结(numpy)
  5. python金融风控评分卡模型和数据分析(加强版)
  6. 路由器总是有信号无网络连接到服务器,路由器信号满格但是没有网络怎么办
  7. mysql有闪回吗_【赵强老师】MySQL的闪回
  8. Effective Python: bytes, str, unicode
  9. 算法:Validate Binary Search Tree(验证二叉查找树)
  10. 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档