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

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

一、项目结构
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)
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 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)
@Controller
public class PersonController {@Autowiredprivate PersonService personService;// 跳转到人员页面@RequestMapping("/toPerson")public String toPerson() {return "person"; // 对应html/person.html}// 查询所有人员(返回JSON)@RequestMapping("/findAll")@ResponseBodypublic List<Person> findAll() {return personService.findAll();}
}
4. 服务层(PersonServiceImpl.java)
@Service
public class PersonServiceImpl implements PersonService {@Autowiredprivate PersonDao personDao;@Overridepublic List<Person> findAll() {return personDao.findAll();}
}
三、关键配置详解
1. Spring配置(spring.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)
<!-- 视图解析器(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)
<!-- 字符编码过滤器 -->
<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)
<!DOCTYPE html>
<html>
<head><title>首页</title>
</head>
<body><h1>欢迎使用人员管理系统</h1><a href="/toPerson">查看人员列表</a>
</body>
</html>
2. 人员页面(person.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中添加:

<mvc:resources mapping="/html/**" location="/html/"/>

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

<tx:annotation-driven transaction-manager="txManager"/>

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

  1. web.xml的CharacterEncodingFilter

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

  3. 视图解析器的characterEncoding属性

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88163.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88163.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频插帧技术:从流畅观影到AI创作的革命

一、起源&#xff1a;为什么需要视频插帧&#xff1f; 视频的本质是连续播放的静态帧序列&#xff0c;帧率&#xff08;FPS&#xff09; 决定了流畅度。早期电影受限于拍摄技术和存储成本&#xff0c;普遍采用24FPS&#xff0c;而现代显示设备&#xff08;如120Hz屏幕&#xf…

【一起来学AI大模型】PyTorch 实战示例:使用 BatchNorm 处理张量(Tensor)

PyTorch 实战示例 演示如何在神经网络中使用 BatchNorm 处理张量&#xff08;Tensor&#xff09;&#xff0c;涵盖关键实现细节和常见陷阱。示例包含数据准备、模型构建、训练/推理模式切换及结果分析。示例场景&#xff1a;在 CIFAR-10 数据集上实现带 BatchNorm 的 CNNimport…

第8章:应用层协议HTTP、SDN软件定义网络、组播技术、QoS

应用层协议HTTP 应用层协议概述 应用层协议非常多&#xff0c;我们重点熟悉以下常见协议功能即可。 Telnet:远程登录协议&#xff0c;基于TCP 23端口&#xff0c;用于远程管理设备&#xff0c;采用明文传输。安全外壳协议 (SecureShell,SSH) ,基于TCP 22端口&#xff0c;用于…

uniapp页面间通信

uniapp中通过eventChannel实现页面间通信的方法&#xff0c;这是一种官方推荐的高效传参方式。我来解释下这种方式的完整实现和注意事项&#xff1a;‌发送页面&#xff08;父页面&#xff09;‌&#xff1a;uni.navigateTo({url: /pages/detail/detail,success: (res) > {/…

Android ViewModel机制与底层原理详解

Android 的 ViewModel 是 Jetpack 架构组件库的核心部分&#xff0c;旨在以生命周期感知的方式存储和管理与 UI 相关的数据。它的核心目标是解决两大痛点&#xff1a; 数据持久化&#xff1a; 在配置变更&#xff08;如屏幕旋转、语言切换、多窗口模式切换&#xff09;时保留数…

双倍硬件=双倍性能?TDengine线性扩展能力深度实测验证!

软件扩展能力是软件架构设计中的一个关键要素&#xff0c;具有良好扩展能力的软件能够充分利用新增的硬件资源。当软件性能与硬件增加保持同步比例增长时&#xff0c;我们称这种现象为软件具有线性扩展能力。要实现这种线性扩展并不简单&#xff0c;它要求软件架构精心设计&…

频繁迭代下完成iOS App应用上架App Store:一次快速交付项目的完整回顾

在一次面向商户的会员系统App开发中&#xff0c;客户要求每周至少更新一次版本&#xff0c;涉及功能迭代、UI微调和部分支付方案的更新。团队使用Flutter进行跨平台开发&#xff0c;但大部分成员日常都在Windows或Linux环境&#xff0c;只有一台云Mac用于打包。如何在高频率发布…

springsecurity03--异常拦截处理(认证异常、权限异常)

目录 Spingsecurity异常拦截处理 认证异常拦截 权限异常拦截 注册异常拦截器 设置跨域访问 Spingsecurity异常拦截处理 认证异常拦截 /*自定义认证异常处理器类*/ Component public class MyAuthenticationExceptionHandler implements AuthenticationEntryPoint {Overr…

企业如何制作网站?网站制作的步骤与流程?

以下是2025年网站制作的综合指南&#xff0c;涵盖核心概念、主流技术及实施流程&#xff1a; 一、定义与范畴 网站制作是通过页面结构设计、程序设计、数据库开发等技术&#xff0c;将视觉设计转化为可交互网页的过程&#xff0c;包含前端展示与后台功能实现。其核心目标是为企…

Rust+Blender:打造高性能游戏引擎

基于Rust和Blender的游戏引擎 以下是基于Rust和Blender的游戏引擎开发实例,涵盖不同应用场景和技术方向的实际案例。案例分为工具链整合、渲染技术、物理模拟等类别,每个案例附核心代码片段或实现逻辑。 工具链整合案例 案例1:Blender模型导出到Bevy引擎 使用blender-bev…

Git基本操作1

Git 是一款分布式版本控制系统&#xff0c;主要用于高效管理代码版本和团队协作开发。它能精确记录每次代码修改&#xff0c;支持版本回溯和分支管理&#xff0c;让开发者可以并行工作而互不干扰。通过本地提交和远程仓库同步&#xff0c;Git 既保障了代码安全&#xff0c;又实…

React Native 组件间通信方式详解

React Native 组件间通信方式详解 在 React Native 开发中&#xff0c;组件间通信是核心概念之一。以下是几种主要的组件通信方式及其适用场景&#xff1a; 简单父子通信&#xff1a;使用 props 和回调函数兄弟组件通信&#xff1a;提升状态到共同父组件跨多级组件&#xff1a;…

TCP的可靠传输机制

TCP通过校验和、序列号、确认应答、重发控制、连接管理以及窗口控制等机制实现可靠性的传输。 先来看第一个可靠性传输的方法。 通过序列号和可靠性提供可靠性 TCP是面向字节的。TCP把应用层交下来的报文&#xff08;可能要划分为许多较短的报文段&#xff09;看成一个一个字节…

没有DBA的敏捷开发管理

前言一家人除了我都去旅游了&#xff0c;我这项请假&#xff0c;请不动啊。既然在家了&#xff0c;闲着也是闲着&#xff0c;就复盘下最近的工作&#xff0c;今天就复盘表结构管理吧&#xff0c;随系统启动的&#xff0c;不是flyway&#xff0c;而是另一个liquibase&#xff0c…

go-carbon v2.6.10发布,轻量级、语义化、对开发者友好的 golang 时间处理库

carbon 是一个轻量级、语义化、对开发者友好的 Golang 时间处理库&#xff0c;提供了对时间穿越、时间差值、时间极值、时间判断、星座、星座、农历、儒略日 / 简化儒略日、波斯历 / 伊朗历的支持。 carbon 目前已捐赠给 dromara 开源组织&#xff0c;已被 awesome-go 收录&am…

【AI News | 20250708】每日AI进展

AI Repos 1、claude-code-templates Claude Code Templates是一款全面的命令行工具&#xff0c;旨在为不同编程语言和框架&#xff08;如JavaScript/TypeScript、Python等&#xff0c;Go和Rust即将推出&#xff09;提供优化的Claude Code配置。它通过交互式设置、自动化钩子&a…

Nginx源码安装+静态站点部署指南(CentOS 7)

安装包&#xff1a;可自行前往我的飞书下载 Docs 也可以进入 nginx 官网&#xff0c;下载自己所需适应版本 nginx 开始安装nginx 1. 创建准备目录 cd /opt mkdir soft module # 创建软件包和源码解压目录 2. 安装依赖环境 yum -y install make zlib zlib-devel gcc-c l…

交换机的核心原理和作用

一、交换机的核心原理交换机是一种用于连接多台设备的网络硬件&#xff0c;其核心原理基于二层网络&#xff08;数据链路层&#xff09;的 MAC 地址寻址1. MAC 地址学习与存储当交换机接收到数据帧时&#xff0c;会读取帧中的源 MAC 地址&#xff0c;并将该地址与对应的端口号记…

【工具变量】上市公司企业金融强监管数据、资管新规数据(2001-2024年)

数据简介&#xff1a;参考顶刊《经济研究》李青原&#xff08;2022&#xff09;老师的做法&#xff0c;Post 为时间虚拟变量&#xff0c;根据资管新规实施的时间&#xff0c;当观测期为2018 年上半年及之后时&#xff0c;Post 取值1&#xff0c;否则取值0。PreFin 为资管新规实…

CSS Grid与Flexbox布局实战对比

概述 CSS布局技术在过去几年经历了重大变革&#xff0c;从传统的基于浮动和定位的方法&#xff0c;到现在强大的Flexbox和Grid布局系统。这两种现代布局方法极大地简化了复杂界面的开发过程&#xff0c;但它们各自适用于不同的场景。本文将对Flexbox和Grid进行深入比较&#x…