整合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
英文地址,請注明出處:http://en.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…