整合springboot、mybatis-plus、做的电影的增删改查以及使用七牛云做图片的上传

news2024/12/24 9:54:31

一、建表

1.在数据库testdb库中新建一个movie表
2.表中的字段:
  • mo_id
  • mo_name
  • mo_actor
  • mo_sales
  • pic_name

二、编写代码

1.第一步添加坐标
    <properties>
        <java.version>8</java.version>
    </properties>
    <dependencies>
        <!--spring+springMVC-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--导入七牛云需要坐标-->
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>qiniu-java-sdk</artifactId>
            <version>7.2.25</version>
        </dependency>
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>3.14.2</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.5</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.qiniu</groupId>
            <artifactId>happy-dns-java</artifactId>
            <version>0.1.6</version>
            <scope>test</scope>
        </dependency>
        <!--文件上传-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>
        <!--试图-->
        <dependency>
            <groupId>com.jfinal</groupId>
            <artifactId>enjoy</artifactId>
            <version>5.0.3</version>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.29</version>
        </dependency>
        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
2.第二步编写配置文件
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/testdb?serverTimezone=GMT
    username: root
    password: 123456
  servlet:
    multipart:
      max-request-size: 10MB
      max-file-size: 50MB
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3.第三步编写enjoy视图页面的配置类
package com.ztt.springboot_movie.config;

import com.jfinal.template.Engine;
import com.jfinal.template.ext.spring.JFinalViewResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @version 1.0
 * @Author 甜甜
 * @since 2024/8/12
 */
@Configuration
public class SpringBootConfig {

    @Bean(name = "jfinalViewResolver")
    public JFinalViewResolver getJFinalViewResolver() {

        // 创建用于整合 spring boot 的 ViewResolver 扩展对象
        JFinalViewResolver jfr = new JFinalViewResolver();

        // 对 spring boot 进行配置
        jfr.setSuffix(".html");
        jfr.setContentType("text/html;charset=UTF-8");
        jfr.setOrder(0);

        // 设置在模板中可通过 #(session.value) 访问 session 中的数据
        jfr.setSessionInView(true);

        // 获取 engine 对象,对 enjoy 模板引擎进行配置,配置方式与前面章节完全一样
        Engine engine  = JFinalViewResolver.engine;

        // 热加载配置能对后续配置产生影响,需要放在最前面
        engine.setDevMode(true);

        // 使用 ClassPathSourceFactory 从 class path 与 jar 包中加载模板文件
        engine.setToClassPathSourceFactory();

        // 在使用 ClassPathSourceFactory 时要使用 setBaseTemplatePath
        // 代替 jfr.setPrefix("/view/")
        engine.setBaseTemplatePath("/templates/");


        // 更多配置与前面章节完全一样
        // engine.addDirective(...)
        // engine.addSharedMethod(...);

        return jfr;
    }
}
4.第四步编写实体类Movie

        因为导入了lombok的坐标以及下载了lombok插件,所以不用写有参无参构造方法、getter、setter、toString方法,直接在类上标注解即可;同时数据库表中的字段必须与实体类中的属性一致,假如数据库中的字段为mo_id而实体类中的属性为moId(小驼峰)两者才会映射上。

@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("movie")
public class Movie {
    @TableId(value = "mo_id",type = IdType.AUTO)
    private int moId;
    @TableField(value = "mo_name")
    private String moName;
    @TableField(value = "mo_actor")
    private String moActor;
    @TableField(value = "mo_sales")
    private String moSales;
    @TableField(value = "pic_name")
    private String picName;


    @TableField(exist = false)//此属性与数据库无关
    private MultipartFile pic;//接受文件

}
5.第五步编写mapper映射器

        新建一个mapper包里面新建一个mapperMovie接口,继承公共的数据访问层BaseMapper<Movie>

@Mapper
public interface MovieMapper extends BaseMapper<Movie> {
}
5.第五步业务层接口以及实现类

        新建一个service包里面新建一个IMovieService接口,继承公共的业务层IService<Movie>

public interface IMovieService extends IService<Movie> {
}

        编写接口的实现类MovieServiceImp,继承公共的业务实现类实现业务层接口中定义的方法

@Service
public class MovieServiceImp extends ServiceImpl<MovieMapper, Movie> implements IMovieService{

}
6.第六步编写控制层代码
@Controller
public class MovieController {


    @Autowired
    IMovieService service;

    //访问首页
    @RequestMapping("/show")
    public String show() {
        return "save";
    }
7.第七步编写前端页面主页面save.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <center>
      <form action="/save" method="post" enctype="multipart/form-data">
        <table border="1px" width="500px">
          <tr>
            <td align="center" colspan="2">新增</td>
          </tr>
          <tr>
            <td>名称</td>
            <td><input name="moName"/></td>
          </tr>
          <tr>
            <td>演员</td>
            <td><input name="moActor"/></td>
          </tr>
          <tr>
            <td>票房(w)</td>
            <td><input name="moSales"/></td>
          </tr>
          <tr>
            <td>图片</td>
            <td><input name="pic" type="file"/></td>
          </tr>
          <tr>
            <td align="center" colspan="2">
              <input value="新增" type="submit"/>
              <input value="重置" type="reset"/>
            </td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>
8.第八步电影的新增以及将电影图片上传到七牛云
8.1 首先先新建一个工具类util用来写图片上传的代码FileUtil
public class FileUtil {
    public static String uploadFile(MultipartFile file){
        //方式1.将文件upic以流的方式写入当前服务器磁盘(应用服务器)
        //方式2.文件服务器(七牛云)
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        //...其他参数参考类注释
        UploadManager uploadManager = new UploadManager(cfg);
        //...生成上传凭证,然后准备上传
        String accessKey = "HURQbCScsb6FUTMzlKsWLh5kWMO-rznq-FyfnWb-";
        String secretKey = "OpcrtNSw_6dZpt7zgCHz_C11o9QLxX1A6d4Az0nh";
        String bucket = "ztiantian";
        //默认不指定key的情况下,以文件内容的hash值作为文件名
        String key = null;
        String name = null;

        try {
            byte[] uploadBytes = file.getBytes();
            Auth auth = Auth.create(accessKey, secretKey);
            String upToken = auth.uploadToken(bucket);

            try {
                Response response = uploadManager.put(uploadBytes, key, upToken);
                //解析上传成功的结果
                DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
                System.out.println(putRet.key);//获取文件名
                System.out.println(putRet.hash);//获取文件hash值
                name = putRet.key;
            } catch (QiniuException ex) {
                Response r = ex.response;
                System.err.println(r.toString());
                try {
                    System.err.println(r.bodyString());
                } catch (QiniuException ex2) {
                    //ignore
                }
            }
        } catch (Exception ex) {
            //ignore
        }

        return name;

    }
}

    
8.2 在控制层编写新增以及新增查看所有的数据,同时通过session会话将查询到的所有信息显示在页面,将图片也通过session会话显示到页面
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <center>
      <table border="1px" width="500px">
        <tr>
          <td align="center" colspan="6">列表</td>
        </tr>
        <tr>
          <td>编号</td>
          <td>名称</td>
          <td>演员</td>
          <td>票房</td>
          <td>图片</td>
          <td>操作</td>
        </tr>

        #for(mv:session.list)
        <tr>
          <td>#(mv.moId)</td>
          <td>#(mv.moName)</td>
          <td>#(mv.moActor)</td>
          <td>#(mv.moSales)</td>
          <td>
            <a href="/detail?picname=#(mv.picName)">
              <img width="50px" height="30px" src="http://si3mdbjon.hb-bkt.clouddn.com//#(mv.picName)"/>
            </a>
          </td>
          <td>
            <a href="/findById?id=#(mv.moId)">修改</a>
            <a href="/delete?id=#(mv.moId)&name=#(mv.picName)">删除</a>
          </td>
        </tr>
        #end

        <tr>
          <td align="center" colspan="6">
            <a href="/show">返回新增</a>
          </td>
        </tr>
      </table>
    </center>
  </body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

    <img src="http://si3mdbjon.hb-bkt.clouddn.com//#(session.picname)"/>
    <a href="/findAll">返回列表</a>

</body>
</html>
//新增
    @RequestMapping("/save")
    public String save(Movie movie) {
        //1.上传文件
        String name = FileUtil.uploadFile(movie.getPic());
        //2.新增数据库
        movie.setPicName(name);
        service.save(movie);
        return "redirect:findAll";
    }

    //查询所有
    @RequestMapping("/findAll")
    public String findAll(HttpSession session) {
        List<Movie> list = service.list();
        session.setAttribute("list", list);
        return "mlist";
    }
    //图片详情
    @RequestMapping("/detail")
    public String detail(String picname,HttpSession session){
        session.setAttribute("picname",picname);
        return "detail";
    }
8.3 新增结果显示

查看七牛云里查看图片新增成功

9.第九步电影的修改,以及在修改之前根据电影id做一个数据的回显
9.1 在控制层编写修改的代码,同时在修改之前先根据电影的id做一个数据的回显
//ID查询,回显
@RequestMapping("/findById")
public String findById(int id, HttpSession session) {
    Movie oldMovie = service.getById(id);
    session.setAttribute("oldMovie", oldMovie);
    return "update";
}

//修改
@RequestMapping("/update")
public String update(Movie movie) {
service.updateById(movie);
return "redirect:findAll";
}
9.2 编写新增的前端页面
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>Title</title>
  </head>
  <body>
    <center>
      <form action="/update" method="post" enctype="multipart/form-data">
        <table border="1px" width="500px">
          <tr>
            <td align="center" colspan="2">修改</td>
          </tr>
          <tr>
            <td>编号</td>
            <td><input name="moId" value="#(session.oldMovie.moId)" READONLY/></td>
          </tr>
          <tr>
            <td>名称</td>
            <td><input name="moName" value="#(session.oldMovie.moName)"/></td>
          </tr>
          <tr>
            <td>演员</td>
            <td><input name="moActor" value="#(session.oldMovie.moActor)"/></td>
          </tr>
          <tr>
            <td>票房(w)</td>
            <td><input name="moSales" value="#(session.oldMovie.moSales)"/></td>
          </tr>
          <tr>
            <td align="center" colspan="2">
              <input value="修改" type="submit"/>
              <input value="重置" type="reset"/>
            </td>
          </tr>
        </table>
      </form>
    </center>
  </body>
</html>
9.3修改结果显示

观察结果将演员改为张嘉佳11,票房改为10 点击修改按钮,会发现数据修改成功

10.第十步电影的删除以及删除上传在七牛云里面的图片
10.1 首先先新建一个工具类util用来写图片删除的代码FileUtil
public class FileUtil {
    public static void deleteFile(String name){
        //构造一个带指定 Region 对象的配置类
        Configuration cfg = new Configuration(Region.autoRegion());
        //...其他参数参考类注释
        String accessKey = "HURQbCScsb6FUTMzlKsWLh5kWMO-rznq-FyfnWb-";
        String secretKey = "OpcrtNSw_6dZpt7zgCHz_C11o9QLxX1A6d4Az0nh";
        String bucket = "ztiantian";
        String key = name;

        Auth auth = Auth.create(accessKey, secretKey);
        BucketManager bucketManager = new BucketManager(auth, cfg);
        try {
            bucketManager.delete(bucket, key);
        } catch (QiniuException ex) {
            //如果遇到异常,说明删除失败
            System.err.println(ex.code());
            System.err.println(ex.response.toString());
        }

    }
}
10.2 在控制层编写电影删除的代码
//删除
    @RequestMapping("/delete")
    public String delete(@RequestParam("name") String name, int id){
        System.out.println(name);
        FileUtil.deleteFile(name);
        service.removeById(id);
        return "redirect:findAll";
    }
10.3 删除结果显示

观察结果发现编号为29的数据被删除了,同时七牛云里面的图片也被删除

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

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

相关文章

一文带你快速了解——HAProxy负载均衡

一、HAProxy简介 1.1、什么是Haproxy HAProxy是法国开发者 威利塔罗(Willy Tarreau)在2000年使用C语言开发的一个开源软件是一款具备高并发(万级以上)、高性能的TCP和HTTP负载均衡器支持基于cookie的持久性&#xff0c;自动故障切换&#xff0c;支持正则表达式及web状态统计。…

用「画家流水线」的方式理解Transformer中间层

【导读】 Transformer架构层层堆叠&#xff0c;包含十几亿甚至几十亿个参数&#xff0c;这些层到底是如何工作的&#xff1f;当一个新奇的比喻——「画家流水线」&#xff0c;被用于类比并理解Transformer架构的中间层&#xff0c;情况突然变得明朗起来&#xff0c;并引出了一些…

基于 SpringCloud 分布式架构网上商城

目录 1绪论 4 1.1项目研究的背景 4 1.2开发意义 4 1.3课题研究现状 4 1.4项目研究内容与结构 5 2开发技术介绍 6 2.1Java技术 6 2.2 SpringCloud简介 6 2.3MySQL 介绍 7 2.4MySQL环境配置 7 2.5B/S架构 8 3系统分析 9 3.1可行性分析 9 3.1.1技术可行性 9 3.1.2经济可行性 9 3.…

C语言 ——— 结构体类型的声明、自引用、定义以及初始化

目录 结构体的声明 结构体的自引用 结构体的定义以及初始化 结构体的声明 结构体的概念&#xff1a; 结构体是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量 结构体的声明&#xff1a; 结构体声明的关键字&#xff1a;st…

【安卓】Service的基本用法

文章目录 Service简介启动和停止ServiceActivity和Service进行通信 Service简介 新建一个ServiceTest项目&#xff0c;然后右击com.example.servicetest→New→Service→Service。 每个Service中最常用到onCreate()、onStartCommand()和onDestroy()这3个方法其中onCreate()方法…

Tomcat 启动时出现 java.util.zip.ZipException: error in opening zip file

Tomcat启动 java.util.zip.ZipException: error in opening zip file 错误解决 今天做一个Tomcat的Demo时出现了一个小问题&#xff0c;也在网上查询了很多资料&#xff0c;遇到这个问题的人很少&#xff0c;基本上没有遇到过这种情况&#xff0c;在此记录一下。 报错信息 异…

5 C 语言常量的定义和分类、#define 和 const 定义常量的区别

目录 1 什么是常量 2 常量的分类 3 常量的定义 3.1 使用 #define 定义常量 3.1.1 介绍 3.1.2 定义格式 3.1.3 案例演示 3.1.4 执行时机 3.2 const 关键字 3.2.1 介绍 3.2.2 const 定义常量的格式 3.2.3 案例演示 3.2.4 执行时机 3.2.5 注意事项 4 #define 和 co…

Spring事务管理和事务传播机制详解

目录 一.简单理解事务 二.Spring中事务的实现 编程式事务 声明式事务 三.Transactional 详解 ▐ 异常回滚属性 rollbackFor ▐ 事务隔离级别 Isolation ▐ 事务的传播机制 propagation 一.简单理解事务 事务是⼀组操作的集合&#xff0c;是⼀个不可分割的操作。 事务会…

CORS解决前端跨域案例学习

跨域的概念不再解释&#xff0c;直接演示下出现跨域的情况&#xff1a; 前端代码&#xff08;index.html&#xff09;: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conten…

comfyUI工作流也能变现了,“SD变现宝”把工作流转为小程序,重塑内容创作者的商业之路

前言 在数字化浪潮的推动下&#xff0c;内容创作行业正经历着前所未有的变革。如何在这个充满竞争与机遇的时代中脱颖而出&#xff0c;成为每个创作者必须面对的挑战。 SD变现宝&#xff0c;作为ComfyUI的最新插件&#xff0c;凭借其独特的功能与优势&#xff0c;为创作者们开…

赋能未来制造:三品图文档管理软件在大连船推图文档管理中的深度应用与成效

在信息化浪潮席卷全球的今天&#xff0c;企业的研发管理能力已经成为衡量其核心竞争力的重要标尺。三品软件与大连船用推进器有限公司携手合作&#xff0c;成功实施了EDM图文档协同管理系统项目&#xff0c;为企业在激烈的市场竞争中提供强有力的支持&#xff0c;确保其始终处于…

RCE绕过练习

一.了解eval与assert eval与assert区别_eval assert-CSDN博客https://blog.csdn.net/qq_53568983/article/details/129782507 看了php官方文档,assert中提到的许多名词不明白,转而搜索文章,这篇是解释的是最直白的 其中提到eval不是一个函数,是语言构造器,不能被可变函数调用…

Git代码管理规范

1. 简介 git 分支分为集成分支、功能分支和修复分支&#xff0c;分别命名为 develop、feature 和 hotfix&#xff0c;均为单数。不可使用 features、future、hotfixes、hotfixs 等错误名称。 master&#xff08;主分支&#xff0c;永远是可用的稳定版本&#xff0c;不能直接在…

数据中台运营与实战案例集锦(125页PPT)

方案简介&#xff1a; 本篇通过理论讲解与实战案例相结合的方式&#xff0c;深入剖析了数据中台的概念、架构、关键技术、实施路径以及运营策略。内容覆盖从数据中台规划到落地的全过程&#xff0c;包括数据治理、数据资产管理、数据服务化、数据分析与挖掘、以及如何通过数据…

PythonStudio 控件使用常用方式(二十六)TProgressBar

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

MySQL:复杂查询(一)——聚合函数分组查询联合查询01

目录 1、聚合查询 1.1 聚合函数 1.1.1 COUNT() 1.1.2 SUM() 1.1.3 AVG() 1.1.4 MAX()&#xff0c;MIN() 1.2 分组查询 1.2.1 GROUP BY子句 1.2.1.1 round() 1.2.2 HAVING 1.2.3 示例 2、联合查询&#xff08;表连接查询&#xff09; 2.1 内连接 2.1.1 ①取相关表笛…

机器学习——全连接(MLP多层感知机)的理解

全连接即是矩阵乘&#xff0c;因此在transformer中获取QKV理论上是输入与QKV权重矩阵相乘&#xff0c;但实际操作则是使用全连接即nn.Linear()&#xff0c;注意这里的输入和输出都是二维的[batch,d_model]&#xff0c;即每个样本是一维的。

【Echarts】custom自定义图表实现甘特图

效果图 主要注意点&#xff1a; 1、右上角图例visualMap实现 2、visualMap增加formatter 3、series使用custom自定义图表&#xff0c;encode解析四维数组。核心是renderItem方法&#xff0c;必填项&#xff0c;且需要注意要全部定义在options里面&#xff01;&#xff01;&…

程序员如何平衡日常编码工作与提升式学习?

程序员的两难&#xff1a;如何平衡日常编码与持续学习 在科技日新月异、更新迭代迅速的编程世界中&#xff0c;程序员面临的一个重要挑战是如何在繁忙的日常编码工作和持续的专业提升之间找到平衡。是否应当在工作时间全身心投入到项目推进中&#xff0c;还是应该抽出时间学习…

第38篇 冒泡排序<二>

Q&#xff1a;如何设计C语言程序对数组进行降序排列&#xff1f; A&#xff1a;基本原理&#xff1a;通过不断的比较和交换数组中的数据元素&#xff0c;最终使得最大的数据“冒泡”排到到数组最末&#xff0c;并逐步缩小待排序的范围直到所有数据都排列正确位置。首先定义简单…