springmvc实现增删改查(mysql数据库)

news/2024/5/6 2:35:09/文章来源:https://blog.csdn.net/qq_51580852/article/details/127127703

目录

要求:

创建工程:

 大致思路:

配置spring配置文件:

 配置webapp下WEB-INF下的web.xml文件:

现在开始正式的写代码:

dao层:

 service层:

 controller层:

整个项目源代码地址:github仓库地址


效果图:

 

要求:

在数据库创建一个名为BookStore的数据库,在BookStore数据库中添加一个BookInfo表用于存储图书信息表,再往表里面添加一些测试数据、前端页面以表格形式显示所有图书信息、并完成增加添加书籍、修改书籍、删除书籍的功能。
技术要求:

1.必须用JSP和SpringMVC

⒉数据库连接和请求必须要SpringJDBC

创建工程:

 我的完整项目结构:

 大致思路:

点击file,new一个module模板maven,联网加载好,在main文件夹中添加Java包,在Java包中添加一个package我这里叫com.c202001090145.oyh,继续在com.c202001090145.oyh中添加三个同级package,dao,service,controller,再加一个对象类包pojo,主要放置一些对象类。在resources中添加一个spring配置文件。在pop.xml中导入springMVC所需的坐标,因为我们是要开发一个web页面的需要用到servlet,所以先把我们需要的坐标导入。导入坐标后一层一层来,从dao层--->service---->controller.这就是mvc三层结构。

配置spring配置文件:

在resources中new一个XML Configuration File,选择里面的Spring Config类型。我给它取名叫做spring_servlet。

 接下来直接把我的代码复制进去,我会讲每一个配置有什么用滴!

spring_servlet.xml代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><context:component-scan base-package="com.c202001090145.oyh"/><!--    用bean来创建一个类 视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--    为这个类注入两个属性,一个前缀值,一个后缀。以/WEB-INF/jsp/login.jsp为例--><property name="prefix" value="/WEB-INF/jsp/"/><property name="suffix" value=".jsp"/></bean><bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/bookstore?characterEncoding=utf8&amp;serverTimezone=UTC"/><!--        数据库用户名和密码--><property name="username" value="root"/><property name="password" value="1234"/></bean><bean class="org.springframework.jdbc.core.JdbcTemplate" id="jdbcTemplate"><property name="dataSource" ref="dataSource"/></bean></beans>

 第一个bean叫做视图解析器,用于简化Jsp请求路径,name=prefix是前缀的意思,就是你请求的路径前缀是什么,比如我的jsp文件在/WEB-INF/jsp/addbook.jsp,那么我们只需要写/WEB-INF/jsp/这个目录就行,后缀就是.jsp,那么你使用的时候就是直接给一个文件名就好了,后面具体应用会讲到。

第二个bean是与mysql数据库有关,你使用时只需要将3306端口号后面的bookstore改成你自己需要使用的数据库名字就好了

 <property name="url" value="jdbc:mysql://localhost:3306/bookstore?characterEncoding=utf8&amp;serverTimezone=UTC"/>

下面的两行就是你的数据库名和密码,改成你自己的就好了,其他的不用动

 配置webapp下WEB-INF下的web.xml文件:

由于我们要使用mysql链接数据库,所以原来的2.几版本就太低了,我们需要换成4.+版本的 ,只需要复制就好了,其他不用动,这个文件会有完整代码的别急。就是告诉你给你看看~~

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"></web-app>

因为我们是要进行网页请求的,所以我们必须先配好请求拦截器:不先配好的话,就会找不到路径。就像下面那个报错一样

遇到的第一个bug:

报这个错误是因为我的spring配置文件spring_servlet.xml还没有被加载,所以注解@RequestMapping("addbook")没有生效,自然就不会将addbook.jsp的内容映射到addbook的地址去,所以找不到,当然注解默认不生效,必须在spring容器配置文件中加上下面那段话才会生效。

 <context:component-scan base-package="com.hnucm.springmvc"/>

 所以我们为了让spring配置文件能够被加载,我们可以web.xml中进行请求的拦截,这里就相当于vue中的前置路由拦截器,拦截之后我们可以对其进行一些处理,拦截后我们将其交给servlet进行处理,它会生成一个实例化对象,实例化对象会加载它的参数,所以我们可以把spring容器的配置项地址作为参数进行加载。这样页面就可以被映射出来啦。

完整代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--  Tomcat启动时该文家会加载--><servlet><!--    这个名字要和下面那个一致--><servlet-name>springmvc</servlet-name><!--    这个类是springMVc框架提供的继承servlet的类--><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--    拦截之后,就会实例化一个对象,实例化时会加载它的它的参数,--><init-param><param-name>contextConfigLocation</param-name><!--     这个地址加载spring容器配置文件,又因为spring容器中开启了注解,所以注解也会生效 --><param-value>classpath:spring_servlet.xml</param-value></init-param></servlet><!--  拦截下面的请求后交给上面的sevlet处理--><servlet-mapping><!--    这里这个名字可以随便取--><servlet-name>springmvc</servlet-name><!--    下面的/表示拦截所有的带/的请求--><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

现在开始正式的写代码:

下面这句话真的超级重要:

mvc三层结构我们都是先从dao写起,之后在写service层,最后写controller层。但是代码执行时是先controller层转发请求调用service层,然后再service调用dao层。这个就是思路!!!!

我就带着写一个更新的例子哈,后面思路都是一样的,但是完整代码我会给出!!

dao层:

先在dao层new一个接口类,名字叫做BookDao。在里面定义一个方法叫addBooks,他有两个参数,一个是price和name,注意这个是我在数据库中定义的字段名,我的数据库中还定义了一个id,它是主键并且我设置成了自增长我们不用管它。

 继续在dao层中new一个接口实现类,就叫bookDaoImpl.在这个类里面继承BookDao这个接口,我们是在dao层中操作数据库的,所以需要使用spring封装好的一个类JdbcTemplate,他可以更加方便的我们操作数据库。

在这里需要注意的是因为我们操作数据库了,所以你们一定要将数据库改成你们自己的,并且这里你们也要将insert into bookinfo values......中的bookinfo改成你们自己数据库中的表名才可以。

 service层:

写完dao层写service层,在service文件夹下new一个BookService接口类。在这个接口类中定义一个方法,调用该方法就可以调用dao层的数据库,所以这里建议这个方法名直接使用dao层接口中的方法名,我们一在service中调用这个方法就可以知道这方法将会调用dao接口中的哪个方法,所以我们直接将dao层中的BookDao接口类中的

public void addBooks(float price,String name);

直接复制到service层中的BookService接口类中去

我们可以上下对比两个类中的方法,一模一样吧

 继续在service层中new一个接口实现类BookServiceImpl,在该类中继承BookService接口类,继承类自然也要继承类里面的方法,在这里定义一个BookDao 类,因为待会接口调用会用到,我们使用@Autowired实现自动注入对象,就不用new一个对象了,在这里面调用BookDao中的方法

 controller层:

写完service层就继续写controller层,在controller包中new一个bookInfoController类,在这个类中进行请求的转发和调用service 类。

定义一个BookService类,因为待会会调用该类里面的 方法,使用@Autowired实现自动注入,定义一个addbook方法实现地址的映射,可以将addbook.jsp页面的内容映射到带/addbook的地址中去。这个return“addbook”就是addbook.jsp。就是在这里使用了前面讲到的 ’第一个bean叫做视图解析器’     因为这个页面的完整地址是webapp开始到addbook.jsp结束的文件地址,视图解析器就帮我们把前缀和后缀省略了。

addbook.jsp完整代码:

<%--Created by IntelliJ IDEA.User: AdminDate: 2022/9/30Time: 23:38To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>添加书籍数据</h1>
<form action="http://localhost:8080/MyBookStore_war/addbookcommit" method="post"><div>书籍名字:<input name="name"></div><div>书籍价格:<input name="price"></div><input type="submit" value="提交">
</form>
</body>
</html>

然后@RequestMapping的作用是;作用就是映射URL路径,将http的请求地址映射到控制器(controller)类的处理方法上。@RequestMapping("addbook")的作用就是将addbook的请求地址映射到addbook这个方法中的return到的文件地址去。

下面那个@RequestMapping("addbookcommit")中的addbookcommit是我们addbook.jsp页面中写了一个表单,这个表单提交的地址就是http://localhost:8080/MyBookStore_war/addbookcommit。因此可以将其进行拦截处理,然后在这个方法里面调用service层的方法。所以就行成了controller层->service层->dao层。又因为dao层操作数据库所以我们就操作了数据库。

dao层bookInfoController完整代码:
package com.c202001090145.oyh.controller;import com.c202001090145.oyh.pojo.Book;
import com.c202001090145.oyh.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class bookInfoController {@AutowiredBookService bookService;@RequestMapping("addbook")public String addbook(){return "addbook";}@RequestMapping("addbookcommit")public String addbookcommit(Model model, float price, String name){bookService.addBooks(price,name);return "forward:/booklist";}@RequestMapping("booklist")public String booklist(Model model){model.addAttribute("bookList",bookService.getAllBooks());return "booklist";}@RequestMapping("updatebook")public String updatebook(Model model,Book book){model.addAttribute(book);return "updatebook";}@RequestMapping("updatebookcommit")public String updatebookcommit(Model model,Book book){bookService.updatebook(book);return "forward:/booklist";}@RequestMapping("delete")public String delete(int id){bookService.delete(id);return "forward:/booklist";}
}
成功后就将返回booklist.jsp页面。但是我们写到这里是还没有写booklist.jsp页面的,这个页面就是显示数据库所有的 书籍信息,我们没有写写个请求就会先报错,但是没关系,写到这里的我们的数据库添加已经完成了。你可以进入数据库进行查看。后面的查询,删除,更新也和这个差不多,都是一样的步骤,关键还是逻辑和思路。

整个项目源代码地址:
github仓库地址

也可以在我的csdn资源中下载

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

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

相关文章

java web开发(编写第一个servlet程序)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 之前从来没有编写过servlet程序&#xff0c;更没有用tomcat部署过java web程序。所以&#xff0c;趁着IDEA安装好、maven配置好&#xff0c;开始用…

FastDFS模拟场景

新增tracker服务 模拟场景&#xff1a;当多个tracker同时宕机无法恢复时临时添加新的tracker是否可行 实现方案 将之前已有的tracker server的配置文件scp一份到新的机器上&#xff0c;并在新机器上创建store_path对应的目录依次关闭storage server服务在每个storage server中的…

作为一名前端,该如何理解Nginx?

作为一名小前端&#xff0c;只需要好好写代码&#xff0c;至于部署相关的操作&#xff0c;我们通常接触不到&#xff0c;正所谓专业的人干专业的事&#xff0c;我们在工作中并不需要去配置&#xff0c;但这并不代表不需要了解&#xff0c;相信大家都多多少少听过nginx&#xff…

窗口函数OVER(PARTITION BY)详细用法——语法+函数+开窗范围ROWS和RANGE

目录 一、函数写法 二、开窗的窗口范围ROWS与RANGE 1.范围限定用法 2.ROWS和RANGE的区别 (1) ROWS按行数限定 (2) RANGE按数据范围限定 order by 数字 例1 汇总数据范围为&#xff1a;[当前行值,当前行值3] 例2 汇总数据范围为&#xff1a;[当前行值-3,当前行值] o…

较多业步骤场景通用框架

我们工作的大部分时间都在写业务代码&#xff0c;如何写好业务代码必然是我们追求的一大目标&#xff0c;在编程方面&#xff0c;简单、易懂、可扩展性是衡量代码质量的通用标准&#xff0c;所以在工作中&#xff0c;我们能用java将产品经理的想法表达出来还不够&#xff0c;我…

OSCP-Vulnhub靶机记录-LordoftheRoot-walkthrough

靶机地址 https://www.vulnhub.com/entry/lord-of-the-root-101,129/ 交流学习联系&#xff1a;webMsec 靶机安装 主机发现 靶机ip 192.168.160.131 使用nmap扫描后发现只开放了22 ssh 尝试连接ssh 这里需要端口碰撞 再次nmap扫描 1337端口开放apache Dirsearch扫一下 404…

IS-IS 路由选择协议入门

为了理解中间系统一中间系统(IntermediateSystem-to-Intermediate System, IS-IS) 路由选择协议的本质和内在的工作原理&#xff0c;把它放在整个网际协议和相关技术的框架中学习是十分重要的。本章深入IS-IS协议的本质&#xff0c;并且探讨了国际标准化组织(Intemational Orga…

Understanding the Users and Videos by Mining a Novel Danmu Dataset

题目&#xff1a;Understanding the Users and Videos by Mining a Novel Danmu Dataset 作者&#xff1a;Guangyi Lv, Kun Zhang, Le Wu, Enhong Chen, Tong Xu, Qi Liu, and Weidong He 发表&#xff1a;IEEE TRANSACTIONS ON BIG DATA, 2022 切入点&#xff1a;弹幕交流…

C++实现二分法求零点

​目录前言 题目: 一、零点是什么? 二、二分法求零点 1.二分法 2.完整代码 总结 前言 首先,我们要清楚我们是干嘛的;其次,知道原理;最后,才能明白自己要怎么办。明确:用二分法求函数。 题目: 二分法求函数的零点: 有函数: f(x) = x5 - 15 * x4+ 85 * x3- 225 * x2…

十一、动态规划题目相关

学习来源&#xff1a; 代码随香炉&#xff1a;https://www.programmercarl.com/ labuladong算法&#xff1a;https://labuladong.github.io/algo/ 动态规划 动态规划五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历…

炫酷的花式滑块滑动无缝切换特效

&#x1f482; 个人网站:【 海拥】【小霸王游戏机】【大转盘】&#x1f91f; 风趣幽默的前端学习课程&#xff1a;&#x1f449;28个案例趣学前端&#x1f485; 想寻找共同学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习群】【学习文档】&#x1f4ac; 免费且实用的计…

【ML05】Feature Scaling 特征缩放

Feature ScalingFeature Scaling 特征缩放的目的是什么Feature Scaling Method #3Dividing by maximumMean NormalizationZ-Score normalizationFeature Scaling 特征缩放的目的是什么 考虑前两个组图&#xff1a; 组图1&#xff1a;同一辆大货车拉货&#xff0c;同一个函数在…

Flink学习笔记(2)——Flink快速上手

目录 一、Flink快速上手 1.1、环境准备 1.2 创建项目 1.3 编写代码 1.3.1 批处理 1.3.2 流处理 1.4 本章总结 一、Flink快速上手 对 Flink 有了基本的了解后&#xff0c;接下来就要理论联系实际&#xff0c;真正上手写代码了。Flink 底层是 以 Java 编写的&#xff0c;…

计算机网络—物理层

计算机网络—物理层 物理层的基本概念 物理层的作用是要尽可能地屏蔽掉传输媒体和通信手段的差异&#xff0c;使物理层上面的数据链路层感觉不到这些差异&#xff0c;这样就可以使数据链路层只需要考虑如何完成本次的协议和服务&#xff0c;而不必考虑网络具体的传输媒体和通…

切记:Python迭代器只可以读取一次,忽略会有意想不到的麻烦。

Python 官网&#xff1a; https://www.python.org/- ###### Free&#xff1a;大咖免费“ 圣经”教程 《 python 完全自学教程》&#xff0c;不仅仅是基础那么简单……My CSDN主页、My HOT博、My Python 学习个人备忘录好文力荐、老齐教室自学并不是什么神秘的东西 &#xff0c…

Java学习笔记:高级数据过滤

通配符过滤 1、名字以T开头的 SELECT * FROM T_Persons WHERE Name LIKE ‘T%’ 2、名字以ke结尾的 SELECT * FROM T_Persons WHERE Name LIKE ‘%ke’ 3、名字中包含“中”的 SELECT * FROM T_Persons WHERE Name LIKE ‘%中%’ 多值检测 SELECT Age,Name FROM T_…

Java的输入 Scanner in=new Scanner(System.in);

java和c还是有好多不同的地方&#xff0c;需要从头开始认认真真地学 文章目录输入数字输入double输入整型输入字符串判断2个字符串是否相等Java的字符串要用""双引号引起来&#xff0c;而不是单引号输入一维数组输入二维数组输入数字 输入double import java.util.…

算法分析与设计:10 大排序算法大汇总(Java)

冒泡排序 相邻比较并交换位置&#xff0c;将大的数冒泡交换到最后。 /******************************************************************************** 冒泡排序&#xff08;Bubble Sort&#xff09;它重复地走访过要排序的元素&#xff0c;依次比较相邻两个元素&#xf…

E2成都电路板设计_启动保持停止电路的原理

电气技术分享之2 本文介绍电气工程里常见的启动、保持、停止电路的原理。 1、起保停电路的功能 起保停电路实现的功能&#xff1a;按启动按键&#xff0c;电路的负载得电并保持&#xff0c;按停止按键&#xff0c;负载断电。 2、起保停电路所需的元件 起保停电路所需的元件…

matplotlib绘制直方图,饼图,散点图,气泡图,箱型图,雷达图

matplotlib绘制直方图&#xff0c;饼图&#xff0c;散点图&#xff0c;气泡图&#xff0c;箱型图&#xff0c;雷达图一.直方图用10000个正态分布随机数画直方图二.绘制饼图或者圆环图圆环图根据消费支出画圆环图三.绘制散点图或气泡图使用scatter()函数绘制一个散点图&#xff…