【SpringMVC】实现增删改查(附源码)
作者:mmseoamin日期:2023-12-11

【SpringMVC】实现增删改查(附源码),第1张

目录

引言

一、前期准备

1.1.搭建Maven环境

1.2.导入pom.xml依赖

1.3.导入配置文件

①jdbc.properties

②generatorConfig.xml

③log4j2.xml

④spring-mybatis.xml

⑤spring-context.xml

⑥spring-mvc.xml

⑦修改web.xml文件

二、逆向生成增删改查

2.1.导入相关util类

①StringUtils.java

②PageBean.java

2.2.aspect切面层

2.3.Mybatis generator逆向生成

2.4.根据生成代码编写Biz层与实现类

三、controller层代码编写

四、前台代码与分页代码

①PageTag.java

②zking.tld

③list.jsp

④edit.jsp

五、案例测试

5.1.模糊查询

5.2.新增

5.3.修改

5.4.删除

5.5.分页


引言

在上一篇文章中我们讲解了Spring MVC的注解、参数传递、返回值和页面跳转的关键步骤,

这篇文章,我来讲解一下利用前面所学知识,实现SpringMVC一个Maven项目的增删改查。

一、前期准备

1.1.搭建Maven环境

        右击项目名➡new➡module

【SpringMVC】实现增删改查(附源码),第2张

         选择maven项目➡选择jdk版本➡选择webapp 

【SpringMVC】实现增删改查(附源码),第3张

         输入项目名 

【SpringMVC】实现增删改查(附源码),第4张

        选择好maven项目的文件位置➡点击添加按钮➡配置好参数  

【SpringMVC】实现增删改查(附源码),第5张

1.2.导入pom.xml依赖

①将标签内容进行替换即可。


        UTF-8
        1.8
        1.8
        3.7.0
        
        
        5.0.2.RELEASE
        
        3.4.5
        
        5.1.44
        
        5.1.2
        
        1.3.1
        
        2.1.1
        2.4.3
        
        2.9.1
        3.2.0
        1.7.13
        
        4.12
        4.0.0
        1.18.2
        1.1.0
        2.10.0
        2.9.0
        1.7.1.RELEASE
        2.9.3
        1.2
        1.1.2
        8.0.47
        1.3.3
        5.0.2.Final
        1.3.2
    
//-------------------------------------------
    
        
        
            org.springframework
            spring-core
            ${spring.version}
        
        
            org.springframework
            spring-beans
            ${spring.version}
        
        
            org.springframework
            spring-context
            ${spring.version}
        
        
            org.springframework
            spring-orm
            ${spring.version}
        
        
            org.springframework
            spring-tx
            ${spring.version}
        
        
            org.springframework
            spring-aspects
            ${spring.version}
        
        
            org.springframework
            spring-web
            ${spring.version}
        
        
            org.springframework
            spring-test
            ${spring.version}
        
        
        
            org.mybatis
            mybatis
            ${mybatis.version}
        
        
        
            mysql
            mysql-connector-java
            ${mysql.version}
        
        
        
            com.github.pagehelper
            pagehelper
            ${pagehelper.version}
        
        
        
            org.mybatis
            mybatis-spring
            ${mybatis.spring.version}
        
        
            org.springframework
            spring-context-support
            ${spring.version}
        
        
        
            org.mybatis.caches
            mybatis-ehcache
            ${mybatis.ehcache.version}
        
        
        
            net.sf.ehcache
            ehcache
            ${ehcache.version}
        
        
            redis.clients
            jedis
            ${redis.version}
        
        
            org.springframework.data
            spring-data-redis
            ${redis.spring.version}
        
        
            com.fasterxml.jackson.core
            jackson-databind
            ${jackson.version}
        
        
            com.fasterxml.jackson.core
            jackson-core
            ${jackson.version}
        
        
            com.fasterxml.jackson.core
            jackson-annotations
            ${jackson.version}
        
        
        
            org.apache.commons
            commons-dbcp2
            ${commons.dbcp2.version}
            
                
                    commons-pool2
                    org.apache.commons
                
            
        
        
            org.apache.commons
            commons-pool2
            ${commons.pool2.version}
        
        
        
            org.springframework
            spring-webmvc
            ${spring.version}
        
        
        
        
        
        
            org.slf4j
            slf4j-api
            ${slf4j.version}
        
        
            org.slf4j
            jcl-over-slf4j
            ${slf4j.version}
            runtime
        
        
        
            org.apache.logging.log4j
            log4j-api
            ${log4j2.version}
        
        
            org.apache.logging.log4j
            log4j-core
            ${log4j2.version}
        
        
        
            org.apache.logging.log4j
            log4j-slf4j-impl
            ${log4j2.version}
        
        
        
            org.apache.logging.log4j
            log4j-web
            ${log4j2.version}
            runtime
        
        
        
            com.lmax
            disruptor
            ${log4j2.disruptor.version}
        
        
        
            junit
            junit
            ${junit.version}
            test
        
        
            javax.servlet
            javax.servlet-api
            ${servlet.version}
            provided
        
        
            org.projectlombok
            lombok
            ${lombok.version}
            provided
        
        
            jstl
            jstl
            ${jstl.version}
        
        
            taglibs
            standard
            ${standard.version}
        
        
            org.apache.tomcat
            tomcat-jsp-api
            ${tomcat-jsp-api.version}
        
        
            commons-fileupload
            commons-fileupload
            ${commons-fileupload.version}
        
        
            org.hibernate
            hibernate-validator
            ${hibernate-validator.version}
        
        
        
            org.apache.shiro
            shiro-core
            ${shiro.version}
        
        
            org.apache.shiro
            shiro-web
            ${shiro.version}
        
        
            org.apache.shiro
            shiro-spring
            ${shiro.version}
        
    

标签内将标签删除(解除版本锁定),加入

可以确保mybatis-generator-maven-plugin在运行时能够正确地将所需的文件复制到目标文件夹中,避免出现缺少文件或配置错误的问题。


        xwzyssm
        
            
            
                src/main/java
                
                    **/*.xml
                
            
            
            
                src/main/resources
                
                    *.properties
                    *.xml
                
            
        
        
            
                
                    org.apache.maven.plugins
                    maven-compiler-plugin
                    ${maven.compiler.plugin.version}
                    
                        ${maven.compiler.source}
                        ${maven.compiler.target}
                        ${project.build.sourceEncoding}
                    
                
                
                    org.mybatis.generator
                    mybatis-generator-maven-plugin
                    1.3.2
                    
                        
                        
                            mysql
                            mysql-connector-java
                            ${mysql.version}
                        
                    
                    
                        true
                    
                
                
                    maven-clean-plugin
                    3.1.0
                
                
                
                    maven-resources-plugin
                    3.0.2
                
                
                    maven-compiler-plugin
                    3.8.0
                
                
                    maven-surefire-plugin
                    2.22.1
                
                
                    maven-war-plugin
                    3.2.2
                
                
                    maven-install-plugin
                    2.5.2
                
                
                    maven-deploy-plugin
                    2.8.2
                
            
        
    

③在pom.xml中,将junit的scope(依赖作用的范围)注释方便我们使用。 

1.3.导入配置文件

导入羡慕之前先将Maven的目录结构补齐

【SpringMVC】实现增删改查(附源码),第6张

①jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://47.100.191.44:3308/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=123
jdbc.password=123

②generatorConfig.xml

将逆向生成的代码所在的包名进行更改即可。




    
    
    
    
    
    
        
        
            
             
        
        
        
        
        
            
            
        
        
        
        
        
            
            
            
            
            
            
            
            
        
        
        
            
            
        
        
        
        
        
        
            
            
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        

③log4j2.xml




    
        
        /root/workspace/lucenedemo/logs
        /root/workspace/lucenedemo/logs/error
        /root/workspace/lucenedemo/logs/warn
        %d{yyyy-MM-dd HH:mm:ss.SSS} [%t-%L] %-5level %logger{36} - %msg%n
    
    
        
        
            
            
            
            
            
        
        
        
        
            
        
        
        
            
            
            
            
                
                
                
                
                
                
            
        
        
            
            
            
                
                
            
            
            
        
        
            
            
            
                
                
                
            
        
    
    
    
        
        
        
        
        
        
        
        
        
        
        
            
            
            
            
        
    

④spring-mybatis.xml



    
    
    
    
    
    
    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    
    
    
    
        
        
        
        
        
        
        
        
            
                
                    
                        
                            helperDialect=mysql
                        
                    
                
            
        
    
    
    
    
        
        
        
        
    
    
        
    
    
    

⑤spring-context.xml



    
    
    

⑥spring-mvc.xml



    
    
    
    
    
    
        
        
        
        
    
    
    

    

⑦修改web.xml文件

该配置文件的作用是创建一个基于Spring MVC框架的Web应用程序,并配置了相关的上下文、监听器和Servlet,以支持Spring的依赖注入和MVC模式的开发。



  Archetype Created Web Application
  
  
  
    contextConfigLocation
    classpath:spring-context.xml
  
  
  
    org.springframework.web.context.ContextLoaderListener
  
  
  
  
    encodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    true
    
      encoding
      UTF-8
    
  
  
    encodingFilter
    /*
  
  
  
    SpringMVC
    org.springframework.web.servlet.DispatcherServlet
    
    
      contextConfigLocation
      classpath:spring-mvc.xml
    
    1
    
    true
  
  
    SpringMVC
    /
  

二、逆向生成增删改查

2.1.导入相关util类

①StringUtils.java

package com.csdn.xw.util;
public class StringUtils {
	// 私有的构造方法,保护此类不能在外部实例化
	private StringUtils() {
	}
	/**
	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isBlank(String s) {
		boolean b = false;
		if (null == s || s.trim().equals("")) {
			b = true;
		}
		return b;
	}
	
	/**
	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
	 * 
	 * @param s
	 * @return
	 */
	public static boolean isNotBlank(String s) {
		return !isBlank(s);
	}
}

②PageBean.java

package com.csdn.xw.util;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
/**
 * @author Java方文山
 * @compay csdn_Java方文山
 * @create 2023-09-07-16:28
 */
public class PageBean {
    private int page = 1;// 页码
    private int rows = 10;// 页大小
    private int total = 0;// 总记录数
    private boolean pagination = true;// 是否分页
    private String url; //保存上一次请求的URL
    private Map paramMap = new HashMap<>();// 保存上一次请求的参数
    /**
     * 初始化pagebean的,保存上一次请求的重要参数
     * @param req
     */
    public void setRequest(HttpServletRequest req) {
//		1.1	需要保存上一次请求的URL
        this.setUrl(req.getRequestURL().toString());
//		1.2	需要保存上一次请求的参数	bname、price
        this.setParamMap(req.getParameterMap());
//		1.3	需要保存上一次请求的分页设置	pagination
        this.setPagination(req.getParameter("pagination"));
//		1.4	需要保存上一次请求的展示条目数
        this.setRows(req.getParameter("rows"));
//		1.5  初始化请求的页码	page
        this.setPage(req.getParameter("page"));
    }
    public void setPage(String page) {
        if(StringUtils.isNotBlank(page))
            this.setPage(Integer.valueOf(page));
    }
    public void setRows(String rows) {
        if(StringUtils.isNotBlank(rows))
            this.setRows(Integer.valueOf(rows));
    }
    public void setPagination(String pagination) {
//		只有在前台jsp填写了pagination=false,才代表不分页
        if(StringUtils.isNotBlank(pagination))
            this.setPagination(!"false".equals(pagination));
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Map getParamMap() {
        return paramMap;
    }
    public void setParamMap(Map paramMap) {
        this.paramMap = paramMap;
    }
    public PageBean() {
        super();
    }
    public int getPage() {
        return page;
    }
    public void setPage(int page) {
        this.page = page;
    }
    public int getRows() {
        return rows;
    }
    public void setRows(int rows) {
        this.rows = rows;
    }
    public int getTotal() {
        return total;
    }
    public void setTotal(int total) {
        this.total = total;
    }
    public void setTotal(String total) {
        this.total = Integer.parseInt(total);
    }
    public boolean isPagination() {
        return pagination;
    }
    public void setPagination(boolean pagination) {
        this.pagination = pagination;
    }
    /**
     * 获得起始记录的下标
     *
     * @return
     */
    public int getStartIndex() {
        return (this.page - 1) * this.rows;
    }
    /**
     * 最大页
     * @return
     */
    public int maxPage() {
//		total % rows == 0 ? total / rows : total / rows +1
        return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
    }
    /**
     * 下一页
     * @return
     */
    public int nextPage() {
//		如果当前页小于最大页,那就下一页为当前页+1;如果不小于,说明当前页就是最大页,那就无需+1
        return this.page < this.maxPage() ? this.page + 1 : this.page;
    }
    /**
     * 上一页
     * @return
     */
    public int previousPage() {
        return this.page > 1 ? this.page - 1 : this.page;
    }
    @Override
    public String toString() {
        return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
    }
}

2.2.aspect切面层

创建一个名为aspect的包,编写一个PageAspect切面类专门来做分页。

PageAspect

package com.csdn.xw.aspect;
import com.csdn.xw.util.PageBean;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import java.util.List;
@Aspect
//代表当前类是切面类
@Component
//代表这个是交给Spring管理
public class PageAspect {
    /**
     * *:返回值
     * *..:无限包
     * *Biz:以Biz结尾的接口名
     * .pager:以pager方法
     * 只要同时匹配上诉四个条件,就会被列为目标对象
     * 上诉配置要生效,代理注释一定要打开:
     * @param args
     * @return
     * @throws Throwable
     */
    @Around("execution(* *..*Biz.*Pager(..))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
        Object[] params = args.getArgs();
        PageBean pageBean = null;
        for (Object param : params) {
            if(param instanceof PageBean){
                pageBean = (PageBean)param;
                break;
            }
        }
        if(pageBean != null && pageBean.isPagination())
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        Object list = args.proceed(params);
        if(null != pageBean && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo((List) list);
            pageBean.setTotal(pageInfo.getTotal()+"");
        }
        return list;
    }
}

 @Around("execution(* *..*Biz.*Pager(..))")`:这是一个注解,表示这个切面将会拦截所有使用了Biz.Pager()`方法的方法,所以我们需要分页的代码在其方法后面,加上Pager并在Biz多传递一个PageBean参数即可。

2.3.Mybatis generator逆向生成

在pom.xml或者generatorConfig.xml处

右击➡Run Maven➡Plugins➡Mybatis-generator-maven-plugin➡单击mybatis-generator:generate

【SpringMVC】实现增删改查(附源码),第7张

 会在根据你配置文件中提供的路径进行逆向生成代码。

2.4.根据生成代码编写Biz层与实现类

由于我们还需要一个模糊查询的方法,所以在StudentMapper.xml中添加一个方法

并在StudentMapper.java添加一个相对应的方法和注解@Repository

StudentBiz

public interface StudentBiz {
    int deleteByPrimaryKey(String sid);
    int insert(Student record);
    int insertSelective(Student record);
    Student selectByPrimaryKey(String sid);
    int updateByPrimaryKeySelective(Student record);
    int updateByPrimaryKey(Student record);
    List selectBySnamePager(Student student,PageBean PageBean);
}

StudentBizImpl

package com.csdn.xw.Biz.Impl;
import com.csdn.xw.Biz.StudentBiz;
import com.csdn.xw.mapper.StudentMapper;
import com.csdn.xw.model.Student;
import com.csdn.xw.util.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * @author Java方文山
 * @compay csdn_Java方文山
 * @create 2023-09-07-16:22
 */
@Service
public class StudentBizImpl implements StudentBiz {
    @Autowired
    private StudentMapper studentMapper;
    @Override
    public int deleteByPrimaryKey(String sid) {
        return studentMapper.deleteByPrimaryKey(sid);
    }
    @Override
    public int insert(Student record) {
        return studentMapper.insert(record);
    }
    @Override
    public int insertSelective(Student record) {
        return studentMapper.insertSelective(record);
    }
    @Override
    public Student selectByPrimaryKey(String sid) {
        return studentMapper.selectByPrimaryKey(sid);
    }
    @Override
    public int updateByPrimaryKeySelective(Student record) {
        return studentMapper.updateByPrimaryKeySelective(record);
    }
    @Override
    public int updateByPrimaryKey(Student record) {
        return studentMapper.updateByPrimaryKey(record);
    }
    @Override
    public List selectBySnamePager(Student student, PageBean PageBean) {
        return studentMapper.selectBySnamePager(student);
    }
}

至此,我们的增删改查加模糊查询的分页所有方法就写完了。

三、controller层代码编写

首先建一个名为web的包,随后建立一个StudentController。

StudentController

@Controller
@RequestMapping("/student")
public class StudentController {
    @Autowired
    private StudentBiz stubiz;
//    增
    @RequestMapping("/add")
    public String add(Student student){
        stubiz.insertSelective(student);
        return "redirect:list";
    }
    //    删
    @RequestMapping("/del")
    public String del(Student student){
        stubiz.deleteByPrimaryKey(student.getSid());
        return "redirect:list";
    }
//    查
    @RequestMapping("/list")
    public String list(Student student, HttpServletRequest request){
        PageBean pageBean=new PageBean();
        pageBean.setRequest(request);
        List students = stubiz.selectBySnamePager(student, pageBean);
        request.setAttribute("slist",students);
        request.setAttribute("pageBean",pageBean);
        return "student/list";
    }
//    改
    @RequestMapping("/edit")
    public String edit(Student student){
        stubiz.updateByPrimaryKeySelective(student);
        return "redirect:list";
    }
//    模糊分页查询
    @RequestMapping("/PreSave")
    public String PreSave(Student student, HttpServletRequest request){
        if(student!=null && student.getSid()!=null){
            Student s = stubiz.selectByPrimaryKey(student.getSid());
            request.setAttribute("s",s);
        }
        return "student/edit";
    }
}

查询这用的是绝对路径,所以还要加上student。

四、前台代码与分页代码

这里我需要用到分页,所以将以前我所编写的自定义分页标签加入。

首先建立一个名为tag的包,将PageTag.java导入

①PageTag.java

package com.csdn.xw.tag;
import com.csdn.xw.util.PageBean;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
import java.io.IOException;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class PageTag extends BodyTagSupport{
	private PageBean pageBean;// 包含了所有分页相关的元素
	
	public PageBean getPageBean() {
		return pageBean;
	}
	public void setPageBean(PageBean pageBean) {
		this.pageBean = pageBean;
	}
	@Override
	public int doStartTag() throws JspException {
//		没有标签体,要输出内容
		JspWriter out = pageContext.getOut();
		try {
			out.print(toHTML());
		} catch (IOException e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
	private String toHTML() {
		StringBuffer sb = new StringBuffer();
//		隐藏的form表单---这个就是上一次请求下次重新发的奥义所在
//		上一次请求的URL
		sb.append("
"); sb.append(" "); // 上一次请求的参数 Map paramMap = pageBean.getParamMap(); if(paramMap != null && paramMap.size() > 0) { Set> entrySet = paramMap.entrySet(); for (Entry entry : entrySet) { // 参数名 String key = entry.getKey(); // 参数值 for (String value : entry.getValue()) { // 上一次请求的参数,再一次组装成了新的Form表单 // 注意:page参数每次都会提交,我们需要避免 if(!"page".equals(key)) { sb.append(" "); } } } } sb.append(""); // 分页条 sb.append("
    "); sb.append("
  • 首页
  • "); sb.append("
  • <
  • ");// less than 小于号 // sb.append("
  • 1
  • "); // sb.append("
  • 2
  • "); sb.append("
  • "+pageBean.getPage()+"
  • "); sb.append("
  • >
  • "); sb.append("
  • 尾页
  • "); sb.append("
  • 到第
  • "); sb.append("
  • 确定
  • "); sb.append("
  • 共"+pageBean.getTotal()+"条
  • "); sb.append("
"); // 分页执行的JS代码 sb.append(""); return sb.toString(); } }

将tld文件导入WEB-INF下

②zking.tld



    
  zking 1.1 core library
  zking core
  1.1
  zking
  http://jsp.veryedu.cn
  
  
  
    page
    com.csdn.xw.tag.PageTag
    JSP
    
        pageBean
        true
        true
    
  
  

③list.jsp

<%--
  Created by IntelliJ IDEA.
  User: 索隆
  Date: 2023/9/8
  Time: 16:32
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>


    
    
    
    学生管理首页
    


<%----%> 新增
学生ID 学生名称 学生年龄 学生性别 操作
${s.sid } ${s.sname } ${s.sage } ${s.ssex } 修改 删除
${pageBean } ${slist}

④edit.jsp

<%--
  Created by IntelliJ IDEA.
  User: 索隆
  Date: 2023/9/8
  Time: 16:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    编辑界面


编辑界面
sid:
sname:
sage:
ssex:

五、案例测试

5.1.模糊查询

【SpringMVC】实现增删改查(附源码),第8张

5.2.新增

【SpringMVC】实现增删改查(附源码),第9张

5.3.修改

【SpringMVC】实现增删改查(附源码),第10张

5.4.删除

【SpringMVC】实现增删改查(附源码),第11张

5.5.分页

【SpringMVC】实现增删改查(附源码),第12张

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

【SpringMVC】实现增删改查(附源码),第13张