SpringMVC之增删改查(CRUD)项目模拟

目录

前言

一、项目模拟部署

1.创建一个Maven项目

2. 导入所需依赖

数据库连接池(jdbc.properties)

加载驱动(spring-mybatis.xml)

配置数据库信息

​编辑

日志文件配置(log4j.xml)

Spring MVC与Mabatis集成配置

spring-context.xml

spring-mvc.xml

3. 生成所需的实体类

二、项目模拟编写

分页工具类(PageBean)

实体类(Movie)

数据访问方法编写文件(MovieMapper.xml)

MovieMapper.java

接口类及接口实现类代码

切片类(PageAspect)

分页助手类(PageTag)

分页标签配置(.tld)

子控制器类(MovieController)

jsp页面代码

list.jsp

edit.jsp

三、页面显示(功能测试)

数据显示

功能模拟

模糊查询

新增

 删除

 修改

注意事项


前言

        在前面几期的有关SpringMVC的博客中,我们对SpringMVC的知识以及运用已经有所了解,但这是远远不够的,如果我们要想要灵活运用SpringMVC的知识到我们的开发中,那必须进行实际运用。今天这期博客给大家带来SpringMVC模拟实现增删改查页面版。

一、项目模拟部署

1.创建一个Maven项目

SpringMVC之增删改查(CRUD)项目模拟_第1张图片

创建好Maven项目之后,我们可以实现创建好一些文件夹由于存放一些文件,用利于我们区分每个文件的作用,使我们的项目条理更加清晰。

2. 导入所需依赖

数据库连接池(jdbc.properties)

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_ssm?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456

注:数据库的连接路径根据自身的数据库而改变,其次是自己数据库连接的账号和密码要和自己电脑安装的数据库连接账号和密码一致,否则无法连接。

加载驱动(spring-mybatis.xml)



    
    
    
    
    

    

    
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
    

    
    
    
        
        
        
        
        
        
        
        
            
                
                    
                        
                            helperDialect=mysql
                        
                    
                
            
        
    

    
    
    
        
        
        
        
    

    
        
    
    
    

该文件是通过获取jdbc.properties文件中的数据库连接信息进行加载,从而加载数据库驱动,实现连接数据库做铺垫,为后续数据库数据传输及操作做准备工作。

配置数据库信息




    
    

    
    

    
    
        
        
            
             
        

        
        

        
        
            
            
        

        
        
        
        
            
            
            
            
            
            
            
            
        

        
        
            
            
        

        
        
        
        
        
            
            
        

        
        
        
        
        
        
        
        
        
        
        
        
        

+


        

该文件中的targetPackage和targetProject根据自身创建的项目的文件路径进行修改,其次是根据自己数据库中的表来配置自己所需要生成对应数据库中表的实体类。

(该文件是实现连接数据库,根据配置的信息从数据库中获取相应的信息生成对应的实体类)

日志文件配置(log4j.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 MVC与Mabatis集成配置

spring-context.xml




    

spring-mvc.xml



    
    

    
    

    
    
        
        
        
        
    

    
     
    

3. 生成所需的实体类

SpringMVC之增删改查(CRUD)项目模拟_第2张图片

SpringMVC之增删改查(CRUD)项目模拟_第3张图片

二、项目模拟编写

分页工具类(PageBean)

package com.yx.utils;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;

public class PageBean implements Serializable {

	private static final long serialVersionUID = 2422581023658455731L;

	//页码
	private int page=1;
	//每页显示记录数
	private int rows=10;
	//总记录数
	private int total=0;
	//是否分页
	private boolean isPagination=true;
	//上一次的请求路径
	private String url;
	//获取所有的请求参数
	private Map map;
	
	public PageBean() {
		super();
	}
	
	//设置请求参数
	public void setRequest(HttpServletRequest req) {
		String page=req.getParameter("page");
		String rows=req.getParameter("rows");
		String pagination=req.getParameter("pagination");
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		this.url=req.getContextPath()+req.getServletPath();
		this.map=req.getParameterMap();
	}
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map getMap() {
		return map;
	}

	public void setMap(Map map) {
		this.map = map;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page&&!"".equals(page.trim()))
			this.page = Integer.parseInt(page);
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows&&!"".equals(rows.trim()))
			this.rows = Integer.parseInt(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 isPagination;
	}
	
	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
	
	public void setPagination(String isPagination) {
		if(null!=isPagination&&!"".equals(isPagination.trim()))
			this.isPagination = Boolean.parseBoolean(isPagination);
	}
	
	/**
	 * 获取分页起始标记位置
	 * @return
	 */
	public int getStartIndex() {
		//(当前页码-1)*显示记录数
		return (this.getPage()-1)*this.rows;
	}
	
	/**
	 * 末页
	 * @return
	 */
	public int getMaxPage() {
		int totalpage=this.total/this.rows;
		if(this.total%this.rows!=0)
			totalpage++;
		return totalpage;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPage() {
		int nextPage=this.page+1;
		if(this.page>=this.getMaxPage())
			nextPage=this.getMaxPage();
		return nextPage;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int getPreivousPage() {
		int previousPage=this.page-1;
		if(previousPage<1)
			previousPage=1;
		return previousPage;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
				+ "]";
	}
}

实体类(Movie)

package com.yx.model;

import lombok.ToString;

@ToString
public class Movie {
    private Integer mid;

    private String mname;

    private Float price;

    public Movie(Integer mid, String mname, Float price) {
        this.mid = mid;
        this.mname = mname;
        this.price = price;
    }

    public Movie() {
        super();
    }

    public Integer getMid() {
        return mid;
    }

    public void setMid(Integer mid) {
        this.mid = mid;
    }

    public String getMname() {
        return mname;
    }

    public void setMname(String mname) {
        this.mname = mname;
    }

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }
}

数据访问方法编写文件(MovieMapper.xml)




  
    
      
      
      
    
  
  
    mid, mname, price
  
  

  

  
    delete from t_mvc_movie
    where mid = #{mid,jdbcType=INTEGER}
  
  
    insert into t_mvc_movie (mid, mname, price
      )
    values (#{mid,jdbcType=INTEGER}, #{mname,jdbcType=VARCHAR}, #{price,jdbcType=REAL}
      )
  
  
    insert into t_mvc_movie
    
      
        mid,
      
      
        mname,
      
      
        price,
      
    
    
      
        #{mid,jdbcType=INTEGER},
      
      
        #{mname,jdbcType=VARCHAR},
      
      
        #{price,jdbcType=REAL},
      
    
  
  
    update t_mvc_movie
    
      
        mname = #{mname,jdbcType=VARCHAR},
      
      
        price = #{price,jdbcType=REAL},
      
    
    where mid = #{mid,jdbcType=INTEGER}
  
  
    update t_mvc_movie
    set mname = #{mname,jdbcType=VARCHAR},
      price = #{price,jdbcType=REAL}
    where mid = #{mid,jdbcType=INTEGER}
  

MovieMapper.java

package com.yx.mapper;

import com.yx.model.Movie;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface MovieMapper {
    int deleteByPrimaryKey(Integer mid);

    int insert(Movie record);

    int insertSelective(Movie record);

    Movie selectByPrimaryKey(Integer mid);

    int updateByPrimaryKeySelective(Movie record);

    int updateByPrimaryKey(Movie record);

    List ListPager(Movie movie);
}

接口类及接口实现类代码

package com.yx.biz;

import com.yx.model.Movie;
import com.yx.utils.PageBean;

import java.util.List;

public interface MovieBiz {
    int deleteByPrimaryKey(Integer mid);

    int insert(Movie record);

    int insertSelective(Movie record);

    Movie selectByPrimaryKey(Integer mid);

    int updateByPrimaryKeySelective(Movie record);

    int updateByPrimaryKey(Movie record);

    List listPager(Movie movie, PageBean pageBean);
}
//=====================以上是接口类代码======================================
//=====================以下是接口实现类代码======================================
package com.yx.biz.Impl;

import com.yx.biz.MovieBiz;
import com.yx.mapper.MovieMapper;
import com.yx.model.Movie;
import com.yx.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-08 21:23
 * 接口实现类
 */
@Service
public class MovieBizImpl implements MovieBiz {
@Autowired
private MovieMapper movieMapper;


    @Override
    public int deleteByPrimaryKey(Integer mid) {
        return movieMapper.deleteByPrimaryKey(mid);
    }

    @Override
    public int insert(Movie record) {
        return movieMapper.insert(record);
    }

    @Override
    public int insertSelective(Movie record) {
        return movieMapper.insertSelective(record);
    }

    @Override
    public Movie selectByPrimaryKey(Integer mid) {
        return movieMapper.selectByPrimaryKey(mid);
    }

    @Override
    public int updateByPrimaryKeySelective(Movie record) {
        return movieMapper.updateByPrimaryKeySelective(record);
    }

    @Override
    public int updateByPrimaryKey(Movie record) {
        return movieMapper.updateByPrimaryKey(record);
    }

    @Override
    public List listPager(Movie movie, PageBean pageBean) {
        return movieMapper.ListPager(movie);
    }
}

切片类(PageAspect)

package com.yx.aspect;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.yx.utils.PageBean;
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;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-08-25 20:00
 */
@Aspect//代表当前类为切片类
@Component//代表当前类交给Spring进行管理   该注解是@Service的父类
public class PageAspect {
/*
 *   * *..*Biz.*Pager(..)
 *   *:代表返回值类型
 *   *..:任意包,不限层级
 *   *Service:以Service结尾的类/或者接口
 *   *Pager:以Pager结尾的方法
 *  符合上述条件,即为目标类或者目标方法
 */

    @Around("execution(* *..*Biz.*Pager(..))")
    public Object invoke(ProceedingJoinPoint args) throws Throwable {
//        实例化分页工具类
        PageBean pageBean=null;
//        获取所有参数
        Object[] ags = args.getArgs();
//        遍历
        for (Object param : ags) {
            if (param instanceof PageBean){
                pageBean= (PageBean) param;
                break;//中断
            }
        }

        if (pageBean !=null && pageBean.isPagination())
             PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
//        执行目标方法a
        Object lst = args.proceed();
        if (pageBean !=null && pageBean.isPagination()){
            PageInfo info = new PageInfo((List) lst);
            pageBean.setTotal((int) info.getTotal());
        }
        return lst;
    }

}

分页助手类(PageTag)

package com.yx.Tag;

import com.yx.utils.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.getMap(); 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)




    
  zking 1.1 core library
  zking core
  1.1
  zking
  http://jsp.veryedu.cn
  
  
  
    page
    com.yx.Tag.PageTag
    JSP
    
        pageBean
        true
        true
    
  
  

子控制器类(MovieController)

package com.yx.web;

import com.yx.biz.MovieBiz;
import com.yx.model.Movie;
import com.yx.utils.PageBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create  2023-09-08 21:56
 */
@Controller
@RequestMapping("/movie")
public class MovieController {
    @Autowired
    private MovieBiz movieBiz;

//    增
   @RequestMapping("/add")
    public String add(Movie movie){

        int i = movieBiz.insertSelective(movie);
        return "redirect:list";
    }

//    删
@RequestMapping("/del/{mid}")
 public String del(@PathVariable("mid") Integer mid){
    int i = movieBiz.deleteByPrimaryKey(mid);
    return "redirect:list";
}
//    改
@RequestMapping("/edit")
public String del(Movie movie){
    int i = movieBiz.updateByPrimaryKeySelective(movie);
    return "redirect:list";
}
//    查
    @GetMapping("/list")
    public String list(Movie movie, HttpServletRequest request){
//    movie接口参数
        PageBean pageBean=new PageBean();
        pageBean.setRequest(request);
        List movies = movieBiz.listPager(movie, pageBean);
        request.setAttribute("lst",movies);
        request.setAttribute("pageBean",pageBean);
//最终跳转到WEB-IEF/movie/list.jsp页面
        return "movie/list";
    }

//    数据回显
     @RequestMapping("/preSave")
    public String preSave(Movie movie, Model model){
      if (movie !=null && movie.getMid() !=null && movie.getMid() != 0){
          Movie m = movieBiz.selectByPrimaryKey(movie.getMid());
          model.addAttribute("m",m);
      }
         return "movie/edit";
     }

}

jsp页面代码

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib uri="http://jsp.veryedu.cn" prefix="z"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>




    
    
    
    博客列表
    


<%-- --%>
新增
电影ID 名称 价格 操作
${b.mid } ${b.mname } ${b.price } 修改 删除

edit.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>




    
    电影编辑界面


电影编号:
电影名称:
电影价格:

三、页面显示(功能测试)

数据显示

SpringMVC之增删改查(CRUD)项目模拟_第4张图片

功能模拟

模糊查询

SpringMVC之增删改查(CRUD)项目模拟_第5张图片

新增

SpringMVC之增删改查(CRUD)项目模拟_第6张图片

 删除

SpringMVC之增删改查(CRUD)项目模拟_第7张图片

 修改

SpringMVC之增删改查(CRUD)项目模拟_第8张图片

注意事项

spring-mvc.xml中的如果被注释了则,运行项目的话则不会显示使用分页功能,因为直接Spring的过滤。注释后运行显示数据如下图所示。

SpringMVC之增删改查(CRUD)项目模拟_第9张图片 

         好了。这就是这期给大家带来模拟事项CRUD增删改查功能实现与SpringMVC相结合的一期博客,后续还会继续更新,希望老铁能三连支持一波。

SpringMVC之增删改查(CRUD)项目模拟_第10张图片 

你可能感兴趣的:(Mybatis,SpringMVC,Spring,java,数据库,spring,intellij-idea)