springboot整合hibernate_峰哥说技术系列-17 .Spring Boot 整合 Spring Data JPA
今日份主题
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相关推荐
- vueform表单文件上传_峰哥说技术系列-8.Spring Boot文件上传(Form表单和Ajax方式)
今日份主题 Spring Boot文件上传(Form表单和Ajax方式) 在Spring Boot中,和文件上传的主要和MultipartResolver接口有关,他有两个实现类 StandardSe ...
- springboot整合oracle_SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介
SpringBoot2.x系列教程67--Spring Boot整合分布式事务简介 作者:一一哥 一. 分布式事务简介 1. 什么是分布式事务 百度百科对分布式事务的解释如下: 分布式事务就是指事务的 ...
- freemarker ftl模板_Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...
- channelfuture怎么拿到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...
- getprivateprofilestring读不到数据_SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾
SpringBoot2.x系列教程66--Spring Boot整合分布式事务之数据库事务回顾 作者:一一哥 本节主要内容 一. 事务出现的原因 转账是生活中常见的操作,比如从A账户转账100元到B账 ...
- Spring Boot整合Shiro + Springboot +vue
目录 02 Spring Boot整合Shiro p1.shiro概述 1 什么是Shiro 2 Shiro核心组件 p2.Shiro实现登录认证 AccountRealm.java QueryWra ...
- 【SpringBoot学习】28、Spring Boot 整合 TKMybatis 通用 Mapper
文章目录 Spring Boot 整合 TKMybatis 自定义父类接口 新增接口 新增之后回显 Id 更新 删除 单查询 查询列表 计数 条件构造器 技术分享区 Spring Boot 整合 TK ...
- spring boot 系列之四:spring boot 整合JPA
上一篇我们讲了spring boot 整合JdbcTemplate来进行数据的持久化, 这篇我们来说下怎么通过spring boot 整合JPA来实现数据的持久化. 一.代码实现 修改pom,引入依赖 ...
- java 模板引擎_极简 Spring Boot 整合 Thymeleaf 页面模板
点击"牧码小子"关注,和众多大牛一起成长! 关注后,后台回复 java ,领取松哥为你精心准备的技术干货! 虽然现在慢慢在流行前后端分离开发,但是据松哥所了解到的,还是有一些公司在 ...
最新文章
- 干货 | 斯坦福的人工智能4年路线!
- 12v电流表的正确接法_难点分析 | 电表的内外接法
- 从实战中了解数据开发全流程——DataWorks OpenAPI实战
- Teams数据统计 - 用户在线离线状态
- linux nifi指定jdk,nifi在arm架构启动不了,怎么办?
- 很好的一款监控web请求的工具,fiddler.
- 预处理函数在app和蓝图级别的不同使用
- 阶段2 JavaWeb+黑马旅游网_15-Maven基础_第3节 maven标准目录结构和常用命令_06maven标准目录结构...
- linux系统添加中文输入法
- 《华为工作法》学习笔记
- js一键批量打印_JS 实现选中内容批量打印/导出
- meta-inf java_jar包中的META-INF 文件夹是干嘛的?
- 计算机桌面变窄,电脑桌面图标变小怎么调整
- linux cp 性能,linux性能监控以及优化之CPU
- C#一年级100以内的加减训练
- 【图像识别】基于卷积神经网络实现手写汉字识别附matlab代码
- S2B2C模式主要关注什么
- Flex开发环境,开发工具,开发框架总结
- 2018-决策树约束的建筑点云提取方法
- 在canvas中应用font-awesome字体
热门文章
- 微型计算机dec al,微机原理复习知识点
- python 队列 锁_python-day31(同步锁,队列)
- 用python写一个记账小程序_python实现日常记账本小程序
- mysql switch binlog_如何使用 Golang 处理 MySQL 的 binlog
- wpf 如何设置弹出窗口必须关闭才能打开其他软件_新电脑到手后,这3项定要这样设置,能让你的电脑多用三年!...
- vim之terminal之窗口大小命令
- 正则表达式中(?:)的巨大作用
- oracle12系统需求,GoldenGateforOracle的系统需求
- php单词出现频率,PHP计算文件或数组中单词出现频率
- 计算机软硬件作品构思报告,计算机方面的实训报告