整合Spring、Spring MVC与MyBatis:构建高效Java Web应用

本文将详细讲解如何整合Spring、Spring MVC和MyBatis(SSM框架),通过一个人员信息查询案例展示完整开发流程。所有代码基于提供的文件实现。

一、项目结构
html 复制代码
src/
├── main/
│   ├── java/
│   │   └── com/
│   │       └── qcby/
│   │           ├── controller/   # 控制层
│   │           │   └── PersonController.java
│   │           ├── dao/          # 数据访问层
│   │           │   └── PersonDao.java
│   │           ├── entity/       # 实体类
│   │           │   └── Person.java
│   │           └── service/      # 服务层
│   │               ├── PersonService.java
│   │               └── impl/
│   │                   └── PersonServiceImpl.java
│   ├── resources/
│   │   ├── mapper/              # MyBatis映射文件
│   │   │   └── PersonMapper.xml
│   │   ├── jdbc.properties      # 数据库配置
│   │   ├── spring.xml           # Spring配置
│   │   └── SpringMVC.xml        # Spring MVC配置
│   └── webapp/
│       ├── html/
│       │   ├── index.html       # 首页
│       │   └── person.html      # 人员页面
│       └── WEB-INF/
│           └── web.xml          # Web配置
二、核心实现步骤
1. 实体类(Person.java)
java 复制代码
package com.qcby.entity;

public class Person {
    private Integer id;
    private String name;
    private String sex;
    private Integer age;
    private String idCard;
    private String phone;
    
    // Getter/Setter和toString()省略
}
2. MyBatis映射文件(PersonMapper.xml)
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.qcby.dao.PersonDao">
    <select id="findAll" resultType="Person">
        SELECT id, name, sex, age, idCard, phone 
        FROM person
    </select>
</mapper>
3. 控制层(PersonController.java)
java 复制代码
@Controller
public class PersonController {
    @Autowired
    private PersonService personService;

    // 跳转到人员页面
    @RequestMapping("/toPerson")
    public String toPerson() {
        return "person"; // 对应html/person.html
    }

    // 查询所有人员(返回JSON)
    @RequestMapping("/findAll")
    @ResponseBody
    public List<Person> findAll() {
        return personService.findAll();
    }
}
4. 服务层(PersonServiceImpl.java)
java 复制代码
@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    private PersonDao personDao;

    @Override
    public List<Person> findAll() {
        return personDao.findAll();
    }
}
三、关键配置详解
1. Spring配置(spring.xml)
XML 复制代码
<!-- 数据源配置 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="url" value="${jdbc.url}"/>
    <property name="driverClassName" value="${jdbc.driver}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

<!-- MyBatis整合 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="typeAliasesPackage" value="com.qcby.entity"/>
    <property name="mapperLocations" value="classpath:mapper/*.xml"/>
</bean>

<!-- Mapper接口扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.qcby.dao"/>
</bean>
2. Spring MVC配置(SpringMVC.xml)
XML 复制代码
<!-- 视图解析器(Thymeleaf) -->
<bean id="viewResolver" class="org.thymeleaf.spring4.view.ThymeleafViewResolver">
    <property name="templateEngine" ref="templateEngine"/>
    <property name="characterEncoding" value="UTF-8"/>
</bean>

<bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine">
    <property name="templateResolver" ref="templateResolver"/>
</bean>

<bean id="templateResolver" class="org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver">
    <property name="prefix" value="/html/"/>
    <property name="suffix" value=".html"/>
</bean>

<!-- 支持JSON响应 -->
<bean class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
3. Web配置(web.xml)
XML 复制代码
<!-- 字符编码过滤器 -->
<filter>
    <filter-name>encodingFilter</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>
</filter>

<!-- Spring MVC前端控制器 -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:SpringMVC.xml</param-value>
    </init-param>
</servlet>
四、前端页面示例
1. 首页(index.html)
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <h1>欢迎使用人员管理系统</h1>
    <a href="/toPerson">查看人员列表</a>
</body>
</html>
2. 人员页面(person.html)
html 复制代码
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>人员信息</title>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>
<body>
    <div id="app">
        <table border="1">
            <tr>
                <th>ID</th>
                <th>姓名</th>
                <th>性别</th>
                <th>年龄</th>
            </tr>
            <tr v-for="person in personList">
                <td>{{ person.id }}</td>
                <td>{{ person.name }}</td>
                <td>{{ person.sex }}</td>
                <td>{{ person.age }}</td>
            </tr>
        </table>
    </div>

    <script>
        new Vue({
            el: '#app',
            data: { personList: [] },
            mounted() {
                axios.get('/findAll')
                    .then(response => {
                        this.personList = response.data;
                    });
            }
        });
    </script>
</body>
</html>
五、技术亮点解析
  1. 依赖注入

    通过@Autowired实现层间解耦,Controller → Service → Dao 清晰调用链。

  2. 声明式事务
    @Transactional注解管理事务(需在Service层添加)。

  3. RESTful支持
    @ResponseBody自动将Java对象转为JSON响应。

  4. 连接池优化

    使用Druid连接池提升数据库访问性能。

  5. 前后端分离

    前端通过Axios调用后端API,Vue.js动态渲染数据。

六、常见问题解决

问题1:静态资源404
方案:在SpringMVC.xml中添加:

XML 复制代码
<mvc:resources mapping="/html/**" location="/html/"/>

问题2:事务不生效
方案:确保在spring.xml中开启注解驱动:

XML 复制代码
<tx:annotation-driven transaction-manager="txManager"/>

问题3:中文乱码
方案:检查三处UTF-8配置:

  1. web.xml的CharacterEncodingFilter

  2. 数据库连接字符串的characterEncoding=utf-8

  3. 视图解析器的characterEncoding属性

通过以上完整实现,我们构建了一个基于SSM框架的企业级应用。这种分层架构兼顾了灵活性和可维护性,适合快速开发复杂业务系统。

相关推荐
Hellyc31 分钟前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen34 分钟前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge1 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再2 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂2 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
有没有没有重复的名字3 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
程序员的世界你不懂4 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(4)集成Allure报表
java·selenium·maven
isNotNullX5 小时前
数据中台架构解析:湖仓一体的实战设计
java·大数据·数据库·架构·spark
皮皮林5515 小时前
“RPC好,还是RESTful好?”,这个问题不简单
java
Xiaouuuuua5 小时前
一个简单的脚本,让pdf开启夜间模式
java·前端·pdf