• SSM(Spring+SpringMVC+MyBatis)框架集成


    引言

    • 进行SSM(Spring+SpringMVC+MyBatis)集成的主要原因是为了提高开发效率和代码可维护性。SSM是一套非常流行的Java Web开发框架,它集成了Spring框架、SpringMVC框架和MyBatis框架,各自发挥优势,形成了一个完整的开发框架。
    • 首先,使用Spring框架可以实现组件的解耦和依赖注入,通过配置文件进行Bean的管理和控制反转(IoC),从而提供了良好的扩展性和灵活性。Spring提供了事务管理、AOP(面向切面编程)等功能,使得开发者可以更加方便地进行业务逻辑的编写和管理。
    • 其次,SpringMVC框架是一种基于MVC(Model-View-Controller)模式的Web框架,它通过DispatcherServlet来统一管理请求和响应。SpringMVC提供了请求处理的注解方式,可以简化开发流程,同时具备良好的可扩展性和灵活性。开发者可以通过配置文件进行路由、参数绑定、数据校验等操作,从而编写出结构清晰、易于维护的代码。
    • 最后,MyBatis是一款优秀的持久层框架,它通过XML文件或注解来实现数据库操作的映射,具有简单易用、性能高效等特点。MyBatis提供了丰富的CRUD(增删改查)操作和事务管理功能,开发者可以灵活地编写数据库相关的代码。

    综上所述,SSM集成可以充分发挥各个框架的优势,提供了一种高效、灵活、易于维护的开发方式,使得Java Web开发更加方便和高效。通过SSM的集成,开发者可以快速搭建起一个稳定可靠的Web应用,并且在后续的开发和维护过程中,能够更加方便地处理业务需求和数据库操作。

    创建数据库表

    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
     
    -- ----------------------------
    -- Table structure for user
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      `age` int(11) NULL DEFAULT NULL,
      `gender` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
     
    SET FOREIGN_KEY_CHECKS = 1;

    在IEDA中创建Maven Web项目

    选择File ---> New ---> Project

    选择Maven模板

    填写项目的基本信息 ---> Next

    配置自己的Maven环境 ---> Finish

    修改pom.xml配置,添加Maven依赖

    <properties>
        <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
        <spring.version>5.3.6spring.version>
      properties>
    
      <dependencies>
        
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-webmvcartifactId>
          <version>${spring.version}version>
        dependency>
    
        <dependency>
          <groupId>org.springframeworkgroupId>
          <artifactId>spring-jdbcartifactId>
          <version>${spring.version}version>
        dependency>
    
        <dependency>
          <groupId>org.projectlombokgroupId>
          <artifactId>lombokartifactId>
          <version>1.16.18version>
        dependency>
    
        
        <dependency>
          <groupId>javax.servletgroupId>
          <artifactId>jstlartifactId>
          <version>1.2version>
          <scope>runtimescope>
        dependency>
    
        <dependency>
          <groupId>taglibsgroupId>
          <artifactId>standardartifactId>
          <version>1.1.2version>
        dependency>
    
        
        <dependency>
          <groupId>javax.validationgroupId>
          <artifactId>validation-apiartifactId>
          <version>2.0.1.Finalversion>
        dependency>
        <dependency>
          <groupId>org.hibernate.validatorgroupId>
          <artifactId>hibernate-validatorartifactId>
          <version>6.0.16.Finalversion>
        dependency>
    
        
        <dependency>
          <groupId>commons-fileuploadgroupId>
          <artifactId>commons-fileuploadartifactId>
          <version>1.4version>
        dependency>
        <dependency>
          <groupId>commons-iogroupId>
          <artifactId>commons-ioartifactId>
          <version>2.6version>
        dependency>
    
        
        <dependency>
          <groupId>com.fasterxml.jackson.coregroupId>
          <artifactId>jackson-coreartifactId>
          <version>2.11.4version>
        dependency>
        <dependency>
          <groupId>com.fasterxml.jackson.coregroupId>
          <artifactId>jackson-databindartifactId>
          <version>2.11.4version>
        dependency>
    
        
        <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatisartifactId>
          <version>3.5.5version>
        dependency>
        <dependency>
          <groupId>org.mybatisgroupId>
          <artifactId>mybatis-springartifactId>
          <version>2.0.5version>
        dependency>
    
        
        <dependency>
          <groupId>mysqlgroupId>
          <artifactId>mysql-connector-javaartifactId>
          <version>5.1.47version>
        dependency>
    
        
        <dependency>
          <groupId>org.slf4jgroupId>
          <artifactId>slf4j-apiartifactId>
          <version>1.7.25version>
        dependency>
        
        <dependency>
          <groupId>ch.qos.logbackgroupId>
          <artifactId>logback-classicartifactId>
          <version>1.2.3version>
        dependency>
      dependencies>

    创建IoC 容器 springmvc.xml文件

    在src/main/resources文件夹下创建 springmvc.xml文件

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        
        <mvc:annotation-driven />
    
        
        <context:component-scan base-package="com.qrj"/>
    
        
        <mvc:default-servlet-handler />
    
        
        <mvc:cors>
            <mvc:mapping path="/**" />
        mvc:cors>
    beans>

    创建数据库配置文件database.properties

    在src/main/resources文件夹下创建database.properties文件

    db.driver=com.mysql.jdbc.Driver
    db.url=jdbc:mysql://localhost:3306/spring_mybatis?useSSL=false
    db.username=root
    db.password=123456

    创建Spring IoC容器spring-config.xml文件

    在src/main/resources文件夹下创建spring-config.xml文件

    
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:mybatis="http://mybatis.org/schema/mybatis-spring"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context.xsd
               http://mybatis.org/schema/mybatis-spring
               http://mybatis.org/schema/mybatis-spring.xsd">
    
        
        <context:component-scan base-package="com.qrj"/>
    
        
        <context:property-placeholder location="classpath:database.properties"/>
    
        
        <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName" value="${db.driver}"/>
            <property name="url" value="${db.url}"/>
            <property name="username" value="${db.username}"/>
            <property name="password" value="${db.password}"/>
        bean>
    
        
        <mybatis:scan base-package="com.qrj.dao"/>
    
        
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            
            <property name="typeAliasesPackage" value="com.qrj.entity" />
            
            <property name="mapperLocations" value="classpath*:mapper/*.xml" />
        bean>
    beans>

    创建logback.xml日志配置文件

    在src/main/resources文件夹下创建logback.xml文件

    
    <configuration debug="false" scan="true" scanPeriod="1 seconds">
    
        <contextName>logbackcontextName>
    
        <property name="log.path" value="F:\\logback.log" />
    
        
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUGlevel>
            filter>
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
                pattern>
            encoder>
        appender>
    
        
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.zipfileNamePattern>
            rollingPolicy>
    
            <encoder>
                <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
                pattern>
            encoder>
        appender>
    
        
        <root level="debug">
            <appender-ref ref="console" />
            <appender-ref ref="file" />
        root>
    
        
        <logger name="com.qrj.util" level="info" />
    
    configuration>

    修改web.xml文件

    
    
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
      
      <context-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:spring-config.xmlparam-value>
      context-param>
      
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>
      listener>
    
      <servlet>
        <servlet-name>springmvcservlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
        <init-param>
          
          <param-name>contextConfigLocationparam-name>
          <param-value>classpath:springmvc.xmlparam-value>
        init-param>
        
        <load-on-startup>1load-on-startup>
      servlet>
      <servlet-mapping>
        <servlet-name>springmvcservlet-name>
        <url-pattern>/url-pattern>
      servlet-mapping>
    
      
      <filter>
        <filter-name>characterEncodingFilterfilter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
        <init-param>
          <param-name>encodingparam-name>
          <param-value>UTF-8param-value>
        init-param>
        <init-param>
          <param-name>forceEncodingparam-name>
          <param-value>trueparam-value>
        init-param>
      filter>
      <filter-mapping>
        <filter-name>characterEncodingFilterfilter-name>
        <url-pattern>/*url-pattern>
      filter-mapping>
    web-app>

    创建UserEntity实体类

    在src/main/java目录下创建com.qrj.entity包,在包下面创建UserEntity实体类。

    package com.qrj.entity;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @author: qrj
     * @description 用户实体类
     * @Date: 2023/9/19 14:51
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class UserEntity {
        private Integer id;
        private String name;
        private Integer age;
        private String gender;
    }

    创建UserDto参数类

    在src/main/java目录下创建com.qrj.dto包,在包下面创建UserDto参数类。

    package com.qrj.dto;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    /**
     * @author: qrj
     * @description 用户参数
     * @Date: 2023/9/19 14:52
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class UserDto {
        private Integer id;
        private String name;
        private Integer age;
        private String gender;
    }

    创建UserMapper接口

    在src/main/java目录下创建com.qrj.dao包,在包下面创建UserMapper接口。

    package com.qrj.dao;
    
    import com.qrj.dto.UserDto;
    import com.qrj.entity.UserEntity;
    
    import java.util.List;
    
    /**
     * @author: qrj
     * @description 用户映射接口
     * @Date: 2023/9/19 14:52
     */
    public interface UserMapper {
        void insert(UserDto user);
    
        List getList();
    }

    创建UserMapper.xml映射文件

    注意这里创建的UserMapper映射文件要和之前创建的UserMapper接口文件相对应。

    在src/main/resources文件夹下创建mapper文件夹,并在mapper文件夹下创建UserMapper.xml映射文件。

    
    mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="com.qrj.dao.UserMapper">
        <insert id="insert" parameterType="com.qrj.entity.UserEntity" keyProperty="id" useGeneratedKeys="true">
            INSERT INTO USER ( name, age, gender )
                VALUE
                ( #{name}, #{age} , #{gender} )
        insert>
    
        <select id="getList" resultType="com.qrj.entity.UserEntity">
            SELECT
                *
            FROM
                USER;
        select>
    mapper>

    创建ResultVo工具类

    在src/main/java目录下创建com.qrj.vo包,在包下面创建ResultVo工具类。

     

    package com.qrj.vo;
    
    import lombok.Data;
    
    import java.io.Serializable;
    
    /**
     * @author: qrj
     * @description Ajax 请求统一响应工具类
     * @Date: 2023/9/19 14:58
     */
    @Data
    public class ResultVo<T> implements Serializable {
        private static final long serialVersionUID = 1L;
    
        //状态码
        private int code;
    
        //状态码描述
        private String message;
    
        //数据结果,泛型,可以是列表、单个对象、数字、布尔值等
        private T data;
    
        public ResultVo() {
        }
    
        public ResultVo(int code, String message) {
            this.code = code;
            this.message = message;
        }
    
        public static <T> ResultVo<T> success(T data) {
            ResultVo<T> resultVo = new ResultVo<>();
            resultVo.setCode(200);
            resultVo.setMessage("ok");
            resultVo.setData(data);
            return  resultVo;
        }
    }

    创建IUserService接口和UserServiceImpl实现类

    在src/main/java目录下创建com.qrj.service包,在包中创建IUserService接口

    package com.qrj.service;
    
    import com.qrj.dto.UserDto;
    import com.qrj.entity.UserEntity;
    
    import java.util.List;
    
    /**
     * @author: qrj
     * @description 用户业务接口
     * @Date: 2023/9/19 14:54
     */
    public interface IUserService {
        UserEntity insert(UserDto user);
        List getList();
    }

    在com.qrj.service包下创建Impl包,并创建UserServiceImpl实现类

    package com.qrj.service.Impl;
    
    import com.qrj.dao.UserMapper;
    import com.qrj.dto.UserDto;
    import com.qrj.entity.UserEntity;
    import com.qrj.service.IUserService;
    import org.springframework.beans.BeanUtils;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author: qrj
     * @description 用户业务实现类
     * @Date: 2023/9/19 14:57
     */
    @Service //控制反转
    public class UserServiceImpl implements IUserService {
        @Resource //依赖注入
        private UserMapper userMapper;
    
        @Transactional(rollbackFor = Exception.class)
        @Override
        public UserEntity insert(UserDto user) {
            userMapper.insert(user);
            UserEntity userEntity = new UserEntity();
            //BeanUtils用于拷贝对象 参数1:被拷贝的对象 参数2:拷贝对象
            BeanUtils.copyProperties(user,userEntity);
            return userEntity;
        }
    
        @Transactional
        @Override
        public List getList() {
            List list = userMapper.getList();
            return list;
        }
    }

    创建UserController页面控制器

    在src/main/java目录下创建com.qrj.controller包,在包下面创建UserController页面控制器。

    package com.qrj.controller;
    
    import com.qrj.dto.UserDto;
    import com.qrj.entity.UserEntity;
    import com.qrj.service.IUserService;
    import com.qrj.vo.ResultVo;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author: qrj
     * @description 用户页面控制器
     * @Date: 2023/9/19 14:53
     */
    @RestController
    @Slf4j //lombok提供的日志注解
    public class UserController {
        @Resource //使用 @Autowired注解 IDEA不推荐
        private IUserService userService;
    
        @PostMapping("/user")
        public ResultVo addUser(@RequestBody UserDto userDto) {
            log.debug(userDto.toString()); //打印调试日志(接收参数)
            UserEntity result = userService.insert(userDto);
            log.debug(result.toString()); //打印调试日志(响应数据)
            return ResultVo.success(result);
        }
    
        @GetMapping("/users")
        public ResultVo> getUsers() {
            List list = userService.getList();
            return ResultVo.success(list);
        }
    }

    启动Tomcat,在Postman下进行接口测试

    通过Restful API接口("/user")测试添加用户功能实现

    通过Restful API接口("/users")测试查找所有用户功能实现

    以上功能测试完成,至此SSM框架集成成功!

  • 相关阅读:
    3D体验平台品牌应用——ENOVIA
    机器学习开源工具BatteryML,一站式分析与预测电池性能
    经典文献阅读之--BVMatch(基于鸟瞰图像的点云地点识别方法
    《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)
    Vue、js底层深入理解笔记(二)
    STM32标准库通用定时器输入捕获
    后端获取数据库时间为什么不显示时分秒
    TartanVO: A Generalizable Learning-based VO 服务器复现(rtx3090 py3)
    杨表
    实训笔记9.4
  • 原文地址:https://www.cnblogs.com/one-xiaoqiang/p/17738624.html