一、JPA介绍

JPA (Java Persistence API)Java持久化API,是一套Sun公司Java官方制定的ORM 规范(sun公司并没有实现)。
ORM(Object Relational Mapping)为对象关系映射,是一个实现使用对象操作数据库的设计思想。
其作用是在操作数据库之前,先把数据表与实体类关联起来,然后通过实体类的对象操作(增删改查)数据库表。
因此JPA的作用就是通过对象来操作数据库(不用编写sql语句)。其好处在于:不同的数据库的SQL语法是有差异,如果不需要编写SQL语句,就可以屏蔽各种数据库SQL的差异。那么,编写的代码就可以一套代码兼容多种数据库

既然JPA是一套规范,也就意味着它只是一套实现ORM理论的接口,并没有实现的代码

那么我们必须要有具体的实现者。
市场上的主流的**JPA框架(实现者)**有:
Hibernate (性能最好)、EclipseTop、OpenJPA

JPA实现流程:
首先是 ORM 映射,通过注解或 XML 描述对象和表直接的映射关系。
然后就是对数据库进行 CRUD (增删改查)操作,由于已经配置了对象和表的映射关系,所以可以自动生成对应的 SQL 语句,然后执行语句即可。

二、Spring Boot+ JPA 开发一个完整实例

第一步:创建项目,并新建好包,并在新建一个数据库shop

第二步:引入依赖

     <!-- jpa --><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>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency>

第三步:添加配置

# 配置数据库驱动
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 配置数据库url
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
# 配置数据库用户名
spring.datasource.username=
# 配置数据库密码
spring.datasource.password=# 启动时更新表结构,保留数据(JPA 会在项目启动时自动建立表结构,因此数据库可以不用建表)
spring.jpa.hibernate.ddl-auto=update

第四步:在entity 包下新建GoodsDo类 ,并通过注解实现类结构与数据表结构的映射。

package com.example.demo.entity;import javax.persistence.*;/*** 商品类*/
@Entity // 表示这是一个数据对象类
@Table(name = "goods") // 对应数据库中的goods表
public class GoodsDo {/*** 商品id*/@Id// 该字段对应数据库中的列为主键@GeneratedValue(strategy = GenerationType.IDENTITY) // 主键自增长@Column(name = "id") // 对应goods表中的id列private Long id;/*** 商品名称*/@Column(name = "name") // 对应goods表中的name列private String name;/*** 商品价格*/@Column(name = "price") // 对应goods表中的price列private String price;/*** 商品图片*/@Column(name = "pic") // 对应goods表中的pic列private String pic;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPrice() {return price;}public void setPrice(String price) {this.price = price;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}
}

第五步:在dao包下新建IGoodsDao 接口,通过继承 CrudRepository 实现 CRUD 操作,此时已经可以通过 IGoodsDao 对数据库中的表进行增删改查操作了

package com.example.demo.dao;import com.example.demo.entity.GoodsDo;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;//通过继承 CrudRepository 实现 CRUD 操作。泛型参数分别为实体类及主键的数据类型。
//注意此时已经可以通过 IGoodsDao 对数据库 goods 表进行增删改查操作了。
@Repository
public interface IGoodsDao extends CrudRepository<GoodsDo,Long> {}

第六步:在service包下新建GoodsService 类

package com.example.demo.service;import com.example.demo.dao.IGoodsDao;
import com.example.demo.entity.GoodsDo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.Optional;/*** 商品服务类*/
@Service
public class GoodsService {@Autowiredprivate IGoodsDao goodsDao;/*** 新增商品*/public void add(GoodsDo goods) {goodsDao.save(goods);}/*** 删除商品*/public void remove(Long id) {goodsDao.deleteById(id);}/*** 编辑商品信息*/public void edit(GoodsDo goods) {goodsDao.save(goods);}/*** 按id获取商品信息(Optional是一个包装类,它的内容是空或者包含的对象,所以可以避免空指针问题)*/public Optional<GoodsDo> getById(Long id) {return goodsDao.findById(id);}/*** 获取商品信息列表*/public Iterable<GoodsDo> getList() {return goodsDao.findAll();}
}

第七步:control包下新建GoodsController类

/*** 商品控制器类*/
@RestController
public class GoodsController {@Autowiredprivate GoodsService goodsService;/*** 按id获取商品信息*/@GetMapping("/goods/{id}")public Optional<GoodsDo> getOne(@PathVariable("id") long id) {return goodsService.getById(id);}/*** 获取商品列表*/@GetMapping("/goods")public Iterable<GoodsDo> getList() {return goodsService.getList();}/*** 新增商品*/@PostMapping("/goods")public void add(@RequestBody GoodsDo goods) {goodsService.add(goods);}/*** 编辑商品*/@PutMapping("/goods/{id}")public void update(@PathVariable("id") long id, @RequestBody GoodsDo goods) {// 修改指定id的博客信息goods.setId(id);goodsService.edit(goods);}/*** 移除商品*/@DeleteMapping("/goods/{id}")public void delete(@PathVariable("id") long id) {goodsService.remove(id);}
}

第八步:测试

package com.example.demo;import com.example.demo.dao.IGoodsDao;
import com.example.demo.entity.GoodsDo;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)
@SpringBootTest
class DemoJpaApplicationTests {@Autowiredprivate IGoodsDao goodsDao;@Testvoid contextLoads() {}/*** 新增测试*/@Testpublic void testAdd() {GoodsDo goods = new GoodsDo();goods.setName("梨张");goods.setPic("梨图片");goods.setPrice("2.0");GoodsDo result = goodsDao.save(goods);System.out.println("新增商品id:" + result.getId());assertNotNull(result);}private void assertNotNull(GoodsDo result) {}
}

运行测试类,查看控制台输出,并查看数据库,可以看出已经自动构建表结构和添加数据。

什么是JPA?SpringBoot 中使用JPA相关推荐

  1. Springboot中使用jpa

    一.概念: JPA:全名Java Persistence API,顾名思义是java持久层API,是sun公司提出的,sun公司自己并没有实现,它是一种规范,是用来通过java操作数据库的,遵循ORM ...

  2. Springboot中对jpa动态查询条件的封装

    jpa对于固定参数的条件查询比较简单,可以在Repository中直接用参数名来查询.但是对于不固定的参数查询就比较麻烦了,官方提供的是继承JpaSpecificationExecutor,然后自己拼 ...

  3. Java9中使用jpa_第三篇:SpringBoot中使用JPA

    上一篇使用了JdbcTemplate去访问数据库,毕竟使用的是原生的SQL形式,像我这种懒人是肯定不会考虑的了.. 这次记录下使用JPA来极大的减少我们的代码量 首先,还是准备好SQL文件 DROP ...

  4. springboot中spring.jpa.hibernate.ddl-auto四个属性的含义

    create: 每次应用启动的时候会重新根据实体建立表,之前的表和数据都会被删除. create-drop: 和上面的功能一样,但是多了一样,就是在应用关闭的时候,也就是sessionFactory一 ...

  5. SpringBoot 中 JPA 的使用

    前言 第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了.下面我们就用一个例子来讲述以下 JPA 使用的基本操作 ...

  6. springboot中下面哪一个作为jpa默认实现_天天在用SpringBoot,手撸一个的Starter试试!...

    引言 上篇文章<天天用SpringBoot,它的自动装配原理却说不出来>我们有说springBoot的自动装配怎么实现的,这篇文章的话我们就自己来实现一个SpringBoot的 start ...

  7. SpringBoot 中JPA集成PostgreSql(详细步骤)避坑!

    SpringBoot 中JPA集成PostgreSql(详细步骤) 什么是JPA?(Java Persistence API) Spring Data JPA, part of the larger ...

  8. SPRINGBOOT中如何运用JPA,简单例子

    SPRINGBOOT中如何运用JPA,简单例子 步骤 1 : JPA概念顶折 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活 ...

  9. SpringBoot系列教材 (十三)- 持久层支持 - springboot中如何运用JPA,简单例子

    步骤1:JPA概念 步骤2:创建数据库 步骤3:创建表 步骤4:准备数据 步骤5:先运行,看到效果,再学习 步骤6:模仿和排错 步骤7:基于前面的知识点 步骤8:application.propert ...

最新文章

  1. Go 学习笔记(81)— Go 性能分析工具 pprof
  2. Jquery 选择器大全 【转载】
  3. JavaScript学习笔记五:变量、作用域和内存问题
  4. 【揭秘】12306是如何抗住几亿日活、百万级高并发的?
  5. 在厚度仅十几微米的电池隔膜找缺陷?人工智能说,能行(人工智能应用案例)
  6. 数据可视化 -- Python
  7. 数据库中查询的各种连接(左连接,右连接,全连接,内连接,交叉连接,自连接)...
  8. leetcode—22.二分查找题目leetcode总结
  9. [Serializable]的应用--注册码的生成,加密和验证
  10. 令人惊讶的模拟电路 -3db截止频率理解
  11. C盘清理方法汇总:SpaceSniffer与Windows.edb
  12. 深度学习理论与技术的重点研究方向
  13. 收发电子邮件属于计算机在方面的应用( ),收发电子邮件属于计算机在( )方面的应用...
  14. 一、C++基础入门之 Windows下C/C++开发环境配置
  15. 你知道map,filter,sort,reduct,every, some 的用法吗?
  16. udp广播 安卓和pc互相收不到消息
  17. Spring Cloud中Hystrix的请求合并
  18. unity mega_[MEGA DEAL] Unity A至Z游戏开发套件(96%折扣)
  19. 2012年6月9日免费http代理大全
  20. 小羊驼和你一起学习cocos2d-x与lua之五(lua编写cocos2d-x游戏)

热门文章

  1. CTF中的无线电以及一些取证题目
  2. 处理大数据的关键技术及应用
  3. Linux:写一个简单的shell求和脚本并运行
  4. 均值滤波及中值滤波的区别
  5. eclipse安装sdk和adt
  6. Eclipse IDE
  7. 【计算机组成原理】计算机组成原理——计算篇
  8. matlab 实现常用的混沌映射(Tent, Sine, Sinusoidal, Piecewise, Logistic, Cubic, Chebyshev)
  9. 无力吐槽的 create-shortcut .exe
  10. 超全智能 电子设备cc0高清摄影图片素材网站整理