今日份主题

Spring Boot 整合 Spring Data JPA

JPA(Java Persistence API)是用于对象持久化的 API,是Java EE 5.0 平台标准的 ORM 规范,它使得应用程序以统一的方式访问持久层。

大家一定听过大名鼎鼎的Hibernate,在国内早期很多JavaEE项目使用该框架,现在在国外依然非常火爆。其实JPA和Hibernate之间是有一定的关系的。这里给大家介绍一下。

JPA 是 Hibernate 的一个抽象(就像JDBC和JDBC驱动的关系)。JPA 本质上就是一种 ORM 规范,不是ORM 框架,这是因为 JPA 并未提供 ORM 实现,它只是制订了一些规范,提供了一些编程的 API 接口,但具体实现则由 ORM 厂商提供实现。Hibernate 除了作为 ORM 框架之外,它也是一种 JPA 实现。从功能上来说, JPA 是 Hibernate 功能的一个子集。

JPA 的目标之一是制定一个可以由很多供应商实现的 API,Hibernate 3.2+、TopLink 10.1+ 以及 OpenJPA 都提供了 JPA 的实现。

Spring Data 是 Spring 的一个子项目。用于简化数据库访问,支持NoSQL 和 关系数据存储。其主要目标是使数据库的访问变得方便快捷。Spring Data Jpa 致力于减少数据访问层 (DAO) 的开发量. 开发者唯一要做的,就是声明持久层的接口,其他都交给 Spring Data JPA 来帮你完成。

Spring boot整合Spring Data JPA,我们可以通过一个案例来带着大家入门学习一下。有整合MyBatis的基础,应该不是难事。

案例:通过Spring Data JPA操作两张关联表,完成表的增、删、查、改操作。

步骤

01在MySql中创建数据库empdb。特别说明不需要创建表。只要做好能自动完成表结构的创建。

02创建Spring boot工程chapter05-jpa.并添加mysql、durid、jpa、web依赖。工程的创建省略。

依赖如下:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>

03在application.properties进行相关的配置。

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.username=root
spring.datasource.url=jdbc:mysql://localhost:3306/empdb?serverTimezone=UTC
spring.datasource.password=1234
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.database=mysql
spring.jpa.database-platform=mysql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect

说明

在spring data jpa中,它的配置spring.jpa.hibernate.ddl-auto的取值如下:

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

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

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

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

e)none: 禁用DDL处理

spring.jpa.hibernate.show-sql:表示在运行的时候是否在控制台显示执行的sql语句。一般在调试和开发阶段会打开该配置。

spring.jpa.hibernate.database=mysql,表示使用的是mysql数据库。

spring,jpa.database-platform=mysql,是设置默认的数据库存储引擎。这里默认的是mysql的引擎。

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL57Dialect,:表示数据库使用的方言。因为不同的数据库生成的sql语句有一定的差异性。

04编写实体类Emp。

@Entity(name = "t_emp")
@JsonIgnoreProperties(value = { "hibernateLazyInitializer", "handler" })
public class Emp{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(name = "name",length = 50,nullable = false)
private String name;
@Column(name = "sex",length = 10)
private String sex;
@Column(name = "did")
private Integer deptId;

//getter和setter省略...

}

说明

@JsonIgnoreProperties:hibernate对象懒加载,json序列化失败,因为懒加载这个对象属性只是一个代理对象,如果json直接当作一个存在的属性去序列化就会出现错误。

@Entity 是一个必选的注解,声明这个类对应了一个数据库表。

@Id 注解声明了实体唯一标识对应的属性。

@GeneratedValue:这个是设置主键的自动增长策略。

@Column(name = "name",length = 50,nullable = false) 用来声明实体属性的表字段的定义。默认的实体每个属性都对应了表的一个字段。字段的名称默认和属性名称保持一致(并不一定相等)。这里表示字段名name,长度50,字段非空。

05编写接口EmpDao。

public interface EmpDao extends JpaRepository<Emp,Integer> {
}

代码解释:EmpDao接口继承JpaRepository接口。该接口提供了很多的关于数据库操作的方法基本方法。有基本的增删查过、分页查询、排序查询。这也正是jpa的强大之处。有兴趣的同学可以进去看看接口中声明的方法。这里不做过多的解读。

06创建包service,创建EmpService。

@Service
@Transactional
public class EmpService {
@Autowired
private EmpDao empDao;
public Emp saveEmp(Emp emp){
Emp emp1 = empDao.save(emp);
return emp1;
}
public boolean deleteById(Integer id){
try{
empDao.deleteById(id);
return true;
}catch (Exception e){
return false;
}
}
public Emp updateEmp(Emp emp){
Emp emp1 = empDao.saveAndFlush(emp);
return emp1;
}
public Emp findEmpById(Integer id){
Emp emp = empDao.getOne(id);
return emp;
}
public List<Emp> getEmps(){
return empDao.findAll();
}
public Page<Emp> getEmpByPage(Integer pageNum,Integer pageSize){
PageRequest pageable=PageRequest.of(pageNum-1,pageSize);
Page<Emp> page = empDao.findAll(pageable);
return page;
}
}

07创建包controller,创建EmpController处理器。

@RestController
@RequestMapping("/emp")
public class EmpController {
@Autowired
private EmpService empService;
@PostMapping("/save")
public Emp saveEmp(Emp emp){
Emp emp1 = empService.saveEmp(emp);
return emp1;
}
@DeleteMapping("/delete/{id}")
public boolean deleteEmp(@PathVariable("id") Integer id){
return empService.deleteById(id);
}
@PutMapping("/update")
public Emp updateEmp(Emp emp){
Emp emp1 = empService.updateEmp(emp);
return emp1;
}
@GetMapping("/{id}")
public Emp getEmpById(@PathVariable("id") Integer id){
return empService.findEmpById(id);
}
@GetMapping("/list")
public List<Emp> getEmpList(){
return empService.getEmps();
}
@GetMapping("/page")
public Map<String,Object> getEmpByPage(@RequestParam("pageNum") Integer pageNum, @RequestParam(value = "pageSize",defaultValue = "2") Integer pageSize){
Page<Emp> page= empService.getEmpByPage(pageNum,pageSize);
Map<String,Object> map=new HashMap<>();
map.put("总页数",page.getTotalPages());
map.put("查询本页记录",page.getContent());
map.put("当前页号",page.getNumber()+1);
map.put("页面大小",page.getSize());
map.put("总记录数",page.getTotalElements());
map.put("当前页记录数",page.getNumberOfElements());
return map;
}
}

代码解释:这里所有的测试,都返回json到前台。对于分页查询,一般返回page就可以了。这里为了解释清楚,专门把数据取出来封装到map中。

08在postman中进行测试,结果如下:

A)添加操作

B)修改操作,将关羽的名字改成关云长

C)删除操作,删除id=11的记录。

D)查询操作,查找id为1的记录

E)分页查询

以上就是spring data jpa的基本用法,但是对于查询我们不仅仅是编号、分页查询。有时候需要根据多个条件进行查询,请继续关注峰哥后续文章,我会继续讲解这些问题。

springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA相关推荐

  1. vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)

    今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...

  2. springboot整合oracle_SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介

    SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介 作者:一一哥 一. 分布式事务简介 1. 什么是分布式事务 百度百科对分布式事务的解释如下: 分布式事务就是指事务的 ...

  3. freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  4. channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  5. getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾

    SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...

  6. Spring Boot整合Shiro + Springboot +vue

    目录 02 Spring Boot整合Shiro p1.shiro概述 1 什么是Shiro 2 Shiro核心组件 p2.Shiro实现登录认证 AccountRealm.java QueryWra ...

  7. 【SpringBoot学习】28、Spring Boot 整合 TKMybatis 通用 Mapper

    文章目录 Spring Boot 整合 TKMybatis 自定义父类接口 新增接口 新增之后回显 Id 更新 删除 单查询 查询列表 计数 条件构造器 技术分享区 Spring Boot 整合 TK ...

  8. spring boot 系列之四:spring boot 整合JPA

    上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...

  9. java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板

    点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...

最新文章

  1. 干货 | 斯坦福的人工智能4年路线!
  2. 12v电流表的正确接法_难点分析 | 电表的内外接法
  3. 从实战中了解数据开发全流程——DataWorks OpenAPI实战
  4. Teams数据统计 - 用户在线离线状态
  5. linux nifi指定jdk,nifi在arm架构启动不了,怎么办?
  6. 很好的一款监控web请求的工具,fiddler.
  7. 预处理函数在app和蓝图级别的不同使用
  8. 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_06maven标准目录结构...
  9. linux系统添加中文输入法
  10. 《华为工作法》学习笔记
  11. js一键批量打印_JS 实现选中内容批量打印/导出
  12. meta-inf java_jar包中的META-INF 文件夹是干嘛的?
  13. 计算机桌面变窄,电脑桌面图标变小怎么调整
  14. linux cp 性能,linux性能监控以及优化之CPU
  15. C#一年级100以内的加减训练
  16. 【图像识别】基于卷积神经网络实现手写汉字识别附matlab代码
  17. S2B2C模式主要关注什么
  18. Flex开发环境,开发工具,开发框架总结
  19. 2018-决策树约束的建筑点云提取方法
  20. 在canvas中应用font-awesome字体

热门文章

  1. 微型计算机dec al,微机原理复习知识点
  2. python 队列 锁_python-day31(同步锁,队列)
  3. 用python写一个记账小程序_python实现日常记账本小程序
  4. mysql switch binlog_如何使用 Golang 处理 MySQL 的 binlog
  5. wpf 如何设置弹出窗口必须关闭才能打开其他软件_新电脑到手后,这3项定要这样设置,能让你的电脑多用三年!...
  6. vim之terminal之窗口大小命令
  7. 正则表达式中(?:)的巨大作用
  8. oracle12系统需求,GoldenGateforOracle的系统需求
  9. php单词出现频率,PHP计算文件或数组中单词出现频率
  10. 计算机软硬件作品构思报告,计算机方面的实训报告