前言
- 概述 : 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>
- 效果展示
四、添加用户
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