SSM框架搭建最佳实践

SSM框架搭建最佳实践

基于SSM框架开发时总体分为以下5步:

  1. 创建项目
  1. 引入POM
  1. 修改配置
  1. 编写业务
  1. 运行测试

重点应该放在编写业务上,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

相关推荐
LSL666_3 天前
4 ssm项目配置https
网络协议·http·https·ssm
v_JULY_v9 天前
一文通透mamba2「力证Transformer are SSM」:从SSM、半可分矩阵、SMA、SSD到mamba2
ssm·ssd·sma·mamba2·mamba1·半可分矩阵
元亓亓亓2 个月前
SSM--day4--SpringMVC(补充)
java·后端·ssm
煎蛋学姐2 个月前
SSM宠物领养平台16e63(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm·宠物·宠物领养·宠物种类·领养人
煎蛋学姐2 个月前
SSM宠物托运网站8m8iz(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·ssm·宠物·宠物百科·上门取件·收件人信息
马克学长2 个月前
SSM滁州学院考研信息分享论坛0iaj2 (程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·考研·ssm
Cyan_RA93 个月前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc
王嘉俊9253 个月前
SpringBoot应用开发指南:从入门到高级配置与自动装配原理
java·spring boot·后端·spring·ssm
Cyan_RA93 个月前
SpringMVC 执行流程分析 详解(图解SpringMVC执行流程)
java·人工智能·后端·spring·mvc·ssm·springmvc