Spring Boot整合MyBatis 做一个CRUD的小demo

目录

一、功能介绍

二、数据库脚本

三、配置文件

3.1 pom.xml

3.2 application.properties

3.3 logback.xml

四、源代码

4.1 启动类App.java

4.2 配置类 MyConfig.java

4.3 添加功能时跳转 PageController.java

4.4 UserController.java

4.5 日期转换器DateConverter.java

4.6 全局异常处理器GlobalException.java

4.7 登录拦截器LoginInterceptor.java

4.8 UserMapper

4.9 UserMapper.xml

五、运行结果


一、功能介绍

  • 本个小案例 实现了登录 、拦截器、日期转换器、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>

五、运行结果

 

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

今天的接口写完了吗?

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值