SpringBoot完成查询和增加功能(简易版)

news2025/8/12 5:50:36

目录

一、环境准备

1、db

2、html

打开前端开发工具HBuilder X,把准备好的前端spboot移进去:

接着查看电脑的mvn版本,选中项目右键:

npm -version

npm i​

3、java

 在弹出的窗口中选择你需要导入的项目,点击ok,选择maven

然后去修改maven配置:

再去检查一下application.yml文件和jdbc.properties,看数据库配置是否正确:

最后要注意修改generatorConfig.xml:

二、后台接口定义及测试

开始自动生成代码:

BookMapper类上加@Repository

由于考虑到MySQL数据库里的id有可能是自增的,所以:

 BookMapper :

 BookService :

(把类上的注解@Repository去掉,以及除了查询和增加的其他方法都可以去掉)

BookServiceImpl :

(在类上要添加注解@Service)

BookController :

三、前端页面效果实现

action.js:

接着去访问ElementUI官网:

 复制到BookList.vue再稍作调整: 

查询全部:

模糊查询:​

增加运行效果:


一、环境准备

1、db

 将以上sql脚本文件放在MySQL中去运行:

 2、html

打开前端开发工具HBuilder X,把准备好的前端spboot移进去:

接着查看电脑的mvn版本,选中项目右键:

( 这里我使用的是内置终端)

npm -version

npm i

 

 

 

前端搭建完毕!

 紧接着是搭建后端环境:

3、java

 在弹出的窗口中选择你需要导入的项目,点击ok,选择maven

 

 

去寻找一下电脑中的maven所在地:

 输入mvn -version

然后去修改maven配置

再去检查一下application.yml文件和jdbc.properties,看数据库配置是否正确:

最后要注意修改generatorConfig.xml:

 

以及下面的:

 这样后端环境也搭建完毕!

二、后台接口定义及测试

开始自动生成代码:

 

 生成完毕!

开始编码:

BookMapper类上加@Repository

package com.zking.spboot.mapper;

import com.zking.spboot.model.Book;
import org.springframework.stereotype.Repository;

@Repository
public interface BookMapper {
    int deleteByPrimaryKey(Integer id);

    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}

由于考虑到MySQL数据库里的id有可能是自增的,所以:

 

 BookMapper :

package com.zking.spboot.mapper;

import com.zking.spboot.model.Book;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface BookMapper {


    int deleteByPrimaryKey(Integer id);

    /**
     * 根据书本名称模糊查询书本信息
     * @param book
     * @return
     */
    List<Book> query(Book book);

    /**
     * 新增书本
     * @param record
     * @return
     */
    int insert(Book record);

    int insertSelective(Book record);

    Book selectByPrimaryKey(Integer id);

    int updateByPrimaryKeySelective(Book record);

    int updateByPrimaryKey(Book record);
}

 

然后service层:

 BookService :

(把类上的注解@Repository去掉,以及除了查询和增加的其他方法都可以去掉)

package com.zking.spboot.service;

import com.zking.spboot.model.Book;
import org.springframework.stereotype.Repository;

import java.util.List;


public interface BookService {


    /**
     * 根据书本名称模糊查询书本信息
     * @param book
     * @return
     */
    List<Book> query(Book book);

    /**
     * 新增书本
     * @param record
     * @return
     */
    int insert(Book record);

}

实现接口:

 

BookServiceImpl :

(在类上要添加注解@Service)

package com.zking.spboot.service.impl;

import com.zking.spboot.mapper.BookMapper;
import com.zking.spboot.model.Book;
import com.zking.spboot.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 杨总
 * @create 2022-11-18 1:24
 */
@Service
public class BookServiceImpl implements BookService {

    @Autowired
    private BookMapper bookMapper;

    @Override
    public List<Book> query(Book book) {
        return bookMapper.query(book);
    }

    @Override
    public int insert(Book record) {
        return bookMapper.insert(record);
    }
}

BookController :

package com.zking.spboot.controller;

import com.zking.spboot.model.Book;
import com.zking.spboot.service.BookService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author 杨总
 * @create 2022-11-18 1:27
 */
@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private BookService bookService;

    @RequestMapping("/query")
    public JsonResponseBody<?> query(Book book){
        List<Book> books = bookService.query(book);
        return new JsonResponseBody<>("200","OK",books);
    }

    @RequestMapping("/add")
    public JsonResponseBody<?> add(Book book){
        bookService.insert(book);
        return new JsonResponseBody<>();
    }

    @Data
    @AllArgsConstructor //有参的构造方法
    @NoArgsConstructor //无参的构造方法
    class JsonResponseBody<T>{
        private int code=200;
        private String msg="OK";
        private T data;
    }


}

测试: 

 

三、前端页面效果实现

回到前端HBuilder X:

action.js:

/**
 * 对后台请求的地址的封装,URL格式如下:
 * 模块名_实体名_操作
 */
export default {
	//服务器
	'SERVER': 'http://localhost:8080/spboot', 
	'ALL':'/book/query',
	'ADD':'/book/add',
	//获得请求的完整地址,用于mockjs测试时使用
	'getFullPath': k => {
		return this.SERVER + this[k];
	}
}

 

接着去访问ElementUI官网:

 

 复制到BookList.vue再稍作调整: 

目前页面效果:

 再去官网扩一个表格:

 复制到BookList.vue:

 

目前页面效果:

查询全部:

 模糊查询:

 

接着弄新增,

加一个新增按钮:

 

再去官网扩一份新增的对话框:

 

          

 复制到BookList.vue稍作调整:

 目前点击增加的页面效果:

 

 OK,我们再去官网扩一个做校验的代码:

 

 

 

 

 

增加运行效果:

 

 

 

 

 BookList.vue完整代码:

<template>
	<div>
		<!-- <h1 align="center">SpringBoot阶段机试,ts={{ts}}</h1> -->
		<!-- 1、搜索栏 -->
		<el-form :inline="true">
			<el-form-item label="书本名称">
				<el-input v-model="bookname" placeholder="请输入书本名称"></el-input>
			</el-form-item>
			<el-form-item>
				<el-button type="primary" @click="query">查询</el-button>
				<el-button type="primary" @click="open">新增</el-button>
			</el-form-item>
		</el-form>
		<!-- 2、数据表格 -->
		<el-table :data="tableData" style="width: 100%">
			<el-table-column prop="id" label="书本编号" width="180">
			</el-table-column>
			<el-table-column prop="bookname" label="书本名称" width="180">
			</el-table-column>
			<el-table-column prop="price" label="书本价格">
			</el-table-column>
			<el-table-column prop="booktype" label="书本类型">
			</el-table-column>
		</el-table>
		<!-- 3、弹出框(新增) -->
		<el-dialog @close="close" title="新增书本" :visible.sync="dialogFormVisible">
			<el-form :model="book" :rules="rules" ref="book">
				<el-form-item prop="bookname" label="书本名称" :label-width="formLabelWidth">
					<el-input v-model="book.bookname" autocomplete="off"></el-input>
				</el-form-item>
				<el-form-item prop="price" label="书本价格" :label-width="formLabelWidth">
					<el-input v-model="book.price" autocomplete="off"></el-input>
				</el-form-item>
				<el-form-item prop="booktype" label="书本类型" :label-width="formLabelWidth">
					<el-select style="width: 100%;" v-model="book.booktype" placeholder="===请选择书本类型===">
						<el-option label="悬疑" value="悬疑"></el-option>
						<el-option label="科幻" value="科幻"></el-option>
						<el-option label="喜剧" value="喜剧"></el-option>
						<el-option label="励志" value="励志"></el-option>
						<el-option label="犯罪" value="犯罪"></el-option>
					</el-select>
				</el-form-item>
			</el-form>
			<div slot="footer" class="dialog-footer">
				<el-button @click="dialogFormVisible = false">取 消</el-button>
				<el-button type="primary" @click="save">确 定</el-button>
			</div>
		</el-dialog>
	</div>
</template>

<script>
	export default {
		data: function() {
			return {
				ts: new Date().getTime(),
				bookname: '',
				tableData: [],
				dialogFormVisible: false,
				formLabelWidth: '100px',
				book: {
					bookname: '',
					price: '',
					booktype: ''
				},
				rules: {
					bookname: [{
						required: true,
						message: '请输入书本名称!',
						trigger: 'blur'
					}, ],
					price: [{
						required: true,
						message: '请输入书本价格!',
						trigger: 'blur'
					}, ],
					booktype: [{
						required: true,
						message: '请选择书本类型!',
						trigger: 'change'
					}, ],
				}
			};
		},
		methods: {
			close:function(){
				 this.$refs['book'].resetFields();
			},
			save: function() {
				this.$refs['book'].validate((valid) => {
					if (valid) {
						let url = this.axios.urls.ADD;
						this.axios.post(url, this.book).then(resp => {
							let rs = resp.data;
							if(rs.code==200){
								//关闭对话框
								this.dialogFormVisible=false;
								//刷新列表
								this.query();
							}else{
								
							}
						}).catch(erro => {
							
						});
					} else {
						console.log('error submit!!');
						return false;
					}
				});
			},
			open: function() {
				this.dialogFormVisible = true;
			},
			query: function() {
				// 1、查询参数
				let params = {
					bookname: this.bookname
				}
				//2、请求路径
				let url = this.axios.urls.ALL; // ALL一定注意与action.js对应
				//3、发起请求
				this.axios.post(url, params).then(resp => {
					let rs = resp.data;
					console.log(rs);
					this.tableData = rs.data;
				}).catch(erro => {

				})
			}
		}
	}
</script>

<style>
</style>

今日内容就到这啦!拜拜~

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

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

相关文章

python的网络请求库urllib、urllib2、urllib3、request的联系

文章目录1. 简介2. urllib3. urllib24. urllib35. requests6. 相关文章1. 简介 urllib、urllib2、urllib3、request均能通过网络访问互联网上的资源文件&#xff0c;它们通过使用统一资源定位符&#xff08;URL&#xff09;并结合re模块完成很多意想不到的操作。 urllib&…

数据库与缓存的一致性

数据库与缓存的一致性 一致性就是数据保持一致&#xff0c;在分布式系统中&#xff0c;可以理解为多个节点中数据的值是一致的。 强一致性&#xff1a;这种一致性级别是最符合用户直觉的&#xff0c;它要求系统写入什么&#xff0c;读出来的也会是什么&#xff0c;用户体验好…

Windows系统怎么加密文件夹?

Windows系统是目前使用人数最多的电脑系统&#xff0c;那么你知道在Windows系统上怎么加密文件夹吗&#xff1f;下面这篇文章&#xff0c;将向大家介绍两种Windows系统文件夹加密的方法&#xff0c;希望对你有所帮助。 方法一&#xff1a;使用超级加密3000进行加密 1、打开超级…

C和C++导出DLL后在Csharp中调用函数名的差异

参考链接&#xff1a;cc​​​​​​​在Unity中调用C代码&#xff1a;出现EntryPointNotFoundException的解决办法&#xff1a; - 知乎 (zhihu.com) __declspec(dllexport)的位置问题 - 岚之山 - 博客园 (cnblogs.com) 如果是报如下异常 System.EntryPointNotFoundExceptio…

【GlobalMapper精品教程】017:KML generator快速将坐标转为KML文件

本文介绍KML generator软件,并快速将坐标转为KML文件的使用方法,并用globalmapper中打开kml文件加以验证。本专栏配套完整的案例数据包,请打开data017.rar获取软件及数据。 文章目录 1. KML文件介绍2. kml generator软件介绍2.1 单点KML制作2.2 Excel数据KML制作2.3 文本文件…

【模电实验】【超值1 + 1】【验证性实验——分立元件“OTL“功率放大器实验】【验证性实验——分立元件稳压电源实验】

实验9-1 验证性实验——分立元件"OTL"功率放大器实验 Multisim仿真 编辑分立元件OTL功率放大器的仿真电路如下&#xff1a; 静态工作点的调试与仿真如下&#xff1a; 发射极基极集电极T1277mV998mV5.66VT26.38V6.93V12VT36.20V5.66V0V 交越失真分析如下&#xff1a…

【Linux】OS和进程概念

文章目录1.冯诺依曼体系结构2. 操作系统&#xff08;Operator System &#xff09;概念总结3. 进程描述进程-PCBtask_struct-PCB的一种task_ struct内容分类见见进程1.冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起…

微机原理实验:字符转换为ASCII码

随记&#xff01; 要求&#xff1a; 1. 将指定数据区的字符串数据以ASCII码形式显示在屏幕上&#xff0c;并通过DOS功能调用完成必要提示信息的显示。 2. 在屏幕上显示自己的学号姓名信息。 3. 循环从键盘读入字符并回显在屏幕上&#xff0c;然后显示出对应字符的AS…

JS高级(四):正则表达式、常见的特殊字符、案例、预定义类、正则替换

JavaScript高级&#xff08;四&#xff09;一、正则表达式1.它有什么作用&#xff1f;2.创建正则表达式&#xff08;1&#xff09;利用RegExp对象来创建&#xff08;2&#xff09;利用字面量创建3.测试正则表达式二、特殊字符1.^和$匹配开头和结尾2.[ ]字符类3.量词符三、用户名…

有线热电偶温度验证系统

在本文中&#xff0c;我们将介绍使用有线热电偶温度验证系统的一些优势&#xff0c;并将虹科Ellab的E-Val™ Pro与市场上可用的传统有线系统&#xff08;验证仪&#xff09;进行比较分析。 虹科E-Val Pro是一个高度直观的基于电缆的系统。设计用于各种应用&#xff0c;如冻干、…

数字化时代,企业为什么需要商业智能BI?

数字化时代的到来&#xff0c;数据资产已经成为第五大生产要素&#xff0c;数据是企业生产、经营和决策的重要因素。为提升企业经营状况的感知能力&#xff0c;数据分析应运而生&#xff0c;数据获取的及时性、准确性也需要更加系统些&#xff0c;此时&#xff0c;成熟的商业智…

EasyExcel代码层面设置写出的Excel样式、以及拦截器策略的使用、自动列宽设置、EasyExcel默认设置详解

一、概述 虽然EasyExcel已经提供了一系列注解方式去设置样式。 但是如果没有实体类&#xff0c;或者想要更精确的去设置导出文件的Excel样式的时候就需要在代码层面去控制样式了。 二、使用已有拦截器自定义样式 主要步骤&#xff1a; 创建Excel对应的实体对象创建一个sty…

注意 ! !|95% 的应用程序中发现错误配置和漏洞

业内权威机构 Synopsys 最近发布了一项研究报告&#xff0c;结果表明在进行4300次测试后&#xff0c;发现95%的应用程序中都至少都有一个影响安全的漏洞或配置错误&#xff0c;其中高危漏洞占20%&#xff0c;严重漏洞则占4.5%。在此次研究中&#xff0c;82% 的测试目标是 Web 应…

调用链路上千条,如何观测 Nacos 的运行状态

作者&#xff1a;涌月 背景 随着近年来微服务体系发展&#xff0c;微服务上下游链路的越来越复杂&#xff0c;在阿里云的线上实践场景中&#xff0c;我们发现使用微服务架构的公司的业务动辄会出现上千条调用链路&#xff0c;排查问题代价巨大。 在这种背景下&#xff0c;阿…

灰鸽子木马特征值免杀

文章目录木马特征值免杀一. 木马特征值免杀0x01. 灰鸽子配置生成木马0x02. 使用MyCCL复合特征码定位器反复缩小目标进行定位0x03. 直到定位到很小的区间0x04. 用工具将文件偏移地址0009B9C3转换成内存地址0049C5C30x05. 使用OD跳转特征值语句的执行顺序以实现免杀0x06. 将修改后…

【深入浅出Spring6】第五期——循环依赖和反射机制

一、Bean的循环依赖问题 什么是循环依赖&#xff1f; 类似于A依赖B&#xff0c;B又依赖A&#xff0c;这样就构成了依赖闭环 需求&#xff1a;我们创建两个类&#xff0c;彼此内置对方为私有属性&#xff0c;我们查看是否可以正常输出 $ singleton setter产生的循环依赖 编写我…

(八)Bean的生命周期

文章目录环境什么是Bean的生命周期为什么要知道Bean的生命周期Bean生命周期之5步Bean生命周期之7步Bean生命周期之10步三个点位详解&#xff1a;点位1点位2点位3演示程序Bean的作用域不同&#xff0c;管理方式不同自己new的对象如何让Spring管理上一篇&#xff1a;&#xff08;…

UE4 回合游戏项目 20- 添加人物被攻击的动画

在上一节&#xff08;UE4 回合游戏项目 19- 添加血量UI&#xff09;基础上继续添加人物被攻击时播放被攻击动画的功能。 效果&#xff1a;&#xff08;当玩家被攻击时&#xff0c;播放相应的受到伤害的动画&#xff09; 步骤&#xff1a; 1.打开“1lantu”&#xff0c;在事件图…

艾美捷试剂级SM-102解决方案

LNP是一种多组分系统&#xff0c;通常由可电离脂质或阳离子类脂质化合物、辅助脂质、胆固醇、保护剂聚乙二醇-脂质共轭物组成。 脂质纳米颗粒&#xff08;LNP&#xff09;是mRNA药物常用的载体。目前&#xff0c;BioNTech/辉瑞和 Moderna的mRNA疫苗都采用LNP作为运输载体&#…

SpringMVC ---- RESTful

SpringMVC ---- RESTful1. RESTful简介a>资源b>资源c>资源2. RESTful的实现3. HiddenHttpMethodFilter1. RESTful简介 REST&#xff1a;Representational State Transfer&#xff0c;表示层资源状态转移。 a>资源 资源是一种看待服务器的方式&#xff0c;即&…