目录
4.3 添加功能时跳转 PageController.java
4.6 全局异常处理器GlobalException.java
4.7 登录拦截器LoginInterceptor.java
一、功能介绍
- 本个小案例 实现了登录 、拦截器、日期转换器、CRUD...
二、数据库脚本
/*
Navicat Premium Data Transfer
Source Server : localhost_3305
Source Server Type : MySQL
Source Server Version : 50651 (5.6.51)
Source Host : localhost:3305
Source Schema : ssm
Target Server Type : MySQL
Target Server Version : 50651 (5.6.51)
File Encoding : 65001
Date: 16/01/2024 17:16:25
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`money` double NULL DEFAULT NULL,
`date` date NULL DEFAULT NULL,
`head` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 11 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES (1, '杨逍1', 10000, '2023-01-01', 'u=4251408926,3626211699&fm=253&fmt=auto&app=138&f=JPEG.webp', '111');
INSERT INTO `account` VALUES (2, '延期', 10000, '2023-01-01', 'u=3282777127,4235760081&fm=253&fmt=auto&app=138&f=JPEG.webp', '111');
INSERT INTO `account` VALUES (10, 'admin', 100, '2024-01-11', 'u=4251408926,3626211699&fm=253&fmt=auto&app=138&f=JPEG.webp', '111');
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nam` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`sex` int(11) NULL DEFAULT NULL,
`pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`birth` date NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 21 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, '杨逍', 1, '111', '2024-01-15');
INSERT INTO `user` VALUES (3, '殷天正', 1, '000', '2023-01-02');
INSERT INTO `user` VALUES (4, '11', 1, '121', '2024-01-15');
INSERT INTO `user` VALUES (18, '纪晓芙', 0, '111', '2024-01-03');
INSERT INTO `user` VALUES (19, '444', 1, '77', '2024-01-16');
INSERT INTO `user` VALUES (20, '223', 1, '22', '2000-03-12');
SET FOREIGN_KEY_CHECKS = 1;
三、配置文件
3.1 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.by</groupId>
<artifactId>springboot_mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- springBoot 的启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Mybatis 启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<!-- mysql 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- druid 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- 添加 junit 环境的 jar 包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<build>
<!-- 如果不添加此节点src/main/java目录下的所有配置文件都会被漏掉。 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<!--让idea识别resources目录-->
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</project>
3.2 application.properties
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3305/ssm
spring.datasource.username=root
spring.datasource.password=
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
mybatis.type-aliases-package=com.by.pojo
logging.level.com.by.mapper=DEBUG
3.3 logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="${catalina.base:-.}/logs/" />
<!-- 控制台输出 -->
<appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender">
<!-- 日志输出编码 -->
<layout class="ch.qos.logback.classic.PatternLayout">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示class的全名最长50个字符,否则按照句点分割
%msg:日志消息
%n是换行符
-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
</appender>
<!-- 按照每天生成日志文件 -->
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<!--
日志输出格式:
%d表示日期时间,
%thread表示线程名,
%-5level:级别从左显示5个字符宽度
%logger{50} 表示class的全名最长50个字符,否则按照句点分割
%msg:日志消息
%n是换行符
-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
</pattern>
</layout>
<!--日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
<!-- 日志输出级别 -->
<root level="DEBUG">
<appender-ref ref="Stdout" />
<appender-ref ref="RollingFile" />
</root>
<!--日志异步到数据库 -->
<!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
日志异步到数据库
<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
连接池
<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
<driverClass>com.mysql.jdbc.Driver</driverClass>
<url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
<user>root</user>
<password>root</password>
</dataSource>
</connectionSource>
</appender> -->
</configuration>
四、源代码
4.1 启动类App.java
package com.by;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.by.mapper") // @MapperScan 用户扫描MyBatis的Mapper接口
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
4.2 配置类 MyConfig.java
package com.by.config;
import com.by.converter.DateConverter;
import com.by.interceptor.LoginInterceptor;
import org.springframework.format.FormatterRegistry;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class MyConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new DateConverter());
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**") //拦截所有请求,包括静态资源文件
.excludePathPatterns("/user/login"); //放行登录页,登陆操作,静态资源
}
}
4.3 添加功能时跳转 PageController.java
package com.by.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class PageController {
@RequestMapping("/{page}")
public String toPage(@PathVariable String page){
return page;
}
}
4.4 UserController.java
package com.by.controller;
import com.by.pojo.User;
import com.by.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("addUser")
public String addUser(User user) {
userService.addUser(user);
return "redirect:/user/selectUser";
}
@RequestMapping("/selectUser")
public String selectUser(Model model) {
List<User> userList = userService.selectUser();
model.addAttribute("userList", userList);
return "/select_user";
}
// 删除
@RequestMapping("/deleteUserById")
public String deleteUserById(Integer id) {
userService.deleteUserById(id);
return "redirect:/user/selectUser";
}
// 修改 回显数据
@RequestMapping("/getUserById")
public String getUserById(Integer id, Model model) {
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "/update_user";
}
// 修改
@RequestMapping("/updateUser")
public String updateUser(HttpServletRequest request, User user) throws ParseException {
String id = request.getParameter("id");
int i = Integer.parseInt(id);
// userService.updateUser(i);
String nam = request.getParameter("nam");
String pwd = request.getParameter("pwd");
String sex = request.getParameter("sex");
int i1 = Integer.parseInt(sex);
String birth = request.getParameter("birth");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date da = sdf.parse(birth);
user.setId(i);
user.setNam(nam);
user.setBirth(da);
user.setPwd(pwd);
user.setSex(i1);
userService.updateUser(user);
return "redirect:/user/selectUser";
}
// 模糊查询
@RequestMapping("/findUserByName")
public String findUserByName(Model model, String name) {
List<User> userList = userService.findUserByName(name);
model.addAttribute("userList", userList);
return "/select_user";
}
// 登录
@RequestMapping("/login")
public String login(Model model, User user, HttpServletRequest request) {
User user1 = userService.login(user);
if (user1 != null) {
request.getSession().setAttribute("user", user1);
return "redirect:/user/selectUser";
}
return "forward:/login.html";
}
}
4.5 日期转换器DateConverter.java
package com.by.converter;
import org.springframework.core.convert.converter.Converter;
import org.springframework.stereotype.Component;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
try {
DateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 将字符串转为日期
return format.parse(source);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
4.6 全局异常处理器GlobalException.java
package com.by.exception;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class GlobalException implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addObject("msg",e.getMessage());
return mv;
}
}
4.7 登录拦截器LoginInterceptor.java
package com.by.interceptor;
import com.by.pojo.User;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
User user = (User) request.getSession().getAttribute("user");
if(user!=null){
return true;
}else {
response.sendRedirect("/user/login");
return false;
}
}
}
4.8 UserMapper
package com.by.mapper;
import com.by.pojo.User;
import java.util.List;
public interface UserMapper {
void addUser(User user);
List<User> selectUser();
void deleteUserById(Integer id);
User getUserById(Integer id);
void updateUser(User user);
List<User> findUserByName(String name);
User login(User user);
}
4.9 UserMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by.mapper.UserMapper">
<insert id="addUser" parameterType="com.by.pojo.User">
insert into user(nam,pwd,sex,birth) values(#{nam},#{pwd},#{sex},#{birth})
</insert>
<select id="selectUser" resultType="com.by.pojo.User" parameterType="int">
select * from user
</select>
<delete id="deleteUserById" parameterType="int">
delete from user where id=#{id}
</delete>
<select id="getUserById" parameterType="int" resultType="com.by.pojo.User">
select * from user where id=#{id}
</select>
<update id="updateUser" parameterType="com.by.pojo.User">
UPDATE `user` set nam=#{nam},sex=#{sex},pwd=#{pwd},birth=#{birth} WHERE id=#{id};
</update>
<select id="findUserByName" resultType="com.by.pojo.User" parameterType="string">
select * from user where nam like '%${value}%'<!--${}括号中只能是value-->
</select>
<select id="login" resultType="com.by.pojo.User" parameterType="com.by.pojo.User">
select * from user where nam =#{nam} and pwd=#{pwd}
</select>
</mapper>
五、运行结果