SpringBoot+MyBatisPlus+MySql+vue2+elementUi的案例、java访问数据库服务、java提供接口服务

文章目录

  • 前言
  • 后端关键代码
  • 前端关键代码
  • 完整代码


前言

1、项目不使用前后端分离。
2、在创建SpringBoot的时候要注意各个插件间的版本问题。
3、后端技术SpringBoot+MyBatisPlus+MySql
4、前端技术vue2+elementUi


后端关键代码

简单介绍

1、数据库名称ssm_db
2、表名称tbl_book


数据表对象文件(Book.java)

tbl_book

package com.example.domain;

import lombok.Data;

@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
    private String description;
}

配置文件(application.yml)

server:
  port: 80

spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC
      username: root
      password: root

mybatis-plus:
  global-config:
    db-config:
      table-prefix: tbl_
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

创建项目后,在resources文件夹下把application的后缀名改为yml


接口文件(BookController.java)

写到这个文件就可以使用Postman进行接口测试了。

package com.example.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.controller.utils.R;
import com.example.domain.Book;
import com.example.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private IBookService bookService;

    @GetMapping
    public R getAll() {
        return new R(true, bookService.list());
    }

    @PostMapping
    public R save(@RequestBody Book book) throws IOException {
//        R r = new R();
//        boolean flag = bookService.save(book);
//        r.setFlag(flag);

//        上面的三行代表这一行
//        new R(bookService.save(book));
//        return r;

//        抛出异常测试
//        if (book.getName().equals("123")) throw new IOException();
        boolean flag = bookService.save(book);

        return new R(flag, flag ? "添加成功^_^!" : "添加失败-_-!");
    }

    @PutMapping
    public R update(@RequestBody Book book) throws IOException {
        boolean flag = bookService.modify(book);

        return new R(flag, flag ? "编辑成功^_^!" : "编辑失败-_-!");
    }

    @DeleteMapping("{id}")
    public R delete(@PathVariable Integer id) {
        boolean flag = bookService.delete(id);

        return new R(flag, flag ? "删除成功^_^!" : "数据同步失败,自动刷新-_-!");
    }

    @GetMapping("{id}")
    public R getById(@PathVariable Integer id) {
        // 数据同步失败,自动刷新
        return new R(true, bookService.getById(id));
    }

//    分页
//    @GetMapping("{currentPage}/{pageSize}")
//    public R getPage(@PathVariable int currentPage, @PathVariable int pageSize) {
//        IPage<Book> page = bookService.getPage(currentPage, pageSize);
//        if (currentPage > page.getPages()) {
//            page = bookService.getPage((int) page.getPages(), pageSize);
//        }
//        return new R(true, page, "查询成功^_^!");
//    }

    //    分页加查询
    @GetMapping("{currentPage}/{pageSize}")
//    可以单独接收,也可以使用集合
//    public R getPage(@PathVariable int currentPage, @PathVariable int pageSize, String name, Book book) {
//    直接使用集合接收参数
    public R getPage(@PathVariable int currentPage, @PathVariable int pageSize, Book book) {
        IPage<Book> page = bookService.getPage(currentPage, pageSize, book);

        if (currentPage > page.getPages()) {
            page = bookService.getPage((int) page.getPages(), pageSize, book);
        }

        System.out.println(page);
        return new R(true, page);
    }
}

技术整合文件(pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>singleFableFullStack</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.4.3</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.6</version>
        </dependency>

        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

前端关键代码

<!DOCTYPE html>
<html>

<head>
    <!-- 页面meta -->
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>SpringBoot+MyBatisPlus整合的SSM案例</title>
    <meta content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no" name="viewport">

    <!-- 引入样式 -->
    <link rel="stylesheet" href="../plugins/elementui/index.css">
    <link rel="stylesheet" href="../plugins/font-awesome/css/font-awesome.min.css">
    <link rel="stylesheet" href="../css/style.css">
</head>

<body class="hold-transition">
<div id="app">
    <div class="content-header">
        <h1>图书管理</h1>
    </div>

    <div class="app-container">
        <div class="box">
            <div class="filter-container">
                <el-input placeholder="图书类别" v-model="pagination.type" style="width: 200px;"
                          class="filter-item" clearable @input="handleInput($event,'type')"></el-input>
                <el-input placeholder="图书名称" v-model="pagination.name" style="width: 200px;"
                          class="filter-item" clearable @input="handleInput($event,'name')"></el-input>
                <el-input placeholder="图书描述" v-model="pagination.description" style="width: 200px;"
                          class="filter-item" clearable @input="handleInput($event,'description')"></el-input>
                <el-button type="info" plain class="dalfBut" @click="handleSearch">查询</el-button>
                <el-button type="success" plain class="butT" @click="handleDialog(undefined, '1')">新建
                </el-button>
            </div>

            <el-table
                    size="small"
                    current-row-key="id"
                    :data="dataList"
                    stripe
                    highlight-current-row
            >
                <el-table-column type="index" align="center" label="序号"></el-table-column>
                <el-table-column prop="type" label="图书类别" align="center"></el-table-column>
                <el-table-column prop="name" label="图书名称" align="center"></el-table-column>
                <el-table-column prop="description" label="描述" align="center"></el-table-column>
                <el-table-column label="操作" align="center">
                    <template slot-scope="scope">
                        <el-button type="primary" plain size="mini" @click="handleDialog(scope.row, '2')">编辑
                        </el-button>
                        <el-button type="danger" plain size="mini" @click="handleDelete(scope.row)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>

            <!--分页组件-->
            <div class="pagination-container">
                <el-pagination
                        class="pagiantion"
                        @current-change="handleCurrentChange"
                        @size-change="handlePageSize"
                        :current-page="pagination.currentPage"
                        :page-size="pagination.pageSize"
                        :page-sizes="[5, 10, 15, 30]"
                        layout="total, sizes, prev, pager, next, jumper"
                        :total="pagination.total">
                </el-pagination>
            </div>

            <!-- 新增/编辑标签弹层 -->
            <div class="add-form">
                <el-dialog :title="dialogTitle==='1'?'新增图书':'编辑图书'" :visible.sync="isDialogAddEdit"
                           @close="handleClose">
                    <el-form :model="formData" :rules="rules" ref="refForm" label-position="right"
                             label-width="100px">
                        <el-row>
                            <el-col :span="12">
                                <el-form-item label="图书类别" prop="type">
                                    <el-input v-model="formData.type"/>
                                </el-form-item>
                            </el-col>

                            <el-col :span="12">
                                <el-form-item label="图书名称" prop="name">
                                    <el-input v-model="formData.name"/>
                                </el-form-item>
                            </el-col>
                        </el-row>

                        <el-row>
                            <el-col :span="24">
                                <el-form-item label="描述">
                                    <el-input v-model="formData.description" type="textarea"></el-input>
                                </el-form-item>
                            </el-col>
                        </el-row>
                    </el-form>

                    <div slot="footer" class="dialog-footer">
                        <el-button @click="isDialogAddEdit=false">取消</el-button>
                        <el-button type="primary" @click="handleSave()">保存</el-button>
                    </div>
                </el-dialog>
            </div>
        </div>
    </div>
</div>
</body>

<!-- 引入组件库 -->
<script src="../js/vue.js"></script>
<script src="../plugins/elementui/index.js"></script>
<script type="text/javascript" src="../js/jquery.min.js"></script>
<script src="../js/axios-0.18.0.js"></script>
<script>
    new Vue({
        el: '#app',
        data: {
            // 当前页要展示的列表数据
            dataList: [],
            // 添加表单是否可见
            isDialogAddEdit: false,
            dialogTitle: '1',
            // 表单数据
            formData: {},
            // 校验规则
            rules: {
                type: [
                    {
                        required: true,
                        message: '图书类别为必填项',
                        trigger: 'blur'
                    }
                ],
                name: [
                    {
                        required: true,
                        message: '图书名称为必填项',
                        trigger: 'blur'
                    }
                ]
            },
            // 分页相关模型数据
            pagination: {
                // 当前页码
                currentPage: 1,
                // 每页显示的记录数
                pageSize: 5,
                // 总记录数
                total: 0,
                type: '',
                name: '',
                description: ''
            },
            // 整页加载
            fullPageLoading: undefined
        },

        // 钩子函数,VUE对象初始化完成后自动执行
        created() {
            // 调用查询全部数据的操作
            this.getAll();
        },

        methods: {
            // 列表加分页查询
            getAll() {
                let {
                        currentPage,
                        pageSize,
                        type,
                        name,
                        description
                    } = this.pagination,
                    param = '';

                param += `?type=${type}&name=${name}&description=${description}`;

                this.handleFullPageLoading('start');
                // 发送异步请求
                axios.get(`/books/${currentPage}/${pageSize}${param}`)
                    .then(({data: {flag, data: {records, total, size, current}}}) => {
                        if (flag) {
                            this.pagination.currentPage = current;
                            this.pagination.pageSize = size;
                            this.pagination.total = total;
                            this.dataList = records;
                        } else {
                            this.$message.error('出错了');
                        }
                    })
                    .finally(() => {
                        this.handleFullPageLoading('stopping');
                    })
                    .catch(() => {
                        this.$message.error('出错了');
                    });
            },

            // 整页(页面)加载
            handleFullPageLoading(type) {
                if (type === 'start') {
                    this.fullPageLoading = this.$loading({
                        lock: true,
                        text: '加载中',
                        spinner: 'el-icon-loading',
                        background: 'rgba(0, 0, 0, 0.5)'
                    });
                } else if (type === 'stopping' && this.fullPageLoading) {
                    this.fullPageLoading.close();
                    this.fullPageLoading = undefined;
                }
            },

            // 打开新增/编辑面板
            handleDialog(row, str) {
                this.dialogTitle = str;
                this.isDialogAddEdit = true;

                if (str === '2') this.getById(row);
            },

            // 关闭新增/编辑面板
            handleClose() {
                this.$refs.refForm.resetFields();
                this.$refs.refForm.clearValidate();
                this.formData = {};
            },

            // 保存
            handleSave() {
                this.$refs.refForm.validate(valid => {
                    if (!valid) return this.$message.warning('必填项内容为空');

                    if (this.dialogTitle === '1') {
                        this.handleAdd();
                    } else {
                        this.handleEdit();
                    }
                });
            },

            // 添加
            handleAdd() {
                axios.post("/books", this.formData)
                    .then(({data: {flag, msg}}) => {
                        if (flag) {
                            this.$message.success(msg);
                            this.getAll();
                            this.isDialogAddEdit = false
                        } else {
                            this.$message.error(msg);
                        }
                    })
                    .catch(() => {
                        this.$message.error('出错了');
                    });
            },

            // 删除
            handleDelete(row) {
                this.$confirm(
                    '此操作永久删除当前信息,是否继续?',
                    '提示',
                    {
                        type: "warning"
                    }
                )
                    .then(() => {
                        axios.delete("/books/" + row.id)
                            .then(({data: {flag, msg}}) => {
                                // 判断当前操作是否成功
                                if (flag) {
                                    this.$message.success(msg);
                                    this.getAll();
                                } else {
                                    this.$message.error(msg);
                                }
                            })
                            .catch(() => {
                                this.$message.error('出错了');
                            });
                    })
                    .catch(() => {
                        this.$message.info('已取消');
                    });
            },

            // 通过id获取数据
            getById(row) {
                axios.get('/books/' + row.id)
                    .then(({data: {flag, data}}) => {
                        if (flag && data !== null) {
                            this.formData = data;
                        } else {
                            this.$message.error('出错了');
                        }
                    })
                    .catch(() => {
                        this.$message.error('出错了');
                    });
            },

            // 编辑
            handleEdit() {
                axios.put("/books", this.formData)
                    .then(({data: {flag, msg}}) => {
                        // 判断当前操作是否成功
                        if (flag) {
                            this.$message.success(msg);
                            this.getAll();
                            this.isDialogAddEdit = false
                        } else {
                            this.$message.error(msg);
                        }
                    })
                    .catch(() => {
                        this.$message.error('出错了');
                    });
            },

            // 切换页码
            handleCurrentChange(currentPage) {
                if (this.pagination.currentPage === currentPage) return false;

                this.pagination.currentPage = currentPage;
                this.$nextTick(() => this.getAll());
            },

            // 页码大小
            handlePageSize(pageSize) {
                if (this.pagination.pageSize === pageSize) return false;

                this.pagination.pageSize = pageSize;
                this.$nextTick(() => this.getAll());
            },

            // 搜索输入框值变化
            handleInput(e, searchField) {
                if (!e) {
                    this.pagination[searchField] = e;
                    this.$nextTick(() => this.getAll());
                }
            },

            // 查询
            handleSearch() {
                let {
                    type,
                    name,
                    description
                } = this.pagination;

                if (type || name || description) this.getAll();
            }
        }
    });
</script>

</html>

完整代码

下载

git clone -b back-end-services https://gitee.com/mssj200224/open-resources.git

项目

1、找到仓库中名为singleFableFullStack文件夹复制出来。
2、使用idea打开项目即可运行。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

火热的大模型AIGC对数据中心存储趋势有什么影响?

随着人工智能和大数据技术的不断发展&#xff0c;业内AIGC&#xff08;人工智能、图形处理和云计算&#xff09;和大模型的发展趋势正在对数据中心存储发展方向产生深远的影响&#xff0c;主要集中对数据量和高性能计算的诉求。 大模型的普及要求数据中心存储具备更大的容量。大…

【模拟】算法实战

文章目录 一、算法原理二、算法实战1. leetcode1576 替换所有的问号2. leetcode495 提莫攻击3. leetcode6 N字形变换4. leetcode38 外观数列5. leetcode1419 数青蛙 三、总结 一、算法原理 模拟就是用计算机来模拟题目中要求的操作&#xff0c;模拟题目通常具有代码量大、操作…

域名信息收集

作用 1.爆破 2.查询资产漏洞 域名联系人信息 1.whois.chinaz.com 2.whois.cnnic.cn/WelcomeServlet 3.kali whois 工具 4.mwhois.chinaz.com 5.http://whois.chinaz.com/reverse 域名反查 6.beian.miit.gov.cn/#/Integrated/index 国家备案系统 7.beian88.com 8.天眼查查询企…

机器学习技术(六)——有监督学习算法之线性回归算法实操

机器学习技术&#xff08;五&#xff09;——有监督学习之线性回归算法实操 引言&#xff1a; 机器学习监督算法是一种基于已有标记数据的学习方法&#xff0c;通过对已知输入和输出数据的学习&#xff0c;建立一个模型来预测新的输入数据的输出。这种算法模仿人类的学习过程&a…

39、springboot的前端静态资源的WebJar支持(bootstrap、jquery等)及自定义图标和首页

★ WebJar支持 Spring Boot支持加载WebJar包中的静态资源&#xff08;图片、JS、CSS&#xff09;&#xff0c; WebJar包中的静态资源都会映射到/webjars/**路径。——这种方式下&#xff0c;完全不需要将静态资源复制到应用的静态资源目录下。只要添加webjar即可。假如在应用的…

生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)

近年来&#xff0c;人工智能领域已经取得突破性进展&#xff0c;对经济社会各个领域都产生了重大影响&#xff0c;结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一&#xff0c;目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…

leetcode 42. 接雨水

2023.8.29 本题可以用双指针做&#xff0c;求出每一列能盛的雨水&#xff0c;再相加即可。不过暴力法会超时&#xff0c;需要优化。 双指针&#xff08;暴力&#xff09;&#xff1a; class Solution { public:int trap(vector<int>& height) {int ans 0;for(int …

MySQL DATE_SUB的实践

函数简介DATE_SUB()函数从DATE或DATETIME值中减去时间值(或间隔)。 下面说明了DATE_SUB()函数的语法&#xff1a; DATE_SUB(start_date,INTERVAL expr unit); DATE_SUB()函数接受两个参数&#xff1a; start_date是DATE或DATETIME的起始值。 expr是一个字符串&#xff0c;用于确…

【计算机视觉】YOLO 入门:训练 COCO128 数据集

一、COCO128 数据集 我们以最近大热的YOLOv8为例&#xff0c;回顾一下之前的安装过程&#xff1a; %pip install ultralytics import ultralytics ultralytics.checks()这里选择训练的数据集为&#xff1a;COCO128 COCO128是一个小型教程数据集&#xff0c;由COCOtrain2017中…

iOS逆向:越狱及相关概念的介绍

在上一篇内容中我们介绍了App脱壳的技术&#xff0c;今天我们来介绍一个和iOS逆向密切相关的知识&#xff1a;越狱。 iOS操作系统的封闭性一直是开发者们关注的焦点之一。为了突破Apple的限制&#xff0c;越狱技术应运而生。本文将深入探讨iOS越狱&#xff0c;包括可越狱的版本…

SaaS多租户系统架构设计

前言&#xff1a;多租户是SaaS&#xff08;Software-as-a-Service&#xff09;下的一个概念&#xff0c;意思为软件即服务&#xff0c;即通过网络提供软件服务。SaaS平台供应商将应用软件统一部署在自己的服务器上&#xff0c;客户可以根据工作的实际需求&#xff0c;通过互联网…

thinkphp6 入门(1)--安装、路由规则、多应用模式

一、安装thinkphp6 具体参考官方文档 安装 ThinkPHP6.0完全开发手册 看云 下面仅列举重要步骤 ThinkPHP6.0的环境要求如下&#xff1a; PHP > 7.2.5 1. 安装Composer 2. 安装稳定版thinkphp 如果你是第一次安装的话&#xff0c;在命令行下面&#xff0c;切换到你的WE…

C++自创题目——第一期

一、题目描述&#xff1a; 在一段时间内&#xff0c;到达港口的船有n艘&#xff0c;其中每艘船的信息包括:到达时间t(表示第t秒)&#xff0c;船上乘客数k&#xff0c;以及k名乘客的国籍。输出前3600s内每艘船上国籍种数&#xff0c;并输出国籍种数最少的船只的到达时间。 二、…

ArcGIS学习总结(19)——要素转点与空间连接(属性表字段映射)

1.在新创建的面矢量数据的属性表中没有对应的字段信息&#xff0c;为了能够和有属性信息的数据进行匹配&#xff0c;使其具有对应字段的信息。 2.需要匹配的矢量文件属性表信息。 3.对新创建的矢量文件执行要素转点&#xff1a;数据管理工具→要素→要素转点。 4.选择分析工…

【leetcode 力扣刷题】字符串翻转合集(全部反转///部分反转)

字符串翻转合集 344. 反转字符串541. 反转字符串Ⅱ151. 反转字符串中的单词剑指 Offer 58 - II. 左旋转字符串反转单词思路循环挪动子串和子串的拼接 344. 反转字符串 题目链接&#xff1a;344. 反转字符串 题目内容&#xff1a; 题目中重点强调了必须原地修改输入数组&#…

应用TortoiseSVN的SubWCRev管理VisualStudio C#项目编译版本号

首先要安装 TortoiseSVN, 并确保TortoiseSVN的bin目录被加入到系统环境变量Path中。 1、拷贝Porperties目录下的文件AssemblyInfo.cs生成副本AssemblyInfo.template, 作为版本管理的模板文件。 2、修改模板文件中的想要管理的版本号信息 // [assembly: AssemblyVersion(&quo…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第五天)MyBatis的注解开发

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录&#xff08;第五天&#xff09;MyBatis的注解开发 ​ 昨天我们深入学习了MyBatis多表之间的关联映射&#xff0c;了解掌握了一对一关联映射&#xff0c;一对多关联映射&#xff0c;嵌套查询方…

【C语言】每日一题(除自身以外数组的乘积)

添加链接描述&#xff0c;链接奉上 方法&#xff1a; 暴力循环:前缀积后缀积&#xff08;分组&#xff09;: 暴力循环: 暴力循换真的是差生法宝&#xff0c;简单好懂&#xff0c;就是不实用&#xff0c;大多数的题目都会超过时间限制&#xff08;无奈&#xff09; 思路&…

postgresql-字符函数

postgresql-字符函数 字符串连接字符与编码字符串长度大小写转换子串查找与替换截断与填充字符串格式化MD5 值字符串拆分字符串反转 字符串连接 concat(str, …)函数用于连接字符串&#xff0c;并且忽略其中的 NULL 参数&#xff1b;concat_ws(sep, str, …) 函数使用指定分隔…