ssm(Spring+SpringMVC+MyBatis)整合: ums

前言

  • 概述 : SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架。
  • 需求:用户的增删改查
    • SSM:spring mvc 、spring、mybatis
    • view:jsp

一、 环境搭建

1.1 数据库

  • 项目名:day06_maven_ssm
  • 数据库:db_20211028
  • 表数据:
# 创建数据库
CREATE DATABASE db_20211028;
# 使用数据库
USE db_20211028;
# 1.1 创建用户表
CREATE TABLE `user` (
  `uid` VARCHAR(32) NOT NULL,
  `username` VARCHAR(20) DEFAULT NULL,	#用户名
  `password` VARCHAR(32) DEFAULT NULL,	#密码
  `name` VARCHAR(20) DEFAULT NULL,		#昵称
  `email` VARCHAR(30) DEFAULT NULL,		#电子邮箱
  `telephone` VARCHAR(20) DEFAULT NULL,	#电话
  `birthday` DATE DEFAULT NULL,			#生日
  `sex` VARCHAR(10) DEFAULT NULL,		#性别
  `state` INT(11) DEFAULT 0,			#状态:0=未激活,1=已激活
  `code` VARCHAR(64) DEFAULT NULL,		#激活码
  PRIMARY KEY (`uid`)
) ;
# 1.2 初始化用户默认数据
INSERT INTO `user` VALUES ('u001','jack','1234','杰克','jack@czxy.com','13612345678','2015-11-04','男',0,NULL);
INSERT INTO `user` VALUES ('u002','rose','1234','肉丝','rose@czxy.com','13612345679','2015-11-05','女',0,NULL);
INSERT INTO `user` VALUES('373eb242933b4f5ca3bd43503c34668b','ccc','ccc','aaa','bbb@store.com','15723689921','2015-11-04','男',0,'9782f3e837ff422b9aee8b6381ccf927bdd9d2ced10d48f4ba4b9f187edf7738'),('3ca76a75e4f64db2bacd0974acc7c897','bb','bb','张三','bbb@store.com','15723689921','1990-02-01','男',0,'1258e96181a9457987928954825189000bae305094a042d6bd9d2d35674684e6'),('62145f6e66ea4f5cbe7b6f6b954917d3','cc','cc','张三','bbb@store.com','15723689921','2015-11-03','男',0,'19f100aa81184c03951c4b840a725b6a98097aa1106a4a38ba1c29f1a496c231'),('c95b15a864334adab3d5bb6604c6e1fc','bbb','bbb','老王','bbb@store.com','15712344823','2000-02-01','男',0,'71a3a933353347a4bcacff699e6baa9c950a02f6b84e4f6fb8404ca06febfd6f'),('f55b7d3a352a4f0782c910b2c70f1ea4','aaa','aaa','小王','aaa@store.com','15712344823','2000-02-01','男',1,NULL);

1.2、导入坐标

<packaging>war</packaging>

   <properties>
       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
       <maven.compiler.source>1.8</maven.compiler.source>
       <maven.compiler.target>1.8</maven.compiler.target>
       <!--声明不需要web.xml文件-->
       <failOnMissingWebXml>false</failOnMissingWebXml>
   </properties>

   <dependencies>

       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-context</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-aspects</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-webmvc</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>
       <!-- 事务 -->
       <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-jdbc</artifactId>
           <version>5.2.4.RELEASE</version>
       </dependency>


       <!-- mysql驱动 -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.24</version>
       </dependency>
       <dependency>
           <groupId>com.alibaba</groupId>
           <artifactId>druid</artifactId>
           <version>1.2.4</version>
       </dependency>
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.7</version>
       </dependency>
       <dependency>
           <groupId>tk.mybatis</groupId>
           <artifactId>mapper</artifactId>
           <version>3.5.2</version>
       </dependency>
       <dependency>
           <groupId>com.github.pagehelper</groupId>
           <artifactId>pagehelper</artifactId>
           <version>3.7.5</version>
       </dependency>

       <!--整合-->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis-spring</artifactId>
           <version>2.0.5</version>
       </dependency>

       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
       </dependency>

       <!-- mvc json -->
       <dependency>
           <groupId>com.fasterxml.jackson.core</groupId>
           <artifactId>jackson-databind</artifactId>
           <version>2.10.2</version>
       </dependency>

       <!--swagger2-->
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger2</artifactId>
           <version>2.7.0</version>
       </dependency>
       <dependency>
           <groupId>io.springfox</groupId>
           <artifactId>springfox-swagger-ui</artifactId>
           <version>2.7.0</version>
       </dependency>


       <!--文件上传-->
       <dependency>
           <groupId>commons-fileupload</groupId>
           <artifactId>commons-fileupload</artifactId>
           <version>1.4</version>
       </dependency>

       <!--jsp相关-->
       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>javax.servlet-api</artifactId>
           <version>3.1.0</version>
           <scope>provided</scope>
       </dependency>
       <dependency>
           <groupId>javax.servlet.jsp</groupId>
           <artifactId>javax.servlet.jsp-api</artifactId>
           <version>2.3.1</version>
           <scope>provided</scope>
       </dependency>

       <dependency>
           <groupId>javax.servlet</groupId>
           <artifactId>jstl</artifactId>
           <version>1.2</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-log4j12</artifactId>
           <version>1.7.10</version>
       </dependency>
   </dependencies>

二、 导入配置类

2.1 mybatis 配置类

public class MyBatisConfiguration {
    /**
     * 配置session工厂
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
        //1 创建 factoryBean
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        //2 设置数据
        // 2.1 数据源
        factoryBean.setDataSource(dataSource);

        // 2.2 驼峰命名
        Configuration configuration = new Configuration();
        configuration.setMapUnderscoreToCamelCase(true);
        factoryBean.setConfiguration(configuration);

        // 2.3 分页插件
        Properties props = new Properties();
        // 设置方言
        props.setProperty("dialect", "mysql");
        // 分页的同时进行count查询
        props.setProperty("rowBoundsWithCount", "true");
        // 分页合理化参数,pageNum<=0 时会查询第一页,pageNum>pages (超过总数时),会查询最后一页
        props.setProperty("reasonable", "true");

//		PageInterceptor pageInterceptor = new PageInterceptor();
//		pageInterceptor.setProperties(props);
        PageHelper pageHelper = new PageHelper();
        pageHelper.setProperties(props);

        factoryBean.setPlugins(new Interceptor[] {pageHelper});

        //3 通过factorybean获得对应
        return factoryBean.getObject();
    }
    /**
     * 映射扫描器
     * @return
     */
    @Bean
    public MapperScannerConfigurer mapperScannerConfigurer(){
        //1 创建
        MapperScannerConfigurer mapperScanner = new MapperScannerConfigurer();
        //2设置包
        mapperScanner.setBasePackage("com.czxy.ssm.mapper");

        return mapperScanner;
    }

}

2.2 Spring 配置类

  • 数据源配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm_db2
jdbc.username=root
jdbc.password=1234
  • 配置类
@ComponentScan(basePackages="com.czxy.ssm.service")
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
public class SpringConfiguration {
    /**
     * 获得properties文件中内容,并注入对应变量
     */
    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;
    /**
     * 配置数据源
     * @return
     */
    @Bean
    public DataSource dataSource(){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(driver);
        druidDataSource.setUrl(url);
        druidDataSource.setUsername(username);
        druidDataSource.setPassword(password);
        return druidDataSource;
    }

    /**
     * 事务管理器
     * @param dataSource
     * @return
     */
    @Bean
    public DataSourceTransactionManager txManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }

}

2.3 Spring MVC 配置类

@Configuration
@ComponentScan(basePackages={"com.czxy.ssm.controller","com.czxy.ssm.resolver"})
@EnableWebMvc
public class MvcConfiguration implements WebMvcConfigurer {

    /**
     * 视图解析器
     * @return
     */
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/pages/",".jsp");
    }
}

2.4 web启动配置类

public class WebInitializer3 implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        //1 配置spring工厂
        AnnotationConfigWebApplicationContext application = new AnnotationConfigWebApplicationContext();
        // 注册所有的配置类
        application.register(MyBatisConfiguration.class);
        application.register(SpringConfiguration.class);
        application.register(MvcConfiguration.class);

        //2 post中文乱码
        FilterRegistration.Dynamic encodingFilter = servletContext.addFilter("encoding", new CharacterEncodingFilter("UTF-8"));
        encodingFilter.addMappingForUrlPatterns(null, true, "/*");

        //3 核心控制器
        ServletRegistration.Dynamic mvcServlet = servletContext.addServlet("springmvc", new DispatcherServlet(application));
        mvcServlet.addMapping("*.action");	//普通项目
        //mvcServlet.addMapping("/");		//RESTFul项目
        mvcServlet.setLoadOnStartup(2);	//tomcat启动时,执行servlet的初始化方法

    }
}

2.5 全局异常配置(异常处理器)

  • 编写自定义异常
  • 运行时异常:RuntimeException 【推荐】,并重新构造方法。不需要对该异常进行处理
  • com.czxy.ssm.exception.CustomException
public class CustomException extends RuntimeException {
    public CustomException() {
        super();
    }

    public CustomException(String message) {
        super(message);
    }

    public CustomException(String message, Throwable cause) {
        super(message, cause);
    }

    public CustomException(Throwable cause) {
        super(cause);
    }

    protected CustomException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
  • 编写 GlobalExceptionResolver 类,用于处理所有异常
  • 编写 custom() 方法用于处理自定义异常
  • 编写 other()方法用于处理,除自定义异常之外的其他异常。
  • com.czxy.ssm.resolver.GlobalExceptionResolver
@ControllerAdvice
public class GlobalExceptionResolver {

    /**
     * 自定义异常处理器
     *
     * @param ce
     * @param model
     * @return
     */
    @ExceptionHandler(CustomException.class)
    public String custom(CustomException ce, Model model) {
        model.addAttribute("error", ce.getMessage());
        return "forward:/pages/error.jsp";
    }

    /**
     * 其他异常处理器
     *
     * @param e
     * @param model
     * @return
     */
    @ExceptionHandler(Exception.class)
    public String other(Exception e, Model model) {
        model.addAttribute("error",e.getMessage());
        return "forward:/pages/error.jsp";
    }
}
  • 异常展示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>错误页面</title>
</head>
<body>
<span style="color: red; size: 30px">${error}</span>
</body>
</html>

三、查询所有

3.1 需求:分页条件查询

3.2 步骤

  • 1、编写javaBean (User)
    • 提供字段 和 表类对应
    • 添加mybatis相关注解
  • 2、编写mapper(UserMapper)
    • 继承通用mapper
  • 3、编写service(UserService、UserServiceImpl)
  • 4、编写controller(UserController)
    • 处理请求路径
    • 选择视图 list
  • 5、list.jsp页面展示

3.3 实现

  • 1、编写javaBean (User、UserVo)
    • 提供字段 和 表类对应
    • 添加mybatis相关注解
    • User
package com.czxy.ssm.domain;

import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;


/**
 * @Author: 小新
 * @Date: 2021-12-14 19:54
 */
@Table(name = "user")
public class User {
    @Id
    private String uid;
    private String username;
    private String password;
    private String name;
    private String email;
    private String telephone;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
    private String sex;
    private Integer state;
    private String code;
    //getter、setter...
  • UserVo
package com.czxy.ssm.vo;

/**
* @Author: 小新
* @Date: 2021-12-16 14:46
*/
public class UserVo {
   private String name;
   private String start;
   private String end;
   private Integer pageNum = 1;
   private Integer pageSize = 2;
   //getteer、setter...
}
  • 2、编写mapper(UserMapper)
    • 继承通用mapper
package com.czxy.ssm.mapper;

import com.czxy.ssm.domain.User;
import tk.mybatis.mapper.common.Mapper;

/**
* @Author: 小新
* @Date: 2021-12-14 19:57
*/
public interface UserMapper extends Mapper<User> {
}
  • 3、编写service(UserService、UserServiceImpl)
    • UserService接口
package com.czxy.ssm.service;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;

/**
* @Author: 小新
* @Date: 2021-12-14 19:57
*/
public interface UserService {
   /**
    * 查询所有
    * @return userVo
    */
   PageInfo<User> selectAll(UserVo userVo);
}
  • 实现类UserServiceImpl
package com.czxy.ssm.service.impl;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:58
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;

    @Override
    public PageInfo<User> selectAll(UserVo userVo) {
        //1、拼凑条件
        Example example = new Example(User.class);
        Example.Criteria criteria = example.createCriteria();
        //2、查询条件
        //2.1 昵称
        if (userVo.getName() != null && !"".equals(userVo.getName())){
            criteria.andLike("name","%"+userVo.getName()+"%");
        }
        //2.2 开始生日时间
        if (userVo.getStart() != null && !"".equals(userVo.getStart())){
            criteria.andGreaterThanOrEqualTo("birthday",userVo.getStart() + " 00:00:00");
        }
        //2.3 结束生日时间
        if (userVo.getEnd() != null && !"".equals(userVo.getEnd())){
            criteria.andLessThanOrEqualTo("birthday",userVo.getEnd() + " 23:59:59");
        }
        //分页条件
        PageHelper.startPage(userVo.getPageNum(),userVo.getPageSize());

        //3、查询
        List<User> list = userMapper.selectByExample(example);
        //4、关联查询
        //5、封装分页数据
        PageInfo<User> pageInfo = new PageInfo<>(list);

        return  pageInfo;
    }
}
  • 4、编写controller(UserController)
    • 处理请求路径
    • 选择视图 list
package com.czxy.ssm.controller;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;

/**
* @Author: 小新
* @Date: 2021-12-14 19:59
*/
@Controller
@RequestMapping("/user")
public class UserController {

   @Resource
   private UserService userService;

   /**
    * 查询所有
    * @param model
    * @return
    */
   @RequestMapping("/selectAll")
   public String selectAll(UserVo userVo , Model model){
       // 查询所有
       PageInfo<User> pageInfo = userService.selectAll(userVo);
       // 将查询结果 、 查询条件 存放request --> 模型
       model.addAttribute("pageInfo",pageInfo);
       model.addAttribute("userVo",userVo);
       // 设置视图名
       return "list";
   }
}
  • 5、list.jsp页面展示
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>列表页面</title>
    <script type="text/javascript">
        //pageSize
        function change(obj) {
            //重置 :如果修改了pageSize 从第1页开始
            pageNumId.value = 1;
            //改变pageSize
            //在js中调用id名时 底层默认执行document.getElementById("pageSize")
            //document.getElementById("pageSize").value = obj.value;  ==  pageSize.value = obj.value;
            pageSize.value = obj.value;
            //提交表单
            //var myForm = document.getElementById("myForm");
            myForm.submit();
        }

        //pageNum
        function page(pageNum) {
            pageNumId.value = pageNum;
            //var myForm = document.getElementById("myForm");
            myForm.submit();
        }
    </script>
</head>
<body>
    <!--错误信息展示-->
<font color="red" size="30">${error}</font>
<a href="${pageContext.request.contextPath}/pages/add.jsp">添加</a>

    <!--查询条件-->
    <form id="myForm" action="${pageContext.request.contextPath}/user/selectAll.action" method="post">
        <!--分页参数-->
        <input type="hidden" id="pageNumId" name="pageNum" value="${pageInfo.pageNum}">
        <input type="hidden" id="pageSize" name="pageSize" value="${pageInfo.pageSize}">
        昵称 : <input type="text" name="name" placeholder="请输入昵称" value="${userVo.name}">
        生日 : <input type="text" name="start" placeholder="请输入开始生日" value="${userVo.start}">
              <input type="text" name="end" placeholder="请输入结束的生日" value="${userVo.end}">
              <input type="submit" value="查询">
    </form>
    <!--列表展示-->
    <table border="1" cellspacing="0">
        <tr>
            <td>编号</td>
            <td>登录名</td>
            <td>密码</td>
            <td>姓名</td>
            <td>邮件</td>
            <td>手机号</td>
            <td>生日</td>
            <td>性别</td>
            <td>状态</td>
            <td>规范</td>
            <td>操作</td>
        </tr>
        <c:forEach items="${pageInfo.list}" var="user">
            <tr>
                <td>
                    <input type="text" name="uid" value="${user.uid}">
                </td>
                <td>
                    <input type="text" name="username" value="${user.username}">
                </td>
                <td>
                    <input type="password" name="password" value="${user.password}">
                </td>
                <td>
                    <input type="text" name="name" value="${user.name}">
                </td>
                <td>
                    <input type="text" name="email" value="${user.email}">
                </td>
                <td>
                    <input type="text" name="telephone" value="${user.telephone}">
                </td>
                <td>
                    <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd" var="birthday"></fmt:formatDate>
                    <input type="text" name="birthday" value="${birthday}">
                </td>
                <td>
                    <input type="checkbox" name="sex" value="男" ${user.sex == "男" ? "checked" : ""}>男
                    <input type="checkbox" name="sex" value="女" ${user.sex == "女" ? "checked" : ""}>女
                </td>
                <td>
                    <input type="text" name="state" value="${user.state}">
                </td>
                <td>
                    <input type="text" name="code" value="${user.code}">
                </td>
                <td>
                    <a href="${pageContext.request.contextPath}/user/delete.action?uid=${user.uid}" name="delete">删除</a>
                    <a href="${pageContext.request.contextPath}/user/selectById.action?uid=${user.uid}" name="update">修改</a>
                </td>
            </tr>
        </c:forEach>
    </table>

    <!--分页条-->
        当前第${pageInfo.pageNum}页,每页显示
        <select  οnchange="change(this)">
            <option ${pageInfo.pageSize == 1 ? 'selected' : ''} value="1">1</option>
            <option ${pageInfo.pageSize == 2 ? 'selected' : ''} value="2">2</option>
            <option ${pageInfo.pageSize == 5 ? 'selected' : ''} value="5">5</option>
            <option ${pageInfo.pageSize == 10 ? 'selected' : ''} value="10">10</option>
        </select>
        条,

    <!--第一页不显示上一页和首页-->
    <c:if test="${pageInfo.pageNum > 1}">
        <a href="javascript:void(0)" οnclick="page(1)">首页</a>
        <a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum - 1})">上一页</a>
    </c:if>


    <!--分页列表-->
    <c:forEach begin="1" end="${pageInfo.pages}"  var="num">
        <a href="javascript:void(0)" οnclick="page(${num})">${num}</a>
    </c:forEach>

    <!--最后一页不显示下一页和尾页-->
    <c:if test="${pageInfo.pageNum < pageInfo.pages}">
        <a href="javascript:void(0)" οnclick="page(${pageInfo.pageNum + 1})">下一页</a>
        <a href="javascript:void(0)" οnclick="page(${pageInfo.pages})">尾页</a>
    </c:if>
        
</body>
</html>
  • 效果展示
    list.jsp页面效果

四、添加用户

4.1 需求:完成用户添加

4.2 步骤

  • 1、点击添加按钮,跳转到添加页面。
    • 列表页面,编写添加按钮。
    • 编写添加页面
  • 2、编写controller ,处理添加功能。
    • 添加成功: 跳转到列表页面。
    • 添加失败:跳转到添加页面,提示错误信息。
  • 3、编写service 完成添加。

4.3 实现

  • 1、点击添加按钮,跳转到添加页面。
  • 列表页面,编写添加按钮。
<a href="${pageContext.request.contextPath}/pages/add.jsp">添加</a>
  • 编写添加页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>添加</title>
</head>
<body>
<font color="#ffc0cb" size="30">${error}</font>
<form action="${pageContext.request.contextPath}/user/add.action" method="post">
    编号:<input type="text" name="uid" /> <br/>
    用户名:<input type="text" name="username" /> <br/>
    密码:<input type="password" name="password" /> <br/>
    昵称:<input type="text" name="name" /> <br/>
    电子邮箱:<input type="email" name="email" /> <br/>
    电话:<input type="text" name="telephone" /> <br/>
    生日:<input type="date" name="birthday" /> <br/>
    性别:<input type="radio" name="sex" value="男"/> 男
         <input type="radio" name="sex" value="女"/>女<br/>
    状态:<input type="text" name="state" /> <br/>
    激活码:<input type="text" name="code" /> <br/>
    <input type="submit" value="添加用户"/>
</form>
</body>
</html>
  • 2、编写controller ,处理添加功能。
    • 添加成功: 跳转到列表页面。
    • 添加失败:跳转到添加页面,提示错误信息。
package com.czxy.ssm.controller;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import javax.annotation.Resource;

/**
* @Author: 小新
* @Date: 2021-12-14 19:59
*/
@Controller
@RequestMapping("/user")
public class UserController {
  @Resource
  private UserService userService;
  /**
   * 添加
   * @param user
   * @param model
   * @return
   */
  @RequestMapping("/add")
  public String add(User user, Model model){
          Boolean result = userService.insert(user);
          if (result){
              //添加成功
              return "redirect:/user/selectAll.action";
          }else{
              //添加失败
              model.addAttribute("error","添加失败");
              return "add";
          }
  }
  • 3、编写service 完成添加。
    • UserService接口
package com.czxy.ssm.service;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;

/**
* @Author: 小新
* @Date: 2021-12-14 19:57
*/
public interface UserService {
   /**
    * 添加
    * @param user
    * @return
    */
   Boolean insert(User user);
}
  • UserServicec 实现类
package com.czxy.ssm.service.impl;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:58
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public Boolean insert(User user) {
        int result = userMapper.insert(user);
        return result == 1;
    }
}
  • 添加页面展示
    添加页面
  • 结果展示
    添加信息
    添加完成

五 、用户信息修改

5.1 根据id查询用户详情

5.1.1 需求:根据用户id查询用户详情

5.1.2 步骤

  • 1、点击修改按钮 ,执行selectById方法。
    • 列表页面,编写修改按钮。
    • 编写编辑页面。
  • 2、编写controller , 处理根据id查询功能。
    • 查询完成,跳转到编辑页面 并进行用户信息回显。
  • 3、编写service,完成根据id查询。

5.1.3 实现

  • 1、点击修改按钮 ,执行selectById方法。
  • 列表页面,编写修改按钮。
<a href="${pageContext.request.contextPath}/user/selectById.action?uid=${user.uid}" name="update">修改</a>
  • 编写编辑页面。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<head>
    <title>编辑</title>
</head>
<body>
<font color="pink" size="30">${error}</font>
<form action="${pageContext.request.contextPath}/user/update.action" method="post">
    <input type="hidden" name="uid" value="${user.uid}">
    用户名:<input type="text" name="username" value="${user.username}"/> <br/>
    密码:<input type="password" name="password" value="${user.password}"/> <br/>
    昵称:<input type="text" name="name" value="${user.name}"/> <br/>
    电子邮箱:<input type="email" name="email" value="${user.email}"/> <br/>
    电话:<input type="text" name="telephone" value="${user.telephone}"/> <br/>
    <fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd" var="birthday"></fmt:formatDate>
    生日:<input type="date" name="birthday" value="${birthday}"/> <br/>
    性别:<input type="radio" name="sex" value="男" ${user.sex == "男" ? "checked" : ""}/> 男
         <input type="radio" name="sex" value="女" ${user.sex == "女" ? "checked" : ""}/>女<br/>
    状态:<input type="text" name="state" value="${user.state}"/> <br/>
    激活码:<input type="text" name="code" value="${user.code}"/> <br/>
    <input type="submit" value="修改"/>
</form>
</body>
</html>
  • 2、编写controller , 处理根据id查询功能。
    • 查询完成,跳转到编辑页面 并进行用户信息回显。
package com.czxy.ssm.controller;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:59
 */
@Controller
@RequestMapping("/user")
public class UserController {
    @Resource
    private UserService userService;
    /**
     * 根据id查询详情
     * 编辑前
     * @param uid
     * @param model
     * @return
     */
    @RequestMapping("/selectById")
    public String selectById(String uid , Model model){
        User user = userService.selectById(uid);
        if (user == null){
            return "list";
        }else{
            model.addAttribute("user",user);
            return "update";
        }
    }
}
  • 3、编写service,完成根据id查询。
  • UserService 接口
package com.czxy.ssm.service;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:57
 */
public interface UserService {
    /**
     * 根据id查询详情
     * 更新前回显
     * @param uid
     * @return
     */
    User selectById(String uid);
}
  • service 实现类
package com.czxy.ssm.service.impl;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:58
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Resource
    private UserMapper userMapper;
    @Override
    public User selectById(String uid) {
        return userMapper.selectByPrimaryKey(uid);
    }
}
  • 结果演示
    列表页面
    编辑页面

5.2 用户信息更新

5.2.1 需求:完成用户修改

5.2.2 步骤

  • 1、点击修改按钮、提交表单。
  • 2、编写controller ,处理更新功能。
    • 更新成功:跳转列表页面。
    • 更新失败:跳转修改页面,进行错误信息提示。
  • 3、编写service,完成更新。

5.2.3 实现

  • 1、点击修改按钮、提交表单。
  • 2、编写controller ,处理更新功能。
    • 更新成功:跳转列表页面。
    • 更新失败:跳转修改页面,进行错误信息提示。
package com.czxy.ssm.controller;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

/**
* @Author: 小新
* @Date: 2021-12-14 19:59
*/
@Controller
@RequestMapping("/user")
public class UserController {
 @Resource
 private UserService userService;
 /**
  * 修改
  * @param user
  * @param model
  * @return
  */
 @RequestMapping("/update")
 public String update(User user , Model model){
         Boolean result = userService.update(user);
         if (result){
             //修改成功
             return "redirect:/user/selectAll.action";
         }else{
             //修改失败
             model.addAttribute("error","修改失败");
             return "update";
         }
 }
}
  • 3、编写service,完成更新。
  • service 接口
package com.czxy.ssm.service;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:57
 */
public interface UserService {
    /**
     * 更新
     * @param user
     * @return
     */
    Boolean update(User user);
}
  • service 实现类
package com.czxy.ssm.service.impl;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:58
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public Boolean update(User user) {
        int update = userMapper.updateByPrimaryKey(user);
        return update == 1;
    }
}

六、删除用户

6.1 需求:完成用户删除

6.2 步骤

  • 1、点击删除按钮 ,绑定onclick事件,提示用户是否删除
  • 2、编写controller,处理删除功能
    • 删除成功: 跳转到列表页面。
    • 删除失败:跳转到列表页面并进行错误信息提示
  • 3、编写service,完成删除。

6.3 实现

  • 1、点击删除按钮 ,绑定onclick事件,提示用户是否删除
  <a href="${pageContext.request.contextPath}/user/delete.action?uid=${user.uid}" name="delete" οnclick="return confirm('您是否要删除?')">删除</a>
  • 2、编写controller,处理删除功能
    • 删除成功: 跳转到列表页面。
    • 删除失败:跳转到列表页面并进行错误信息提示
package com.czxy.ssm.controller;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.annotation.Resource;

/**
* @Author: 小新
* @Date: 2021-12-14 19:59
*/
@Controller
@RequestMapping("/user")
public class UserController {
   @Resource
   private UserService userService;
   /**
    * 删除
    * @param uid
    * @return
    */
   @RequestMapping("/delete")
   public String delete(String uid, Model model){
           Boolean result = userService.delete(uid);
           if (result){
               //删除成功
               return "redirect:/user/selectAll.action";
           }else{
               //删除失败
               model.addAttribute("error","删除失败");
               return "list";
           }
   }
}
  • 3、编写service,完成删除。
  • service 接口
package com.czxy.ssm.service;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageInfo;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:57
 */
public interface UserService {
   /**
     * 删除
     * @param uid
     * @return
     */
    Boolean delete(String uid);
}
  • service 实现类
package com.czxy.ssm.service.impl;

import com.czxy.ssm.domain.User;
import com.czxy.ssm.mapper.UserMapper;
import com.czxy.ssm.service.UserService;
import com.czxy.ssm.vo.UserVo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.entity.Example;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Author: 小新
 * @Date: 2021-12-14 19:58
 */
@Service
@Transactional
public class UserServiceImpl implements UserService {
    @Resource
    private UserMapper userMapper;
    @Override
    public Boolean delete(String uid) {
        int result = userMapper.deleteByPrimaryKey(uid);
        return result == 1;
    }
}

小结:

ps:小编把项目放在了百度网盘,有需要的可以拿走
链接:https://pan.baidu.com/s/1uaIN_mqygZCY3_efwmL59w
提取码:7264

end

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于SSMSpring+SpringMVC+MyBatis)的管理系统是一种常见的Web应用程序,它使用Spring框架作为应用程序的核心,SpringMVC框架作为Web层的控制器,MyBatis框架作为数据访问层的ORM框架。这种管理系统可以用于各种企业级应用程序,例如人力资源管理系统、客户关系管理系统、库存管理系统等。它具有易于扩展、高效、安全等优点,是现代企业信息化建设的重要组成部分。 ### 回答2: SSM是指基于SpringSpringMVCMyBatis这三个框架技术实现的一种Web应用开发模式。在SSM框架中,Spring框架主要作为IoC容器和Bean工厂,提供依赖注入、事务管理、AOP等功能,SpringMVC框架主要负责Web层的控制器部分,处理HTTP请求和响应,而MyBatis框架则用于持久层的数据访问和管理,提供了高效且易于维护的数据库访问操作。 基于SSM框架的管理系统可以分为前台和后台两个系统。前台主要面向普通用户,提供浏览、查询、注册、登录等功能,让用户能够方便地使用系统。后台主要面向管理员或管理人员,提供对系统中各种业务数据的管理、修改、删除等功能,让管理人员能够对系统运行情况进行有效的监控和控制。 在基于SSM框架的管理系统中,需要进行技术选型、模块设计、业务实现等工作。首先,需要根据具体需求选择合适的技术方案和架构模式。其次,需要对各个模块进行梳理,按照功能划分,确定模块之间的关系和交互方式,最终实现整个系统的业务逻辑。同时,需要注意系统的可扩展性、可维护性和安全性,保证系统的数据安全,同时能够满足系统的不断发展和升级的需要。 总之,基于SSM框架的管理系统,可以通过合理运用SpringSpringMVCMyBatis等技术,实现系统中的各种业务逻辑。开发人员需要具备扎实的Java技术和Web开发经验,同时需要熟悉相关的数据库技术和网络协议,才能够顺利地完成系统的设计和开发。 ### 回答3: SSM是目前非常流行的一种技术架构,它是SpringSpringMVCMyBatis三个框架的结合,每个框架具有自己的优势和功能,通过整合,可以快速地搭建一个高效、可维护的管理系统。 在SSM框架下,可以将系统分为三层:表现层、业务层和持久层。表现层由SpringMVC处理用户请求和响应,业务层由Spring实现,而持久层则使用MyBatis实现数据库交互。 在搭建一个基于SSM的管理系统时,首先需要进行配置。Spring的配置包括Spring的核心配置文件、数据源的配置和事务的配置;SpringMVC的配置包括MVC配置文件、拦截器等;MyBatis的配置包括数据库连接池、Mapper文件和MyBatis的配置文件等。这些都需要进行详细的配置。 在系统开发中,可以通过Maven对项目进行管理,比如添加依赖、打包等。同时,也可以使用Spring Security对系统进行安全性的保护,实现权限控制等功能。 在具体的业务实现中,可以根据需要添加各种插件、拦截器和过滤器等,还可以使用Redis等缓存技术,提高系统的性能和效率。 总的来说,基于SSM的管理系统具有以下优点:首先,框架整合可以提高开发效率,减少重复代码。其次,各个框架都具有良好的扩展性和可维护性,方便对系统进行升级和调整。最后,使用Maven进行项目管理,可以更好地管理依赖,提高项目效率。 当然,也需要注意SSM框架的缺点,比如框架整合带来的额外配置和调试成本,以及MyBatis可能存在的一些瓶颈等问题。综上所述,基于SSM的管理系统适合中小型项目,能够提高开发效率,降低开发难度,实现快速迭代和维护,是一种非常实用的技术方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值