引言

  • 进行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-8</project.build.sourceEncoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring.version>5.3.6</spring.version>
</properties> <dependencies>
<!-- 添加springmvc依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency> <dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.18</version>
</dependency> <!-- JSTL 依赖包-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency> <dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency> <!--数据校验依赖包-->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.0.16.Final</version>
</dependency> <!--文件上传依赖包-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency> <!-- 添加jackson配置 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.4</version>
</dependency> <!-- MyBatis依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.5</version>
</dependency> <!-- 数据库驱动依赖(根据你使用的数据库选择) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency> <!-- 日志整合 slf4j门面设计模式与 log4j或log4j2一起使用-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- 日志-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>

创建IoC 容器 springmvc.xml文件

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

<?xml version="1.0" encoding="UTF-8"?>
<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"> <!--开启SpringMVC注解驱动-->
<mvc:annotation-driven /> <!-- springmvc容器(也就是一个spring容器)会扫描指定包中的组件,将其注册到springmvc容器中 -->
<context:component-scan base-package="com.qrj"/> <!-- 配置允许访问静态资源 -->
<mvc:default-servlet-handler /> <!-- 配置全局 CORS -->
<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文件

<?xml version="1.0" encoding="UTF-8"?>
<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 扫描 mapper -->
<mybatis:scan base-package="com.qrj.dao"/> <!-- 配置SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--设置entity实体类路径-->
<property name="typeAliasesPackage" value="com.qrj.entity" />
<!--设置mapper映射文件路径-->
<property name="mapperLocations" value="classpath*:mapper/*.xml" />
</bean>
</beans>

创建logback.xml日志配置文件

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

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds"> <contextName>logback</contextName> <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>DEBUG</level>
</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}.zip</fileNamePattern>
</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文件

<?xml version="1.0" encoding="UTF-8"?>

<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">
<!-- 配置Spring容器加载配置文件路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-config.xml</param-value>
</context-param>
<!-- 监听器(spring文件相关的监听器)-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener> <servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!-- contextConfigLocation 用来指定springmvc配置文件的位置,文件名称不一定要叫springmvc,大家可以随意起名 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- load-on-startup:表示web容器启动的时,当前对象创建的顺序,值越小初始化越早,大于等于0 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> <!-- 设置 CharacterEncodingFilter 过滤器,这个类会对request和response设置字符集编码,解决中文乱码问题(优先级最高) -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-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<UserEntity> getList();
}

创建UserMapper.xml映射文件

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

在src/main/resources文件夹下创建mapper文件夹,并在mapper文件夹下创建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.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<UserEntity> 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<UserEntity> getList() {
List<UserEntity> 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<UserEntity> 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<List<UserEntity>> getUsers() {
List<UserEntity> list = userService.getList();
return ResultVo.success(list);
}
}

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

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

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

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

SSM(Spring+SpringMVC+MyBatis)框架集成的更多相关文章

  1. Spring+SpringMvc+Mybatis框架集成搭建教程

    一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...

  2. SSM(Spring + Springmvc + Mybatis)框架面试题

    JAVA SSM框架基础面试题https://blog.csdn.net/qq_39031310/article/details/83050192 SSM(Spring + Springmvc + M ...

  3. SSM(Spring +SpringMVC + Mybatis)框架搭建

    SSM(Spring +SpringMVC + Mybatis)框架的搭建 最近通过学习别人博客发表的SSM搭建Demo,尝试去搭建一个简单的SSMDemo---实现的功能是对用户增删改查的操作 参考 ...

  4. SSM(Spring+SpringMVC+Mybatis)框架环境搭建(整合步骤)(一)

    1. 前言 最近在写毕设过程中,重新梳理了一遍SSM框架,特此记录一下. 附上源码:https://gitee.com/niceyoo/jeenotes-ssm 2. 概述 在写代码之前我们先了解一下 ...

  5. SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...

  6. SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释(转)

    原文:https://blog.csdn.net/yijiemamin/article/details/51156189# 这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文 ...

  7. 0927-转载:SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    这篇文章暂时只对框架中所要用到的配置文件进行解释说明,而且是针对注解形式的,框架运转的具体流程过两天再进行总结. spring+springmvc+mybatis框架中用到了三个XML配置文件:web ...

  8. SSM:spring+springmvc+mybatis框架中的XML配置文件功能详细解释

    这几天一直在整合SSM框架,虽然网上有很多已经整合好的,但是对于里面的配置文件并没有进行过多的说明,很多人知其然不知其所以然,经过几天的搜索和整理,今天总算对其中的XML配置文件有了一定的了解,所以拿 ...

  9. java web,从零开始,一步一步配置ssm(Spring+SpringMVC+MyBatis)框架

    1.安装JDK: 安装之后要配置环境变量,在系统变量里: 新建变量名JAVA_HOME,变量值C:\Program Files\Java\jdk1.8.0_77: 新建变量名CLASSPATH,变量值 ...

  10. SSM Spring SpringMVC Mybatis框架整合Java配置完整版

    以前用着SSH都是老师给配好的,自己直接改就可以.但是公司主流还是SSM,就自己研究了一下Java版本的配置.网上大多是基于xnl的配置,但是越往后越新的项目都开始基于JavaConfig配置了,这也 ...

随机推荐

  1. 7.1 套接字(socket)

    套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换.在Python中,我们可以使用socket模块来创建和使用套接字. 首先,我们需要导入socket模块: ...

  2. x.ai还是OpenAI?埃隆·马斯克的AI帝国【2】

    上期内容咱们提到了埃隆马斯克的特斯拉是自动驾驶领域的领导者,大家可能近些年也都有从各类渠道听到过Tesla自动驾驶有关的新闻.不同于像包括Google子公司Waymo在内的大多数使用激光雷达来实现自动 ...

  3. 【技术积累】Git中的基础知识【一】

    Git是什么?有什么特点? Git是一个分布式版本控制系统,常用于软件开发中的源代码管理.它最初由Linux开发者Linus Torvalds创建,旨在管理Linux内核的开发. Git具有以下特点: ...

  4. MyBatis-plus自动填充功能

    1.什么是mp的自动填充?这个功能是做什么的呢? 有的时候,我们可能有这样子的需求,在插入(insert)或者更新数据(update)的时候可以自动填充数据,比如密码,version等.在mp中为我们 ...

  5. 免费好用的录屏工具 —— EVCapture --九五小庞

    下载地址:https://wwfv.lanzoue.com/b022u08ib密码:acdu 1,简介 使用过很多种屏幕录像软件,最终这个软件留下来存到我的工具宝库. 因为界面非常简单友好,功能也很好 ...

  6. Mybatis-SQL分析组件

    背景 大促备战,最大的隐患项之一就是慢sql,带来的破坏性最大,也是日常工作中经常带来整个应用抖动的最大隐患,而且对sql好坏的评估有一定的技术要求,有一些缺乏经验或者因为不够仔细造成一个坏的sql成 ...

  7. 每日一题 力扣 445 https://leetcode.cn/problems/add-two-numbers-ii/

    可以直接用栈去做就行,逆序想到栈的做法 然后算完一个就直接赋值给答案数组  我用的是常见 public ListNode addTwoNumbers(ListNode l1, ListNode l2) ...

  8. go NewTicker 得使用

    转载请注明出处: 在 Go 语言中,time.NewTicker 函数用于创建一个周期性触发的定时器.它会返回一个 time.Ticker 类型的值,该值包含一个通道 C,定时器会每隔一段时间向通道 ...

  9. 「学习笔记」Lambda 表达式

    Lambda 表达式因数学中的 \(\lambda\) 演算得名, 直接对应于其中的 lambda 抽象. Lambda 表达式能够捕获作用域中的变量的无名函数对象, 我们可以将其理解为一个匿名的内联 ...

  10. 跟运维学 Linux - 02

    文件操作和用户 复制移动和删除 在Windows中我们可以通过快捷键 ctrl + c 复制,ctrl + v 粘贴,在 linux 中需要使用命令. 复制移动 cp 就是 copy 的意思.请看示例 ...