java jpa 教程 查询_Spring Boot JPA 使用教程
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 使用教程相关推荐
- jpa分页查询_spring data jpa 居然提供了这么多查询方式!
spring data jpa提供了多种查询方式,如下: 方法名称查询 继承Repository接口 测试代码 方法名称中支持的关键字(官方文档提供) 使用JPA命名查询 在User实体中定义jpql ...
- jpa的查询api_为JPA的本机查询API键入安全查询
jpa的查询api 当您使用JPA时-有时-JPQL不能解决问题,您将不得不使用本机SQL. 从一开始,像Hibernate这样的ORM就为这些情况保留了开放的"后门",并为Spr ...
- springboot项目识别不了pom.xml文件_Spring Boot Web 项目教程,Spring Boot的环境配置
这节课,我们来学习一下SpringBoot的环境配置,在SpringBoot中,所有的配置都写在application.properties中: 我们启动项目,默认端口是8080,我们现在给他配置一个 ...
- springboot设置默认值_spring boot jpa存储数据的默认值为java的默认值
问题描述 使用jpa的save方法保存数据后返回的实体类为java数据类型的默认值 问题出现的环境背景及自己尝试过哪些方法 环境背景: 用户新增功能,调用新增接口后根据返回对象的id去查询等级表的等级 ...
- java jpa自身关联查询_Spring Hibernate JPA 联表查询 复杂查询
关系类型Owning-SideInverse-Side one-to-one @OneToOne @OneToOne(mappedBy="othersideName") one-t ...
- jpa 去重_spring boot jpa 表关联查询分组 group by 去重
使用jpa操作多张表进行关联查询时,有重复数据需要分组去重 1)确定主表:将有重复数据的表格作为主表,表明关系 public class AttendanceRuleTypeItem implemen ...
- jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...
- 在每个运行中运行多个查询_Spring Data JPA的运行原理及几种查询方式
Spring Data JPA的运行原理: @PersistenceContext(name="entityManagerFactory") private EntityManag ...
- java怎么新建模块_spring boot添加新模块的方法教程
前言 在springboot项目框架里,把一个项目两大模块,主项目main和测试项目test,而我们的测试项目根据功能又可以再分,比如可以有单元测试,集成测试,业务测试等等. 对于一个初学者来说,建立 ...
- jpa连接mysql报错_Spring boot jpa mysql 连接数据库SSL错误
Fri Dec 20 21:53:24 CST 2019 WARN: Establishing SSL connection without server's identity verificatio ...
最新文章
- copy一下面试题目
- 摘自ubantuer-Linux防火墙iptables学习笔记(三)iptables命令详解和举例
- 哈希表(散列表)知识点概述
- 类variant解剖
- pcl之解决No CMAKE_CUDA_COMPILER could be found.
- apt-get install 的参数(add-apt-repository)
- yolov3损失函数改进_YOLO V3 深度解析 (下)
- UNIX环境--线程
- jmeter性能测试之录制脚本
- html+css实现天猫官网
- 认识COFF文件格式
- Mindmanager 安装过程中 ERROR 1320. The specified path is too long (文件路径) 等问题
- 游戏服务器开发环境搭建
- STM32H743使用PA0,PA1作为ADC输入的坑!!
- oracle之trunc函数
- 【宋红康 MySQL数据库 】【高级篇】【03】MySQL的数据目录
- Phython做小鸟飞行游戏
- 实现单选框的css,7款纯CSS实现不错的自定义单选框
- qemu学习之添加一个新machine
- Python滞后相关系数(Lagged correlation)代码分享,气象相关
热门文章
- 图像识别算法_图像识别—MobileNets算法详解
- php js attr,php如何像js一样解析DOM?
- 求多个数最小公倍数的一种变换算法
- 机器学习中的numpy的array_机器学习阶段总结(numpy)
- python金融风控评分卡模型和数据分析(加强版)
- 路由器总是有信号无网络连接到服务器,路由器信号满格但是没有网络怎么办
- mysql有闪回吗_【赵强老师】MySQL的闪回
- Effective Python: bytes, str, unicode
- 算法:Validate Binary Search Tree(验证二叉查找树)
- 【optimization、pypi-packages、Github、GitCode、pip】optimtool介绍文档