SpringBoot案例学习(黑马程序员day10,day11)

1 环境准备:

1.idea 创建spring项目,选择springweb,mybatis framework ,sql drive框架
2.添加pom.xml依赖:

  <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>

3.添加application.properties配置

#驱动类名称
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#数据库连接的url
spring.datasource.url=jdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.username=root
#连接数据库的密码
spring.datasource.password=1234mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#数据封装的转换:驼峰命名和下划线命名的转换
mybatis.configuration.map-underscore-to-camel-case=true

4.添加数据库表格
在这里插入图片描述
5.构建三层架构模块:
在这里插入图片描述

2部门信息管理:

2.1Dept的控制类加入@RestController注解;加入@Slf4j注解生成log对象实现控制台的输出:

类的实现代码:


@Slf4j
@RestController
public class DepContral {@Autowiredprivate DeptService deptService;@GetMapping("/Depts")public Result list(){log.info("输出全部员工信息");List<Dept> li=deptService.list();return Result.success(li);}
}

其中@Autowired实现对服务层的动态注入,
@GetMapping(“/Depts”)实现前端访问的路径以及使用get方式访问。

2.2实现服务层的接口

代码如下:

@Service
public class DeptServieImp implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Overridepublic List<Dept> list() {List<Dept> li  = deptMapper.list();return li;}
}

2.3实现Mapper层次的接口

@Mapper
public interface DeptMapper {@Select("select * from dept;")public List<Dept> list();
}

3实现前端对数据库根据id的删除请求的操作:

控制层:

@DeleteMapping("depts/{id}")public Result delectById(@PathVariable Integer id){//注解获取id的作用deptService.delectById(id);log.info("删除部门表数据{}",id);return Result.success();}

mapper层:

 @Delete("delete from dept where id=#{id}")void delectById(Integer id);

服务层跟查询操作类似:

4实现增加部门操作:

@RequestMapping("/depts")//简化路径书写

控制层

 @PostMappingpublic Result add(@RequestBody Dept dept){deptService.add(dept);return Result.success();}//@RequestBody把前端的json数据封装在一个实体类里

服务层:

 public void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.add(dept);}

mapper层:

@Insert("insert into dept (name, create_time, update_time) values (#{name},#{createTime},#{updateTime})")void add(Dept dept);

3员工信息管理:

3.1员工信息分页展示:

请求路径:/emps,请求参数:页面数和分页展示的数目。
控制层代码:

 @GetMapping("/emps")public Result Page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "5") Integer pageSize){log.info("分页展示员工页面");pageBean pagebean =empService.list(page,pageSize);return Result.success(pagebean);}//@RequestParam接受参数并设置默认值

服务层代码:

  @Overridepublic  pageBean list(Integer page, Integer pageSize) {Long empsum= empMapper.empSum();Integer page1=(page-1)*pageSize;List<Emp> empList=empMapper.list(page1,pageSize);return new pageBean(empsum,empList);}

mapper层代码:

    @Select("select count(*) from emp;")Long empSum();@Select("select * from emp limit  #{page1},#{pageSize};")List<Emp> list(Integer page1, Integer pageSize);

3.2使用pageHelper插件简化分页查询操作:

1:导入分页查询与springBoot整合的插件:

 <groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version>

2:mapper层:

@Select("select * from emp")List<Emp> list(Integer page, Integer pageSize);

3:service层:

@Override
public PageBean page(Integer page, Integer pageSize) {
// 设置分页参数
PageHelper.startPage(page, pageSize);
// 执行分页查询
List<Emp> empList = empMapper.list(name,gender,begin,end);
// 获取分页结果
Page<Emp> p = (Page<Emp>) empList; 
//封装PageBean
PageBean pageBean = new PageBean(p.getTotal(), p.getResult());
return pageBean;
}

3.3员工信息分页条件展示:

1.请求路径不变,传递参数:page,pageSize,name,gender,begin,end
控制层实现:

public class EmpControl {@Autowiredprivate EmpService empService;@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("分页展示员工页面");pageBean pagebean =empService.list(page,pageSize,name,gender,begin,end);return Result.success(pagebean);}
}

服务层实现:

public  pageBean list(Integer page, Integer pageSize,String name, Short gender, LocalDate begin,LocalDate end) {
//        Long empsum= empMapper.empSum();
//        Integer page1=(page-1)*pageSize;PageHelper.startPage(page,pageSize);List<Emp> empList=empMapper.list(name,gender,begin,end);Page<Emp> p=( Page<Emp>)empList;pageBean pagebean = new pageBean(p.getTotal(), p.getResult());return pagebean;}

mapper层实现:

public interface EmpMapper {List<Emp> list(String name, Short gender, LocalDate begin,LocalDate end);
}

使用xml文件实现动态访问:
在source目录下配置与Empmapper同包路径同名得XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.heima.mapper.EmpMapper"><select id="list" resultType="com.heima.poji.Emp">select *from emp<where><if test="name != null and name!= '' ">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select>
</mapper>

3.4员工信息得删除

请求方式为@DeleteMapping("/emps/{ids}")
控制层:

public Result delectById(@PathVariable List<Integer> ids){empService.delectById(ids);log.info("批量删除员工信息");return Result.success();}

主要在mapper层配置xml文件实现动态SQL:

 <delete id="delectById">delete from emp where id in
<foreach collection="ids" close=")" open="(" item="id" separator=",">#{id}
</foreach></delete>

3.5新增员工信息

思路:把请求的json数据封装到实体类Emp中,然后
传递到Mapper层进行数据库的操作。

4图片上传:

在这里插入图片描述

4.1实现本地上传:

4.1.1创建本地上传的Contral类:

@RestController
@Slf4j
public class UpLoadContral {@PostMapping("/upload")public Result Upload(String username, Integer age, MultipartFile image) throws  Exception {log.info("这是图片上传");//spring.servlet.multipart.max-file-size=10MB;//获取原始文件名String originalFilename = image.getOriginalFilename();//构建新的文件名String extname =originalFilename.substring(originalFilename.lastIndexOf("."));//文件扩展名String newFileName = UUID.randomUUID().toString()+extname;//随机名+文件扩展名
//将文件存储在服务器的磁盘目录image.transferTo(new File("C:/Users/22973/Desktop/images/"+newFileName));// image.transferTo(new File("C:/Users/22973/Desktop/images/"+originalFilename));return Result.success();}
}

4.1.2配置文件上传的大小限制:

在application.properties文件下配置

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

4.2实现aliyun上传:

4.2.1开通aliyun的buket存储空间,详情略,

4.2.2引入ailiyun的oss的文件上传工具类:

使用@Component注解,注入成为bean

package com.heima.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;/*** 阿里云 OSS 工具类*/
@Component
public class AliOSSUtils {String endpoint = "https://oss-cn-beijing.aliyuncs.com";// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。//EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填写Bucket名称,例如examplebucket。String accessKeyId = "LTAI5tPQSXovXyuYMLQcenb7";String accessKeySecret = "Ociu2oAVv5FyAHpjL3LMNPiuhWqeDt";String bucketName = "spring-boot-web-study";// 填写Object完整路径,完整路径中不能包含Bucket名称,/*** 实现上传图片到OSS*/public String upload(MultipartFile file) throws IOException {// 获取上传的文件的输入流InputStream inputStream = file.getInputStream();// 避免文件覆盖String originalFilename = file.getOriginalFilename();String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));//上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName, fileName, inputStream);//文件访问路径String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;// 关闭ossClientossClient.shutdown();return url;// 把上传到oss的路径返回}}

4.2.3实现前端的上传页面请求,并且返回请求的图片的url,

使用注解@Autowired private AliOSSUtils aliOSSUtils;导入工具类的bean;

    public Result imageUpload(MultipartFile image) throws Exception {String url = aliOSSUtils.upload(image);return Result.success(url);}

5在application.properties中配置变量的参数:(配置aliyunDucket的位置为例)

添加配置:

aliyun.oss.endpoint=https://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyId=LTAI5tPQSXovXyuYMLQcenb7
aliyun.oss.accessKeySecret=Ociu2oAVv5FyAHpjL3LMNPiuhWqeDt
aliyun.oss.bucketName=spring-boot-web-study

在java类中通过`values(“#{}”)引用

@Value("${aliyun.oss.endpoint}")String endpoint;@Value("${aliyun.oss.accessKeyId}")String accessKeyId;@Value("${aliyun.oss.accessKeySecret}")String accessKeySecret;@Value("${aliyun.oss.bucketName}")String bucketName;

6使用@ConfigurationProperties注解引用配置文件中的参数数据:

6.1创建一个类存储类的成员变量

@Data       //生成get,set方法
@Component  //成为一个bean
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOssObject {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;//变量的名称与配置文件相同
}

6.2 动态注入,引用类的对象进行赋值:

在类中声明类的对象@Autowiredprivate AliOssObject aliOssObject;

在方法中实现引用

  String endpoint = aliOssObject.getEndpoint();String accessKeyId =aliOssObject.getAccessKeyId();String accessKeySecret = aliOssObject.getAccessKeySecret();String bucketName = aliOssObject.getBucketName();

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

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

相关文章

SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作

OLE DB链接器 OLE DB插件下载&#xff1a;https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?viewsql-server-ver16 配置OLE DB Connection Manager 在点击“新建”时&#xff0c;会弹出警告信息“不支持指定的提供程序&#xff0…

【mysql】CommunicationsException: Communications link failure

CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 通信异常&#xff1a;通信链路故障 最后一个成功发送到服务器的数据包是0毫秒前…

数据结构-双向链表

目录 1.带头双向循环链表&#xff1a; 2. 带头双向循环链表的实现&#xff1a; 双向链表初始化&#xff1a; 双向链表打印&#xff1a; 开辟节点函数&#xff1a; 双向链表头插&#xff1a; 双向链表尾插&#xff1a; 双向链表头删&#xff1a; 双向链表尾删&#xff…

HMM与LTP词性标注之马尔科夫模型(HMM原理剖析)

文章目录 问题描述viterbi算法联合概率与条件概率维特比算法实例 问题描述 viterbi算法 联合概率与条件概率 维特比算法实例

界面控件DevExpress WPF PDF Viewer,更快实现应用的PDF文档浏览

DevExpress WPF PDF Viewer控件可以轻松地直接在Windows应用程序中显示PDF文档&#xff0c;而无需在最终用户的机器上安装外部PDF查看器。 P.S&#xff1a;DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress…

【寒武纪(3)】媒体处理系统的系统控制、视频输入和后处理子系统

系统控制 文章目录 系统控制1、配置视频缓存池Video Pool2、配置硬件IP为在线工作&#xff08;不通过DDR数据交互&#xff09;/ 离线工作&#xff08;写入DDR&#xff09;模式3、硬IP可以使用 非Video Block &#xff08;VB&#xff09;内存4、配置是否启动内存传递的压缩 视频…

【Hadoop】YARN容量调度器详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&am…

Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成

专栏集锦&#xff0c;大佬们可以收藏以备不时之需 Spring Cloud实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9270827.html Python 实战专栏&#xff1a;https://blog.csdn.net/superdangbo/category_9271194.html Logback 详解专栏&#xff1a;https:/…

[架构之路-244]:目标系统 - 设计方法 - 软件工程 - 软件开发方法:结构化、面向对象、面向服务、面向组件的开发方法

目录 前言&#xff1a; 一、概述: 软件聚合的程度由简单到复杂 二、主要开发方法详见 2.1 结构化的开发方法 2.2 面对对象的开发方法 2.3 面向服务的开发方法 2.4 面向组件的开发方法 三、不同开发方法比较 3.1 结构化开发方法 3.2 面向对象(OOP)开发方法 3.3 面向服…

【计算机网络】网络层IP协议

文章目录 1. IP协议介绍2. IP报头3. IP的分片和组装4. IP地址网段划分特殊的IP地址子网、局域网、网段的区别IP地址的数量限制 5. 公网IP和私有IP6. NAT技术7. 路由Route 1. IP协议介绍 IP协议&#xff08;Internet Protocol&#xff09;是一种最常用的网络层协议&#xff0c;…

CSS 边框、轮廓线

一、CSS边框&#xff1a; CSS边框属性允许指定一个元素边框的样式和颜色。 1&#xff09;、边框样式&#xff1a;border-style属性用来定义边框的样式&#xff0c;border-style值&#xff1a; 2&#xff09;、边框宽度&#xff1a;border-width属性用于指定边框宽度。指定变宽…

2023-11-07 C语言链接库编译命令

点击 <C 语言编程核心突破> 快速C语言入门 C语言链接库编译命令 前言一、引入库文件, 包括头文件和lib库二、简单示例总结 前言 要解决问题: 一般没有给新手的链接库编译命令学习资料, 然而, 不解决这个问题, 调用库就能折腾到劝退, 我近日回答一个问题, 很简单, 调用…

【 Docker: 数据卷挂载】

背景 Docker只提供了容器运行的必备依赖&#xff0c;但是一些编辑等操作的依赖是不支持的&#xff0c;如vi操作容器内部文件、将静态资源拷贝到容器内来等。 docker pull nginx docker run -d -p 81:80 --namemynginx -v D:/docker/nginx/www:/usr/share/nginx/www -v D:/dock…

柯桥英语培训,商务英语学习,常用口语

欢迎各位小伙伴来到 ——“每个单词我都认识&#xff0c;但我又不认识整个短语”的时候啦&#xff01; “dog”是“狗” “breakfast”是早餐 那“a dogs breakfast”是“狗的早餐”&#xff1f; 狗听了都摇头。 a dogs breakfast是一句英文俚语&#xff0c;指的是无序、混…

LeetCode | 面试题 02.02. 返回倒数第 k 个节点

LeetCode | 面试题 02.02. 返回倒数第 k 个节点 OJ链接 思路&#xff1a;定义两个快慢指针&#xff0c;让快指针先提前走k个节点&#xff0c;然后再让慢结点和快结点一起走&#xff0c;当快指针 NULL时&#xff0c;慢指针就是倒数第k个节点 代码如下&#xff1a; int kthT…

计算机毕业设计java+springboot+vue的旅游攻略平台

项目介绍 本系统结合计算机系统的结构、概念、模型、原理、方法&#xff0c;在计算机各种优势的情况下&#xff0c;采用JAVA语言&#xff0c;结合SpringBoot框架与Vue框架以及MYSQL数据库设计并实现的。员工管理系统主要包括个人中心、用户管理、攻略管理、审核信息管理、积分…

STM32Cube +VSCode开发环境搭建

STM32Cube VSCode开发环境搭建 0.前言一、各种方式对比1.STM32CubeMX CLion2.STM32CubeIDE VSCode STM32 VSCode Extension3.VSCode EIDE插件 二、STM32CubeIDE VSCode STM32 VSCode Extension环境搭建1.需要安装的软件2.相关配置3.编译测试 三、总结 0.前言 工欲善其事&…

最新Next14 路由处理器 Route Handlers

四、使用Next路由处理程序 Next.js Route Handlers I. Next中路由处理程序是什么 ​ 路由处理程序是在用户访问站点路由时执行的功能。它们负责处理对定义的URL或路由的传入HTTP请求&#xff0c;以生成所需的数据。从本质上讲&#xff0c;当用户访问Next.js应用程序中的特定页…

chatglm3-6b部署及微调

chatglm3-6b部署及微调 modelscope: https://modelscope.cn/models/ZhipuAI/chatglm3-6b/filesgithub: https://github.com/THUDM/ChatGLM3镜像: ubuntu20.04-cuda11.8.0-py38-torch2.0.1-tf2.13.0-1.9.4v100 16G现存 单卡 安装 软件依赖 pip install --upgrade pippip ins…

使用IDEA让文本对比不在变的困难

文章目录 前言操作1、IDEA与电脑磁盘任意文件的比较2、项目内部的文件比较3、剪切板比较4、IDEA本地历史比较5、IDEA版本历史对比 前言 在日常实际开发当中我们常常会对一些代码或内容进行比对查看是否有差异&#xff0c;这个时候不需要借用第三方比对插件&#xff0c;在IDEA中…