当前位置: 首页 > news >正文

SpringBoot整合JPA实现CRUD详解

SpringBoot版本是2.0以上(2.6.13)

JDK是1.8

一、依赖

<dependencies><!-- jdbc --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><!-- spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- mybatis --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version></dependency><!-- mysql-connector --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><!-- lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- spring-boot-starter-test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency></dependencies>

二、配置文件

注意:使用的是application.yml

           
1.数据库连接池,这次例子里面采用的是springboot2.0版本后默认整合的hikari连接池


2.ddl-auto,

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

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

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

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

none: 禁用DDL处理

3.database-platform,这项是配置对应连接数据库的方言,也就是语法、规则等等。 这里我们使用mysql数据库,方言项记得使用MySQL5InnoDBDialect,这样才能对应起InnoDB。

# 应用服务 WEB 访问端口
server:port: 8081spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&zeroDateTimeBehavior=convertToNullhikari: # springboot 2.0 整合了hikari ,据说这是目前性能最好的java数据库连接池username: rootpassword: rootminimum-idle: 5  # 最小空闲连接数量idle-timeout: 180000 # 空闲连接存活最大时间,默认600000(10分钟)maximum-pool-size: 10 # 连接池最大连接数,默认是10auto-commit: true # 此属性控制从池返回的连接的默认自动提交行为,默认值:truepool-name: MyHikariCP # 连接池名称max-lifetime: 1800000 # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟connection-timeout: 30000 # 数据库连接超时时间,默认30秒,即30000connection-test-query: SELECT 1 #连接池每分配一条连接前执行的查询语句(如:SELECT 1),以验证该连接是否是有效的。如果你的驱动程序支持 JDBC4,HikariCP 强烈建议我们不要设置此属性jpa:hibernate:ddl-auto: update  # 第一次建表create  后面用update,要不然每次重启都会新建表show-sql: true #打印执行的sql语句database-platform: org.hibernate.dialect.MySQL5InnoDBDialect #设置数据库方言  记住必须要使用 MySQL5InnoDBDialect 指定数据库类型对应InnoDB  ;如果使用MySQLDialect 则对应的是MyISAM#下面这些内容是为了让MyBatis映射
#指定Mybatis的Mapper文件
mybatis:mapper-locations: classpath:mappers/*xml
#指定Mybatis的实体目录type-aliases-package: com.cjq.mybatis.entity

三、实体类

注意:

1.注解@Entity 表示是实体类
2.注解@Table 指定关联的数据库的表名(name=表名)
3.注解@Id  定义一条记录的唯一标识,并结合注解@GeneratedValue将其设置为自动生成
 4.注解@Column: 标注在字段上,可以指定字段名和长度 
package com.cjq.entity;import lombok.Data;
import lombok.ToString;import javax.persistence.*;
import java.math.BigDecimal;@Data
@ToString
@Entity
@Table(name ="t_goods")
public class Goods {@Id@GeneratedValue(strategy = GenerationType.IDENTITY) //自增主键private Long goodsId;/*** @Column 注解可以接受多个参数,常用的参数包括:* name:指定数据库表中的列名。* nullable:指定该列是否可为空,默认为 true。* unique:指定该列是否唯一,默认为 false。* length:指定该列的长度。* precision 和 scale:用于精度和刻度的数字列。* precision属性和scale属性表⽰精度,* 当字段类型为double时,precision表⽰数值的总长度,scale表⽰⼩数点所占的位数。*/@Column(name = "goods_name",length = 50,nullable = false)private String goodsName;@Column(name = "goods_num")private Integer goodsNum;@Column(name = "goods_price")private BigDecimal goodsPrice;
}

四、控制层(Controller)

package com.cjq.controller;import com.cjq.entity.Goods;
import com.cjq.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
public class GoodsController {@Autowiredprivate GoodsService goodsService;/*** 查询列表* @return*/@GetMapping("/findAll")public List<Goods> findAll(){return goodsService.findAll();}/*** 添加/修改* 在测试时,有id就修改,没有就添加* @param goods*/@PostMapping("/insert")public void insert(@RequestBody Goods goods){goodsService.save(goods);}/*** 单删* @param goodsId*/@DeleteMapping("/delete/{goodsId}")public void delete(@PathVariable Long goodsId){ goodsService.delete(goodsId); }}

五、业务层(Service、ServiceImpl)

package com.cjq.service;import com.cjq.entity.Goods;import java.util.List;public interface GoodsService {/*** 查询列表* @return*/List<Goods> findAll();/*** 添加* @param goods*/void save(Goods goods);/*** 单删* @param goodsId*/void delete(Long goodsId);}
package com.cjq.service.impl;import com.cjq.mapper.GoodsMapper;
import com.cjq.entity.Goods;
import com.cjq.service.GoodsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class GoodsServiceImpl implements GoodsService {@Autowiredprivate GoodsMapper goodsMapper;@Overridepublic List<Goods> findAll() {return goodsMapper.findAll();}@Overridepublic void save(Goods goods) {goodsMapper.save(goods);}@Overridepublic void delete(Long goodsId) {goodsMapper.deleteById(goodsId);}}

六、持久层(Mapper)

package com.cjq.mapper;import com.cjq.entity.Goods;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Component;@Component
public interface GoodsMapper extends JpaRepository<Goods,Long> {}

七、为什么持久层不用写接口

JpaRepository继承于PagingAndSortingRepository,它提供了分页和排序功能。PagingAndSortingRepository继承于CrudRepository,它提供了简单的CRUD功能。定义的接口继承于Repository,所以它传递性的继承了上面所有接口,并拥有这些接口的所有方法。

到这里就结束啦,感谢各位小伙伴的观看!!!

相关文章:

  • 【珠海一号卫星】
  • 鼎阳加油-IOC关键技术问题的解决记
  • 柯桥韩语学校|韩语每日一词打卡:회갑연[회가변]【名词】花甲宴
  • 怎么通过AI大模型开发一个网站?
  • 计算机网络回顾
  • 【WRF运行第三期】服务器上运行WRF模型(官网案例-Hurricane Matthew)
  • 科技云报到:以数据“价值三角”为擎,探索数据治理实践路径
  • 基于Springboot投稿和稿件处理系统设计与实现
  • list模拟实现(部分)
  • 什么是托管安全信息和事件管理 SIEM?
  • 机器学习-朴素贝叶斯
  • 【git lfs 问题记录】
  • 【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇
  • 预计2030年全球GO电工钢市场规模将达到120.6亿美元
  • uniapp view增加删除线
  • Google 是如何开发 Web 框架的
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 自己简单写的 事件订阅机制
  • AHK 中 = 和 == 等比较运算符的用法
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Laravel核心解读--Facades
  • leetcode98. Validate Binary Search Tree
  • MySQL的数据类型
  • spring + angular 实现导出excel
  • Spring Boot MyBatis配置多种数据库
  • underscore源码剖析之整体架构
  • 不上全站https的网站你们就等着被恶心死吧
  • 电商搜索引擎的架构设计和性能优化
  • 给github项目添加CI badge
  • 基于Android乐音识别(2)
  • 检测对象或数组
  • 嵌入式文件系统
  • 使用API自动生成工具优化前端工作流
  • 我看到的前端
  • 携程小程序初体验
  • 翻译 | The Principles of OOD 面向对象设计原则
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #include
  • #includecmath
  • #Z0458. 树的中心2
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (145)光线追踪距离场柔和阴影
  • (30)数组元素和与数字和的绝对差
  • (LLM) 很笨
  • (附源码)ssm高校实验室 毕业设计 800008
  • (排序详解之 堆排序)
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Memory Profiler的使用举例
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET/C# 使用反射注册事件
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .project文件