Springboot-案例 增删改查二

准备

前端程序、后端工程(web/mybatis/mysql/lombok)、数据库
在这里插入图片描述

开发规范

GET:查询
POST:新增
PUT:修改
DELETE:删除
Result.java

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result {private Integer code;//响应码: 1 成功 0 失败private String msg;//响应信息 描述字符串private Object data;//返回数据public static Result success(){ //增删改 成功响应return new Result(1,"success",null);}public static Result success(Object data){ //查询成功 响应return new Result(1,"success",data);}public static Result error(String msg){ //失败响应return new Result(0,msg,null);}
}

在这里插入图片描述

示例1:查询 删除 增加部门
@RestController
@Slf4j
//优化请求路径
@RequestMapping("/depts")
public class DeptController {@Autowiredprivate DeptService deptService;@GetMappingpublic Result list(){log.info("查询部门信息");List<Dept> list = deptService.list();return Result.success(list);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id){log.info("删除部门{}",id);deptService.delete(id);return Result.success();}/** 页面请求参数 @RequestBody* */@PostMappingpublic Result add(@RequestBody Dept dept){log.info("新增部门{}",dept);deptService.add(dept);return Result.success();}
}@Service
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}@Overridepublic void delete(Integer id) {deptMapper.delete(id);}@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.add(dept);}
}public interface DeptService {List<Dept> list();void delete(Integer id);void add(Dept dept);
}@Mapper
public interface DeptMapper {@Select("select * from dept")List<Dept> list();@Delete("delete from dept where id =#{id}")void delete(Integer id);@Insert("insert into dept(name,create_time,update_time) values (#{name},#{createTime},#{updateTime} )" )void add(Dept dept);
}
示例2:员工管理
2.1分页查询(SQL语句查询)
-- 分页查询
-- 参数1:起始索引 = (页码-1)*每页需要展示的数据数
-- 参数2 : 每页展示的数据数
select * from emp limit 0,5;
select * from emp limit 5,5;
@Mapper
public interface EmpMapper {@Select("select count(*) from emp")public Long count();/*** 分页查询* @param start* @param pageSize* @return*/@Select("select * from emp limit #{start},#{pageSize}")public List<Emp> page(Integer start,Integer pageSize);
}@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic PageBean page(Integer page, Integer pageSize) {PageBean pageBean = new PageBean();pageBean.setTotal(empMapper.count());pageBean.setRows(empMapper.page((page-1)*pageSize,pageSize));return pageBean;}
}
分页插件 pageHelper
		<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.3</version></dependency>
 @Overridepublic PageBean page(Integer page, Integer pageSize) {PageHelper.startPage(page,pageSize);List<Emp> list = empMapper.list();Page<Emp> p= (Page<Emp>) list;return new PageBean(p.getTotal(),p.getResult());}
2.2 条件分页查询员工(动态SQL)
select * from emp where username like concat('%','朱','%') and gender =1 and entrydatebetween '2023-10-01' and '2023-10-20' order by update_time desc ;
@RestController
@Slf4j
public class EmpController {@Autowiredprivate EmpService empService;//分页查询 分页参数 page没传递默认1  pageSize 默认10 日期参数 前面加 @DateTimeFormat(pattern = "yyyy-MM-dd")@GetMapping("/emps")public Result page(@RequestParam(defaultValue = "1") Integer page , @RequestParam(defaultValue = "5")Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end){log.info("分页查询,参数{},{},{},{},{},{}",page,pageSize,name,gender,begin,end);PageBean pageBean = empService.page(page,pageSize,name,gender,begin,end );return Result.success(pageBean);}}@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;@Overridepublic PageBean page(Integer page, Integer pageSize, String name, Short gender, LocalDate begin, LocalDate end) {PageHelper.startPage(page,pageSize);List<Emp> list = empMapper.list(name, gender, begin, end);Page<Emp> p= (Page<Emp>) list;return new PageBean(p.getTotal(),p.getResult());}}public interface EmpService {PageBean page(Integer page, Integer pageSize ,String name, Short gender, LocalDate begin, LocalDate end);
}@Mapper
public interface EmpMapper {public List<Emp> list(String name, Short gender, LocalDate begin, LocalDate end);
}xml<select id="list" resultType="com.example.demo.pojo.Emp">select *from emp<where><if test="name != null and name!='' ">username like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydatebetween #{begin} and #{end}</if>order by update_time desc</where></select>
POST 请求错误400
[nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.time.LocalDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value [2023-10-1]; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2023-10-1]]

在这里插入图片描述
注意:postman请求发送日期:严格要求yyyy-MM-dd 格式 2023-10-01

2.3 新增员工
 @PostMappingpublic Result save(@RequestBody Emp emp){log.info("新增员工:{}",emp);empService.save(emp);return Result.success();}@Insert("insert into emp (username,password,gender,image,job,entrydate,dept_id,create_time,update_time) values (#{username},#{password},#{gender},#{image},#{job},#{entrydate},#{deptId},#{createTime},#{updateTime})")void insert(Emp emp);
文件上传
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">姓名:<input type="text" name="username"><br>年龄:<input type="text" name="age"><br>头像:<input type="file" name="image"><br><input type="submit" value="提交">
</form>
</body>
</html>

本地存储

@RestController
@Slf4j
public class UploadController {@PostMapping("/upload")public Result upload(String username, Integer age, MultipartFile image) throws IOException {log.info("文件上传 {},{},{}",username,age,image);String name = image.getOriginalFilename();//原始文件名String s = UUID.randomUUID().toString();image.transferTo(new File("E:\\"+s+name.substring(name.lastIndexOf("."))));return Result.success();}
}

在Springboot 文件上传默认单个最大文件大小为1M。需要上传大文件,配置:

#单个最大上传文件大小
spring.servlet.multipart.max-file-size=10MB
#单个请求最大上传大小(一次可上传多个)
spring.servlet.multipart.max-request-size=100MB

阿里云存储oss
在这里插入图片描述
依赖

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version>
</dependency>java 9.0以上
<dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.3.1</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency><groupId>org.glassfish.jaxb</groupId><artifactId>jaxb-runtime</artifactId><version>2.3.3</version>
</dependency>
@Component
public class AliOSSUtils {private String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private String accessKeyId = "";private String accessKeySecret = "";private String bucketName = "";public String upload(MultipartFile file) throws IOException {//获取上传文件输入流InputStream inputStream = file.getInputStream();//避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);ossClient.putObject(bucketName,fileName,inputStream);String url = endpoint.split("//")[0]+"//"+bucketName+"."+endpoint.split("//")[1]+"/"+fileName;ossClient.shutdown();return url;}
}@Autowiredprivate AliOSSUtils aliOSSUtils;@PostMapping("/upload")public Result upload( MultipartFile image) throws IOException {String url = aliOSSUtils.upload(image);return Result.success(url);}
2.4 修改员工

查找

 //路径参数 id 用@PathVariable@GetMapping("/{id}")public Result getById(@PathVariable Integer id){Emp emp = empService.getById(id);return Result.success(emp);}@Overridepublic Emp getById(Integer id) {return empMapper.getById(id);}Emp getById(Integer id);@Select("select * from emp where id=#{id}")Emp getById(Integer id);

修改

	//根据id根新员工信息@PutMappingpublic Result updateById(@RequestBody Emp emp){empService.updateById(emp);return Result.success();}@Overridepublic void updateById(Emp emp) {emp.setUpdateTime(LocalDateTime.now());empMapper.updateById(emp);}void updateById(Emp emp);
void updateById(Emp emp);
<update id="updateById">update emp<set><if test="username != null and username !=''">username = #{username},</if><if test="password != null and  password !=''">password = #{password},</if><if test="gender !=null ">gender = #{gender},</if><if test="image != null and  image !=''">image = #{image},</if><if test="job!=null">job = #{job},</if><if test="entrydate != null">entrydate = #{entrydate},</if><if test="deptId != null">dept_id = #{deptId},</if><if test="updateTime != null">update_time = #{updateTime}</if></set>where id = #{id}</update>
参数配置 properties

在这里插入图片描述

yml配置

application.yml 或者application.yaml

server:port: 9000

![在
这里插入图片描述](https://img-blog.csdnimg.cn/5ae2da4c42e44a86be204497c3719ac8.png)

yml语法

在这里插入图片描述

#定义对象 /Map集合
user:name: 明太祖age: 22# 数组 List set
hobby:- sing- jump- rap- basketball
spring properties文件替换yml
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=1234
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis.configuration.map-underscore-to-camel-case=truespring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=100MB
aliyun.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
aliyun.oss.accessKeyId=
aliyun.oss.accessKeySecret=
aliyun.oss.bucketName=
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis?useSSL=false&characterEncoding=UTF-8username: rootpassword: 1234servlet:multipart:max-file-size: 10MBmax-request-size: 100MB
#log-impl 日志 cam 驼峰命名
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true#文件上传 multipa#自定义
aliyun:oss:endpoint: https://oss-cn-hangzhou.aliyuncs.comaccessKeyId: accessKeySecret: bucketName: 
@ConfigurationProperties

@value(“${ }”)太繁琐
在这里插入图片描述
使用示例:

@Component
public class AliOSSUtils {@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.accessKeyId}")private String accessKeyId ;@Value("${aliyun.oss.accessKeySecret}")private String accessKeySecret ;@Value("${aliyun.oss.bucketName}")private String bucketName ;public String upload(MultipartFile file) throws IOException {//获取上传文件输入流InputStream inputStream = file.getInputStream();//避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);ossClient.putObject(bucketName,fileName,inputStream);String url = endpoint.split("//")[0]+"//"+bucketName+"."+endpoint.split("//")[1]+"/"+fileName;ossClient.shutdown();return url;}
}
@Component
public class AliOSSUtils {@Autowiredprivate AliOSSProperties aliOSSProperties;public String upload(MultipartFile file) throws IOException {String endpoint = aliOSSProperties.getEndpoint();String accessKeyId = aliOSSProperties.getAccessKeyId();String accessKeySecret = aliOSSProperties.getAccessKeySecret();String bucketName = aliOSSProperties.getBucketName();//获取上传文件输入流InputStream inputStream = file.getInputStream();//避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString()+originalFilename.substring(originalFilename.lastIndexOf("."));OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId,accessKeySecret);ossClient.putObject(bucketName,fileName,inputStream);String url = endpoint.split("//")[0]+"//"+bucketName+"."+endpoint.split("//")[1]+"/"+fileName;ossClient.shutdown();return url;}
}@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;}

警告
在这里插入图片描述
引入依赖

	<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

偶数科技发布实时湖仓数据平台Skylab 5.3版本

近日&#xff0c; 偶数发布了最新的实时湖仓数据平台 Skylab 5.3 版本。Skylab包含七大产品&#xff0c;分别为云原生分布式数据库 OushuDB、数据分析与应用平台 Kepler、数据资产管理平台 Orbit、自动化机器学习平台 LittleBoy、数据工厂 Wasp、数据开发与调度平台 Flow、系统…

鸿蒙HarmonyOS应用开发:扫描仪文件扫描

华为鸿蒙HarmonyOS已经发展到4.0&#xff0c;使用ArkTS作为开发语言。这篇文章结合Dynamsoft Service开发一个简单的鸿蒙应用&#xff0c;用来获取办公室里连接PC的扫描仪(惠普&#xff0c;富士通&#xff0c;爱普生&#xff0c;等)&#xff0c;把文档扫描到手机里。 准备工作…

DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)

在上文中&#xff08;点击这里回顾>>&#xff09;我们主要为大家介绍了DevExpress WPF Pivot Grid组件的超快速枢轴分析功能、Microsoft分析服务等&#xff0c;本文将继续介绍图表透视数据的处理、MVVM支持等。欢迎持续关注我们&#xff0c;探索更多新功能哦~ P.S&#…

【异步爬虫】requests和aiohttp中代理IP的使用

前言 在进行爬虫开发时&#xff0c;我们常常需要使用代理IP来隐藏自己的真实IP地址&#xff0c;以避免被一些网站限制或封禁。requests和aiohttp是两个非常常用的工具&#xff0c;本文将分别介绍如何在它们中使用代理IP&#xff0c;希望可以帮助大家更好地进行异步爬虫开发。 …

电容屏物体识别手工制作

电容屏识别物体效果2 电容屏识别物体效果1 电容屏识别物体效果3 电容屏识别物体效果4 电容识别物理效果5 我们感兴趣的是找到让我们的平面屏幕与物理三维物体和表面交互的方法。 触摸屏无处不在&#xff0c;成千上万的应用程序中有多种设备和屏幕格式&#xff0c;但我们只找到…

STM32的hex文件格式的分析

前言 最近研究Bootloader&#xff0c;通过串口实现STM32程序的更新。需要学习了解STM32的Hex文件格式。在这进行一下总结。 HEX文件格式 我们通过文本形式打开hex文件&#xff0c;可以看到&#xff1a; 这一行就是一条指令数据&#xff0c;这里对数据帧格式进行说明&#xff…

elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮 el-select组件的visible-change 事件&#xff08;下拉框出现/隐藏时触发&#xff09; <el-selectref"select":value"value"placeholder"请选择"visible-change"visibleChange">&…

Kotlin笔记(六):泛型的高级特性

前面学习了Kotlin中的泛型的基本用法,跟Java中的泛型大致相同&#xff0c;Kotlin在泛型方面还提供了不少特有的功能&#xff0c;掌握了这些功能&#xff0c;你将可以更好玩转Kotlin&#xff0c;同时还能实现一些不可思议的语法特性&#xff0c;那么我们自然不能错过这部分内容了…

2023-10-19 LeetCode每日一题(同积元组)

2023-10-19每日一题 一、题目编号 1726. 同积元组二、题目链接 点击跳转到题目位置 三、题目描述 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b…

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401Unauthorized如何播放调用接口

LiveGBS流媒体平台GB/T28181常见问题-安全控制HTTP接口鉴权勾选流地址鉴权后401 Unauthorized如何播放调用接口&#xff1f; 1、安全控制1.1、HTTP接口鉴权1.2、流地址鉴权 2、401 Unauthorized2.1、携带token调用接口2.1.1、获取鉴权token2.1.2、调用其它接口2.1.2.1、携带 Co…

DNS压测工具-dnsperf的安装和使用(centos)

系统调优 系统调优脚本&#xff0c;保存为sh文件&#xff0c;chmod提权后执行即可 #!/bin/sh #系统全局允许分配的最大文件句柄数&#xff1a; sysctl -w fs.file-max2097152 sysctl -w fs.nr_open2097152 echo 2097152 > /proc/sys/fs/nr_open #允许当前会话 / 进程打开文…

【论文笔记】Far3D: Expanding the Horizon for Surround-view 3D Object Detection

原文链接&#xff1a;https://arxiv.org/pdf/2308.09616.pdf 1. 引言 目前的环视图图像3D目标检测方法分为基于密集BEV的方法和基于稀疏查询的方法。前者需要较高的计算量&#xff0c;难以扩展到长距离检测。后者全局固定的查询不能适应动态场景&#xff0c;通常会丢失远距离…

竞赛选题 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

LeetCode13——罗马数字转整数

解题思想&#xff1a; 前后指针 左边比右边小 做减法 左边比右边大 做加法 最后一个数字直接加。 package keepcoding.leetcode.leetcode13;public class Result02 {public static void main(String[] args) {int result romanToInt("XIV");System.out.println(re…

最近又火了!吴恩达《生成式 AI》重磅发布!

吴恩达教授可能是许多人接触 AI 的启蒙课导师吧&#xff0c;在过去的十多年中&#xff0c;他的《Machine Learning》课程已经对数百万的学习者产生了积极影响。 而随着 ChatGPT 的推出&#xff0c;大模型和各类生成式人工智能&#xff08;GenAI&#xff09;技术在行业内外备受…

数据结构:排序

文章目录 1. 预备知识2. 插入排序2.1 直接插入排序2.2 折半插入排序 3. 希尔排序4. 交换排序4.1 冒泡排序4.2 快速排序4.2.1 选取基准值4.2.2 分割策略4.2.3 小数组4.2.4 基于Hoare版本 最后优化 递归版本 快速排序4.2.5 快速排序的非递归版本4.2.6 快速排序的分析 5. 选择排序…

[云原生1.]Docker数据管理与Cgroups资源控制管理

文章目录 1. Docker的数据管理1.1 数据卷1.1.1 示例 1.2 数据卷容器 2. 容器互联3. Cgroups资源控制管理3.1 简介3.2 cgroups的主要功能3.3 cpu时间片的简单介绍3.4 对CPU使用的限制3.4.1 对CPU使用的限制&#xff08;基于单个容器&#xff09;3.4.2 对CPU使用的限制&#xff0…

Linux CentOS 8(网卡的配置与管理)

Linux CentOS 8&#xff08;网卡的配置与管理&#xff09; 目录 一、项目介绍二、命令行三、配置文件四、图形画界面的网卡IP配置4.1 方法一4.2 方法二 一、项目介绍 Linux服务器的网络配置是Linux系统管理的底层建筑&#xff0c;没有网络配置&#xff0c;服务器之间就不能相互…

个微多账号聚合聊天管理如何实现?

在日常工作中&#xff0c;我经常遇到以下问题&#xff1a; 1. 微信号众多&#xff0c;需要频繁切换设备和账号&#xff0c;导致工作效率低下。 2. 无法及时回复客户消息&#xff0c;客户体验不尽如人意。 3. 难以随时掌握员工与客户的沟通情况&#xff0c;导致员工沟通质量难…

利用Python计算彭于晏的BMI

1 问题 彭于晏是众多男生女生心中的男神&#xff0c;那么他的BMI为多少&#xff0c;身体状况如何呢&#xff1f; 2 方法 运用python中数据类型转换&#xff0c;while 循环语句&#xff0c;if/elif/else 条件语句等方法计算彭于晏的BMI&#xff0c;判断他的身体状况。 计算公式…