本文将详细讲解如何整合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>
五、技术亮点解析
-
依赖注入
通过
@Autowired
实现层间解耦,Controller → Service → Dao 清晰调用链。 -
声明式事务
@Transactional
注解管理事务(需在Service层添加)。 -
RESTful支持
@ResponseBody
自动将Java对象转为JSON响应。 -
连接池优化
使用Druid连接池提升数据库访问性能。
-
前后端分离
前端通过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配置:
-
web.xml的CharacterEncodingFilter
-
数据库连接字符串的
characterEncoding=utf-8
-
视图解析器的
characterEncoding
属性
通过以上完整实现,我们构建了一个基于SSM框架的企业级应用。这种分层架构兼顾了灵活性和可维护性,适合快速开发复杂业务系统。