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

相关推荐
四谎真好看8 天前
SSM学习笔记(SpringBoot篇)
spring boot·笔记·学习·学习笔记·ssm
四谎真好看11 天前
SSM学习笔记(SpringMVC篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看13 天前
SSM学习笔记(SpringMVC篇 Day01)
笔记·学习·学习笔记·ssm
四谎真好看17 天前
SSM学习笔记(Spring篇Day03)
笔记·学习·学习笔记·ssm
四谎真好看18 天前
SSM学习笔记(Spring篇 Day02)
笔记·学习·学习笔记·ssm
四谎真好看20 天前
SSM学习笔记(Spring篇 Day01)
笔记·学习·学习笔记·ssm
tctctttccc22 天前
不属于c2c电子商务模式的网站是:成功案例与发展优势详解
utf-8·mybatis·ssm·配置·整合
qq_124987075322 天前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
biyezuopinvip23 天前
基于Spring Boot的企业网盘的设计与实现(任务书)
java·spring boot·后端·vue·ssm·任务书·企业网盘的设计与实现
我真会写代码25 天前
SSM(指南一)---Maven项目管理从入门到精通|高质量实操指南
java·spring·tomcat·maven·ssm