SSM框架搭建最佳实践
基于SSM框架开发时总体分为以下5步:
- 创建项目
- 引入POM
- 修改配置
- 编写业务
- 运行测试
重点应该放在编写业务上,SSM框架的搭建过程中配置比较繁琐,将配置模板直接引入到新项目中即可,不用纠结,也无需记忆,只要会根据实际情况对配置做相应修改即可。
1、创建项目
在IDEA中使用Maven的方式创建项目。
1.1 新建Maven项目
新建Maven项目,选择maven-archetype-webapp类型,注意JDK版本,需要使用JDK17及以上版本,这里选择JDK 21版本,填写组ID等信息后完成创建。

2、引入POM
引入Spring、SpringMVC、MyBatis框架及相关依赖包。
2.1 引入Spring框架相关依赖
Spring框架核心依赖,整个项目的基座,版本统一为:
<spring.version>6.2.11</spring.version>

2.2 引入SpringMVC相关依赖
基于SpringMVC框架开发Web项目时所需要的相关依赖(文件上传相关依赖根据项目情况引入),对应版本为:<spring.version>6.2.11</spring.version>
<jstl.version>2.0.0</jstl.version>
<taglib.version>1.2.5</taglib.version>
<servlet-api.version>6.0.0</servlet-api.version>
<fileupload.version>1.6.0</fileupload.version>

2.3 引入MyBatis框架相关依赖
核心包括MyBatis框架依赖包、MyBatis-Spring整合包以及MySQL数据库连接驱动及数据源相关依赖包。对应版本:
<mybatis.version>3.5.19</mybatis.version>
<jboss-vfs.version>3.3.2.Final</jboss-vfs.version>
<mybatis-spring.version>3.0.5</mybatis-spring.version>
<mysql-connector.version>9.3.0</mysql-connector.version>
<druid.version>1.2.24</druid.version>

2.4 引入其他依赖
除了三大框架核心依赖之外,项目运行还需要以下基础依赖,包括@Resource注解、FastJSON、Log4j2日志、JUnit测试等相关依赖,对应版本:
<annotation-api.version>2.1.1</annotation-api.version>
<fastjson.version>2.0.52</fastjson.version>
<log4j2.version>2.19.0</log4j2.version>
<junit.version>4.13.2</junit.version>

完整的POM配置文件如下:
XML
XML
pom.xml
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- 组织名称 -->
<groupId>com.ktjy</groupId>
<!-- 组件名称(全局唯一) -->
<artifactId>KT-SSM</artifactId>
<!-- 版本号 -->
<version>1.0-SNAPSHOT</version>
<!-- 打包方式 jar:打包为可执行的jar文件,war:打包为可部署的war文件 -->
<packaging>war</packaging>
<!-- 项目名称 -->
<name>KT-SSM</name>
<!-- 定义项目属性 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>21</maven.compiler.source>
<maven.compiler.target>21</maven.compiler.target>
<servlet-api.version>6.0.0</servlet-api.version>
<jstl.version>2.0.0</jstl.version>
<taglib.version>1.2.5</taglib.version>
<spring.version>6.2.11</spring.version>
<mybatis.version>3.5.19</mybatis.version>
<jboss-vfs.version>3.3.2.Final</jboss-vfs.version>
<mybatis-spring.version>3.0.5</mybatis-spring.version>
<mysql-connector.version>9.3.0</mysql-connector.version>
<druid.version>1.2.24</druid.version>
<fileupload.version>1.6.0</fileupload.version>
<annotation-api.version>2.1.1</annotation-api.version>
<fastjson.version>2.0.52</fastjson.version>
<log4j2.version>2.19.0</log4j2.version>
<junit.version>4.13.2</junit.version>
</properties>
<!-- 引入项目依赖 -->
<dependencies>
<!-- 引入Spring框架核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Spring框架AOP依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Spring框架JDBC依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Spring框架事务管理依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Spring框架Web基础依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入SpringMVC框架依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 引入Servlet API依赖 -->
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>${servlet-api.version}</version>
</dependency>
<!-- 引入JSTL标准标签库依赖 -->
<dependency>
<groupId>jakarta.servlet.jsp.jstl</groupId>
<artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>jakarta.servlet.jsp.jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>${taglib.version}</version>
</dependency>
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>${taglib.version}</version>
</dependency>
<!-- 引入文件上传相关依赖 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${fileupload.version}</version>
</dependency>
<!-- 引入MyBatis框架依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- 解决MyBatis框架加载别名包实体类时控制台显示乱码问题 -->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jboss-vfs</artifactId>
<version>${jboss-vfs.version}</version>
</dependency>
<!-- 引入MyBatis-Spring框架整合依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>${mybatis-spring.version}</version>
</dependency>
<!-- 引入MySQL数据库驱动依赖 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>${mysql-connector.version}</version>
</dependency>
<!-- 引入Druid数据库连接池依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- 引入@Resource注解支持依赖 -->
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>${annotation-api.version}</version>
</dependency>
<!-- 引入FastJSON依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- 引入Log4j2日志框架核心依赖 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j2-impl</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!-- 引入JUnit测试框架依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 配置资源目录 -->
<build>
<finalName>KT-SSM</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
</project>
3、修改配置
在resources目录下创建mybatis-config.xml、applicationContext.xml、springmvc-servlet.xml以及database.properties、log4j2.xml等配置文件。最后记得在web.xml中配置监听器及全局DispatcherServlet映射。
3.1 mybatis-config.xml
注意修改:

参考配置文件:
XML
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 全局配置文件 -->
<settings>
<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="false" />
<!-- 开启控制台日志 -->
<setting name="logImpl" value="STDOUT_LOGGING" />
<!-- 全自动映射级别 -->
<setting name="autoMappingBehavior" value="FULL" />
</settings>
<!-- 类型别名,配置基础包,配置之后在Mapper.xml文件中可以使用类名称首字母小写方式简写 -->
<typeAliases>
<package name="com.ktjy.pojo" />
</typeAliases>
</configuration>
3.2 applicationContext.xml
注意修改:



参考配置文件:
XML
applicationContext.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:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- Spring支持扫描指定包,配合注解注入Bean -->
<context:component-scan base-package="com.ktjy.service" />
<!-- 读取数据库配置文件 -->
<context:property-placeholder location="classpath:database.properties" />
<!-- 数据源配置,使用DBCP连接池 -->
<!-- <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<!-- ========== 基本连接属性配置 ========== -->
<!-- 数据库驱动类配置 -->
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 数据库连接URL配置 -->
<property name="url" value="${jdbc.url}" />
<!-- 数据库连接用户名配置 -->
<property name="username" value="${jdbc.username}" />
<!-- 数据库连接密码配置 -->
<property name="password" value="${jdbc.password}" />
<!-- ============= 连接池策略配置 =============== -->
<!-- 数据库连接池在初始化连接时,立刻创建的连接个数 -->
<property name="initialSize" value="${pool.initialSize}" />
<!-- 连接池中同时连接的最大连接数 -->
<property name="maxTotal" value="${pool.maxTotal}" />
<!-- 连接池中允许的最大空闲连接数,高于该值连接池将销毁部分空闲连接 -->
<property name="maxIdle" value="${pool.maxIdle}" />
<!-- 连接池中可允许的最小空闲连接数,低于该数值的连接池将会创建新的连接 -->
<property name="minIdle" value="${pool.minIdle}" />
<!-- 最大等待连接时间,单位为毫秒。默认-1 无限等待 -->
<property name="maxWaitMillis" value="${pool.maxWaitMillis}" />
<!-- 在连接池维护过程中,是否检查连接是否被废弃。默认值为 false -->
<property name="removeAbandonedOnMaintenance" value="${pool.removeAbandonedOnMaintenance}" />
<!-- 当从连接池中获取连接时,是否检查连接是否被废弃。默认值为 false -->
<property name="removeAbandonedOnBorrow" value="${pool.removeAbandonedOnBorrow}" />
<!-- 控制连接池在超出配置的时间后回收没有用的连接 -->
<property name="removeAbandonedTimeout" value="${pool.removeAbandonedTimeout}" />
</bean> -->
<!-- 配置数据源,使用Druid数据库连接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!-- 连接池配置 -->
<property name="initialSize" value="${pool.initialSize}" />
<property name="maxActive" value="${pool.maxActive}" />
<property name="minIdle" value="${pool.minIdle}" />
<property name="maxWait" value="${pool.maxWait}" />
</bean>
<!-- 通过JNDI配置DataSource -->
<!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/bdqn_db" />
</bean> -->
<!-- 配置SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 引用数据库配置<bean id="dataSource"> -->
<property name="dataSource" ref="dataSource" />
<!-- 引入MyBatis配置文件 -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
<!--配置SQL映射文件信息-->
<property name="mapperLocations">
<list>
<value>classpath:mapper/**/*.xml</value>
</list>
</property>
</bean>
<!-- 使用MapperScannerConfig配置DAO -->
<!-- MyBatis-Spring提供的MapperScannerConfigurer将递归扫描基准包(包括各层级子包)下所有接口。如果他们在SQL映射文件中定义过,则将它们动态注册为映射器实现类,即可批量生成映射器的实现类了 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- Mapper接口所在基础包 -->
<property name="basePackage" value="com.ktjy.mapper" />
<!-- 注意此处需注入sqlSessionFactory的bean名称 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
<!-- 声明式事务配置 -->
<!-- 首先,定义事务管理器(这里使用的是JDBC事务管理器,除此之外还有Java原生API事务管理器、JPA事务管理器、Hibernate事务管理器等) -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- 注入数据源 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 配置事务属性,方式一:编写配置的方式进行事务配置 -->
<!-- 声明式事务配置,为不同业务方法指定具体的事务规则(transaction-manager属性的默认值是transactionManager。也就是说,如果事务管理器Bean名称是transactionManager,则可以不指定该属性值) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 根据方法名指定事务的属性,星号(*)表示通配符 -->
<tx:method name="*" />
<!-- propagation 配置事务传播行为 -->
<tx:method name="purchase" propagation="REQUIRES_NEW" />
<!-- isolation 配置事务的隔离级别 -->
<tx:method name="update*" isolation="SERIALIZABLE" />
<!-- rollback-for 配置事务遇到异常必须回滚; no-rollback-for 配置事务遇到异常不回滚 -->
<tx:method name="add*" rollback-for="java.io.IOException" no-rollback-for="com.bdqn.common.SendEMailException" />
<!-- read-only 配置事务只读属性 -->
<tx:method name="find*" read-only="true" />
<!-- timeout 配置事务的超时属性 -->
<tx:method name="get*" timeout="3" />
</tx:attributes>
</tx:advice>
<!-- 定义切面,把事务切入点和事务属性关联起来 -->
<aop:config>
<!-- 定义切入点 expression="execution(* com.bdqn.service..*.*(..))" 第一个[*]表示任意返回值类型;[com.bdqn.service..]代表匹配com.bdqn.service包及其子包;[*.*(..)]代表匹配包中所有类的所有方法 -->
<aop:pointcut id="serviceTX" expression="execution(* com.ktjy.service..*.*(..))" />
<!-- 将切入点和事务属性关联起来 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceTX" />
</aop:config>
</beans>
3.3 springmvc-servlet.xml
注意修改:



参考配置文件:
XML
springmvc-servlet.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解驱动-->
<mvc:annotation-driven />
<!--注解扫码的基础包-->
<context:component-scan base-package="com.ktjy.controller" />
<!--定义控制器,通过/hello路径访问HelloController-->
<!-- <bean name="/hello" class="com.bdqn.controller.HelloController" /> -->
<!--视图映射器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix表示前缀,suffix表示后缀,最终视图路径为:前缀 + 视图名称 + 后缀。例如:/WEB-INF/hello.jsp -->
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
<!--静态资源配置,例如:访问 http://localhost:8080/ssm/statics/css/style.css 被映射到文件 webapp/statics/css/style.css -->
<!-- <mvc:resources mapping="/statics/**" location="/statics/" /> -->
<!--配置文件上传解析器-->
<!-- <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000" />
<property name="defaultEncoding" value="UTF-8" />
</bean> -->
<!-- 自定义拦截器配置,某些页面登录后才能访问 -->
<!-- <mvc:interceptors>
<mvc:interceptor>
<!-- 拦截的路径 -->
<mvc:mapping path="/user/**" />
<!-- 允许的路径 -->
<mvc:exclude-mapping path="/user/login" />
<!-- 自定义拦截器 -->
<bean class="com.bdqn.common.SysInterceptor" />
</mvc:interceptor>
</mvc:interceptors> -->
<!--全局异常处理-->
<!-- <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!--如果发生RuntimeException异常,则跳转到error视图(前缀+"error"+后缀)-->
<prop key="java.lang.RuntimeException">error</prop>
</props>
</property>
</bean> -->
</beans>
3.4 database.properties
注意修改:

参考配置文件:
XML
database.properties
# 数据库连接基础配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ktsms_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=lilibo
# 数据连接池相关配置(Druid)
pool.initialSize=20
pool.maxActive=100
pool.minIdle=45
pool.maxWait=60000
# 数据连接池相关配置(DBCP)
#pool.maxTotal=100
#pool.initialSize=20
#pool.minIdle=45
#pool.maxIdle=50
#pool.maxWaitMillis=60000
#pool.removeAbandonedOnMaintenance=true
#pool.removeAbandonedOnBorrow=true
#pool.removeAbandonedTimeout=180
3.5 log4j2.xml
根据实际需要修改日志级别,参考配置文件:
XML
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Appenders>
<!-- 控制台输出配置 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout charset="GBK" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %msg%n" />
</Console>
<!-- 日志文件输出配置 -->
<File name="File" filename="logs/catalina.log">
<PatternLayout charset="UTF-8" pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger{36} - %msg%n" />
</File>
</Appenders>
<Loggers>
<!-- 根日志配置,设置默认级别为 INFO(日志级别:TRACE < DEBUG < INFO < WARN < ERROR) -->
<root level="INFO">
<appender-ref ref="Console" />
<appender-ref ref="File" />
</root>
</Loggers>
</Configuration>
3.6 web.xml
参考配置文件:
XML
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">
<!-- 配置欢迎页面 -->
<welcome-file-list>
<welcome-file>/index.jsp</welcome-file>
</welcome-file-list>
<!-- Spring上下文配置 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 指定Spring上下文配置文件的位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- SpringMVC配置 -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<!-- Spring核心Servlet:总分发器DispatcherServlet -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 初始化参数:指定SpringMVC配置文件的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- 配置DispatcherServlet加载时的优先级,数字越小,优先级越高 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!-- 映射所有请求到DispatcherServlet -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
配置完毕后,项目结构和配置文件列表如图所示:

4、编写业务
通过数据库工具创建数据源,自动生成实体类。基于实体类编写数据访问层MyBatis接口及映射文件,业务逻辑层接口及实现类,最后编写控制器实现整体流程控制和分发。
4.1 创建数据库连接
为了能利用数据库工具基于数据库表快速创建实体类等模式代码,首先需要创建数据库连接。

4.2 创建实体类
选择对应的表,右键,依次选择工具->脚本化扩展程序->Generate POJO-GetSet.groovy在pojo目录中生成实体类。


4.3 编写MyBatis接口
创建MyBatis接口,按实体类+Mapper规范命名,根据业务需求在接口中定义方法。

java
SysUserMapper.java
package com.ktjy.mapper;
import com.ktjy.pojo.SysUser;
import java.util.List;
/**
* SysUserMapper 系统用户Mapper接口
*
* @author LILIBO
* @since 2025-12-03
*/
public interface SysUserMapper {
/**
* 查询所有用户
*/
List<SysUser> selectAll();
}
4.4 编写Mapper映射文件
在resources/mapper目录中创建MyBatis接口对应的Mapper映射文件,注意namespace属性与接口全路径一致。

在IDEA中,MyBatis接口中定义的方法报红不用慌,鼠标点到方法定义处,按Alt + Enter->选择Generate statement生成该接口方法对应的Mapper映射。

在生成的<select></select>等标签中编写相应SQL语句。因为配置了别名包,resultType可以将全路径的实体类名称简写为别名(小驼峰命名法类名称)。

XML
SysUserMapper.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.ktjy.mapper.SysUserMapper">
<!-- 查询所有用户 -->
<select id="selectAll" resultType="sysUser">
select *
from sys_user
</select>
</mapper>
4.5 编写Service层接口
创建Service层接口,按实体类+Service规范命名,根据业务需求在接口中定义方法。

java
SysUserService.java
package com.ktjy.service;
import com.ktjy.pojo.SysUser;
import java.util.List;
/**
* SysUserService 系统用户服务接口
*
* @author LILIBO
* @since 2025-12-03
*/
public interface SysUserService {
/**
* 查询所有用户
*/
List<SysUser> findAll();
}
4.6 编写Service层实现类

java
SysUserServiceImpl.java
package com.ktjy.service.impl;
import com.ktjy.mapper.SysUserMapper;
import com.ktjy.pojo.SysUser;
import com.ktjy.service.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* SysUserServiceImpl 系统用户服务实现类
*
* @author LILIBO
* @since 2025-12-03
*/
@Service
public class SysUserServiceImpl implements SysUserService {
/**
* 注入系统用户Mapper接口实例
*/
@Resource
private SysUserMapper sysUserMapper;
/**
* 查询所有用户
*/
@Override
public List<SysUser> findAll() {
// 调用Mapper接口方法查询所有用户
return sysUserMapper.selectAll();
}
}
4.7 编写Controller层控制器

java
SysUserController.java
package com.ktjy.controller;
import com.ktjy.pojo.SysUser;
import com.ktjy.service.SysUserService;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;
/**
* SysUserController 系统用户控制器
*
* @author LILIBO
* @since 2025-12-03
*/
@Controller
@RequestMapping("/sysUser")
public class SysUserController {
/**
* 注入系统用户服务接口实例
*/
@Resource
private SysUserService sysUserService;
/**
* 查询所有用户
*/
@GetMapping("/findAll")
public String findAll(Model model) {
// 调用系统用户服务接口方法查询所有用户
List<SysUser> sysUserList = sysUserService.findAll();
// 将查询到的用户列表添加到模型中
model.addAttribute("sysUserList", sysUserList);
// 返回逻辑视图名称(使用SpringMVC视图解析器配置中的 前缀 + 视图名称 + 后缀 进行定位)
return "user";
}
}
其中findAll()方法返回值"user"为视图名称,根据springmvc-servlet.xml配置,需要在webapp/WEB-INF/jsp/目录下创建user.jsp页面作为控制器的视图返回浏览器。

4.8 编写JSP页面
在webapp/WEB-INF/jsp/目录下创建user.jsp页面。

编写页面代码。

javascript
WEB-INF/jsp/user.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>用户管理</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
<tr>
<th>账号</th>
<th>真实姓名</th>
<th>性别</th>
<th>出生日期</th>
<th>手机号码</th>
<th>用户地址</th>
</tr>
<!-- 遍历用户列表,将每个用户的信息显示在表格中 -->
<c:forEach items="${sysUserList}" var="sysUser">
<tr>
<td>${sysUser.account}</td>
<td>${sysUser.realName}</td>
<td>${sysUser.sex == 1 ? '男' : '女'}</td>
<td>${sysUser.birthday}</td>
<td>${sysUser.phone}</td>
<td>${sysUser.address}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
5、运行测试
注意:Spring6.0需要使用Tomcat10作为Web容器进行部署运行。
5.1 配置Tomcat





5.2 启动Tomcat

