SpringBoot整合JPA详解

devtools/2024/10/18 14:17:09/

SpringBoot版本是2.0以上(2.6.13)

JDK是1.8

一、依赖

java"><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。

java"># 应用服务 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: 标注在字段上,可以指定字段名和长度 
java">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)

java">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)

java">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);}
java">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)

java">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,所以它传递性的继承了上面所有接口,并拥有这些接口的所有方法。

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


http://www.ppmy.cn/devtools/119784.html

相关文章

Ansible学习之ansible-pull命令

想要知道ansible-pull是用来做什么的&#xff0c;就需要了解Ansible的工作模&#xff0c;Ansible的工作模式有两种&#xff1a; push模式 push推送&#xff0c;这是Ansible的默认模式&#xff0c;在主控机上编排好playbook文件&#xff0c;push到远程主机上来执行。pull模式 p…

【含文档】基于Springboot+微信小程序 的高校社团管理小程序(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

Springboot使用redis,以及解决redis缓存穿透,击穿,雪崩等问题

1.Redis面试题-缓存穿透,缓存击穿,缓存雪崩 1 穿透: 两边都不存在&#xff08;皇帝的新装&#xff09; &#xff08;返回空值&#xff09;&#xff08;互斥锁&#xff09;&#xff08;黑名单&#xff09; &#xff08;布隆过滤器&#xff09; 2 击穿&#xff1a;一个或多个热…

二维环境下的TDOA测距定位的MATLAB代码,带中文注释

TDOA测距定位程序介绍 概述 本MATLAB程序实现了基于时间差到达&#xff08;TDOA&#xff09;技术的二维测距定位&#xff0c;能够处理4个或任意数量&#xff08;大于3个&#xff09;的锚节点。在无线定位和导航系统中&#xff0c;TDOA是一种常用的定位方法&#xff0c;通过测量…

深度学习500问——Chapter17:模型压缩及移动端部署(2)

文章目录 17.4.6 低秩分解 17.4.7 总体压缩效果评价指标有哪些 17.4.8 几种轻量化网络结构对比 17.4.9 网络压缩未来研究方向有哪些 17.5 目前有哪些深度学习模型优化加速方法 17.5.1 模型优化加速方法 17.5.2 TensorRT加速原理 17.5.3 TensorRT如何优化重构模型 17.5.4 Tensor…

第七章 Redis常用五大数据类型之ZSet

目录 一、介绍 二、常用命令 2.1. zadd 2.2. zrange 2.3. zrangebyscore 2.4. zrevrangebyscore 2.5. zincrby 2.6. zrem 2.7. zcount 2.8. zrank 一、介绍 Redis有序集合ZSet与普通集合Set非常相似&#xff0c;是一个没有重复元素的字符串集合。不同之处是有序…

【无标题】logistic映射

当Logistic映射中的控制参数 μ \mu μ 为负数时&#xff0c;系统的行为与正数 μ \mu μ 的情况截然不同。Logistic映射的一般形式是&#xff1a; x ( t 1 ) μ x ( t ) ( 1 − x ( t ) ) x(t1) \mu x(t) (1 - x(t)) x(t1)μx(t)(1−x(t))其中 x ( t ) x(t) x(t) 表示时…

sql 时间交集

任务&#xff08;取时间交集&#xff09; 前端输入开始时间和结束时间&#xff0c;通过sql筛选出活动开始时间和活动结束时间再开时时间和结束时间有交集的活动 想法&#xff1a; 前后一段时间内遇到了类似取交集的&#xff0c;从网上找到了两种写法&#xff0c;再结合GPT等…