整合SSM——(SpringMVC+Spring+Mybatis)

??

目錄

SSM整合?

創建項目

導入依賴

配置文件

SpringConfig

MyBatisConfig

JdbcConfig

ServletConfig

SpringMvcConfig

功能模塊

測試

業務層接口測試

控制層測試


? ? SSM是Java Web開發中常用的三個主流框架組合的縮寫,分別對應SpringSpring MVCMyBatis。這三個框架協同工作,能夠完成企業級應用開發中的業務邏輯、Web層交互及數據持久化任務。

  1. Spring:作為SSM的基礎框架,主要負責依賴注入(DI)和面向切面編程(AOP)。它簡化了Java程序對數據庫的訪問,提高了數據庫的訪問效率和穩定性。
  2. Spring MVC:實際上是Spring框架的擴展,屬于Spring框架的一部分。它主要負責Web層的交互,使得開發Web應用變得更加簡單和高效。
  3. MyBatis:是一個支持普通SQL查詢、存儲過程和高級映射的持久層框架。它消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索,使得開發者可以更加專注于業務邏輯的實現。

SSM整合?

創建項目

? ? 首先新建一個項目,詳情請見:SpringMVC概述以及入門案例-CSDN博客,新建項目后再main下方新建test目錄用作測試:

? ????

導入依賴

?ssm整合需要導入一些依賴包,具體如下:

  • spring-webmvc
  • spring-jdbc
  • spring-contest
  • mybatis
  • mybatis-spring
  • mysql-connector-java
  • druid
  • junit
  • javax.servlet-api
  • jackson-databind
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.18</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

配置文件

? ? 接下來在java包下面新建軟件包config,用于存放各種配置來,分別是:SpringConfig、MyBatisConfig、JdbcConfig、ServletConfig、SpringMvcConfig。以及resources目錄下的db.properities。

SpringConfig

? ? 該配置類的作用是:作為Spring配置文件,掃描指定的包,并且導入加載其他需要的配置文件:

@Configuration
@ComponentScan({"com.cc.service"})
@PropertySource(("db.properties"))  //加載外部屬性文件
@Import({JdbcConfig.class, MyBatisConfig.class})  //導入其他配置類
public class SpringConfig {
}
MyBatisConfig

MyBatis的XML方式:

@Configuration
public class MyBatisXmlConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 關鍵配置:顯式指定XML映射文件位置factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 關鍵配置:要求接口與XML文件關聯(默認行為)msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}

?

注解配置方式:

@Configuration
public class MyBatisAnnotationConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 關鍵配置:啟用注解掃描模式msc.setAnnotationClass(Mapper.class);msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {//配置了一個MyBatis的SqlSessionFactory,指定了使用的數據源和類型別名包路徑。@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.cc.domain");return factoryBean;}//通過Spring配置了一個MapperScannerConfigurer,指定了需要掃描的Mapper接口所在的包路徑。//這樣,MyBatis就可以根據這些配置自動地找到并注冊Mapper接口@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");return msc;}
}

使用注解方式的關鍵代碼是setAnnotationClass(Mapper.class),但是只要在Mapper接口的方法上使用了@Select等注解,即時未配置也會隱式支持注解

JdbcConfig

配置數據源,并且交給spring容器管理。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class JdbcConfig {//注入值@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}
ServletConfig
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
SpringMvcConfig
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.cc.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

功能模塊

首先依據準備的表結構創建對應的POJO類:

public class User {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

接下來就是關于數據庫操作的Dao:

public interface UserDao {@Insert("insert into user(name,age) values(#{name},#{age})")public void save(User user);@Update("update user set name=#{name} where id = #{id}")public void update(User user);@Delete("delete from user where id =#{id}")public void delete(Integer id);@Select("select * from user where id =#{id}")public User getById(Integer id);@Select("select * from user")public List<User> getAll();
}

以及Dao對應的Service接口和實現類

public interface UserService {/*** 保存* @param user* @return*/public boolean save(User user);/*** 修改* @param user* @return*/public boolean update(User user);/**\* 根據id刪除* @param id* @return*/public boolean delete(Integer id);/*** 根據id查詢* @param id* @return*/public User getById(Integer id);/*** 查詢所有* @return*/public List<User> getAll();
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean save(User user) {userDao.save(user);return true;}@Overridepublic boolean update(User user) {userDao.update(user);return true;}@Overridepublic boolean delete(Integer id) {userDao.delete(id);return true;}@Overridepublic User getById(Integer id) {return userDao.getById(id);}@Overridepublic List<User> getAll() {return userDao.getAll();}
}

剩下就是REST風格的Controller控制類:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean update(@RequestBody User user) {return userService.update(user);}@DeleteMapping("/{id}")public boolean delete(@PathVariable Integer id) {return userService.delete(id);}@GetMapping("/{id}")public User getById(@PathVariable Integer id) {return userService.getById(id);}@GetMappingpublic List<User> getAll() {return userService.getAll();}
}

測試

? ?在開發中通常要進行兩種測試,分別是業務接口測試,第二個是表現層的接口測試。

業務層接口測試

在test目錄下新建測試包:

?

@RunWith(SpringJUnit4ClassRunner.class)  //使用Spring的測試運行器來運行測試。
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetById(){User user = userService.getById(2);System.out.println(user);}@Testpublic void testGetAll(){List<User> user = userService.getAll();System.out.println(user);}}

?

能夠查詢到數據,說明業務層沒問題,接下來測試控制層,啟動Tomcat:

控制層測試

在postman進行測試:

查詢所有:

???

?新增:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79643.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79643.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79643.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

P1042【深基8,例1】乒乓球

【題目背景】國際乒聯現在主席沙拉拉自從上任以來就立志于推行一系列改革&#xff0c;以推動乒乓球運動在全球的普及。其中 11 分制改革引起了很大的爭議&#xff0c;有一部分球員因為無法適應新規則只能選擇退役。華華就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…

ubuntu24.04上使用qemu和buildroot模擬vexpress-ca9開發板構建嵌入式arm linux環境

1 準備工作 1.1 安裝qemu 在ubuntu系統中使用以下命令安裝qemu。 sudo apt install qemu-system-arm 安裝完畢后&#xff0c;在終端輸入: qemu- 后按TAB鍵&#xff0c;彈出下列命令證明安裝成功。 1.2 安裝arm交叉編譯工具鏈 sudo apt install gcc-arm-linux-gnueabihf 安裝之…

用 R 語言打造交互式敘事地圖:講述黃河源區生態變化的故事

目錄 ?? 項目背景:黃河源頭的生態變遷 ?? 技術棧介紹 ??? 最終效果預覽 ?? 項目構建步驟 1?? 數據準備 2?? 構建 Leaflet 地圖 3?? 使用 scrollama 實現滾動觸發事件 4?? 使用 R Markdown / Quarto 打包發布 ?? 效果展示截圖 ?? 完整代碼倉庫 …

CTF--秋名山車神

一、原網頁&#xff1a; 二、步驟&#xff1a; 1.嘗試用計算器計算&#xff1a; 計算器溢出&#xff0c;無法正常計算 2.使用python計算&#xff1a; 得出計算結果為&#xff1a;1864710043732437134701060769 3.多次刷新頁面&#xff1a; 發現變量為value&#xff0c;要用pos…

CRC實戰寶典:從原理到代碼,全面攻克循環冗余校驗

CRC實戰寶典&#xff1a;從原理到代碼&#xff0c;全面攻克循環冗余校驗 github開源&#xff1a;CRC軟硬件協同測試項目 CRC 簡介 CRC&#xff08;循環冗余校驗&#xff09;是一種強大的錯誤檢測技術&#xff0c;廣泛應用于數字網絡和存儲系統。它是確保數據完整性的重要方法…

【大模型】DeepSeek + Coze 打造個人專屬AI智能體使用詳解

目錄 一、前言 二、AI智能體介紹 2.1 什么是AI智能體 2.2 AI智能體核心能力 2.3 AI智能應用場景 三、coze 介紹 3.1 coze是什么 3.1.1 平臺概述 3.1.2 平臺適用人群 3.2 平臺核心功能 3.3 coze可以做什么 3.4 為什么選擇coze 四、coze 搭建AI智能體操作實踐 4.1 搭…

MySQL入門:數據表的創建

?今天我們來介紹一下除HTML外的另一種語言&#xff1a;MySQL語言&#xff1b; MySQL&#xff1a;即一種用于管理和處理關系數據庫的標準語言。要用于執行查詢、更新、管理數據庫中的數據以及定義和操作數據庫結構。 接下來我會逐一介紹它的作用以及其中數據表&#xff0c;數據…

[圖論]生成樹 引言

生成樹 引言 生成樹&#xff1a;一個連通圖的生成樹是該圖的一個極小連通子圖。生成樹中含有圖中全部(設 V V V個)頂點及構成一棵樹的 V ? 1 V-1 V?1條邊&#xff0c;且生成樹中不應有環。最小生成樹(MST)&#xff1a;圖的所有生成樹中&#xff0c;邊權之和最小的生成樹。顯…

AI調試工具有哪些?

一、深度學習框架專用調試工具 TensorBoard ? 功能&#xff1a;實時監控訓練指標&#xff08;損失值、準確率&#xff09;、可視化神經網絡結構、分析參數分布和梯度信息 ? 適用框架&#xff1a;TensorFlow、PyTorch&#xff08;通過插件&#xff09; ? 特點&#xff1a;支持…

深入理解 MCP 協議:開啟 AI 交互新時代

深入理解 MCP 協議&#xff1a;開啟 AI 交互新時代&#x1f680; 在當今人工智能蓬勃發展的時代&#x1f310;&#xff0c;大型語言模型&#xff08;LLM&#xff09;已經在眾多領域展現出了強大的能力&#xff0c;令人驚嘆&#x1f44f;&#xff01;然而&#xff0c;傳統的 LLM…

微信、抖音、小紅書emoji符號大全

1、Emoji 日常符號 &#x1f463;&#x1f440;&#x1f441;?&#x1f444;&#x1f48b;&#x1f442;&#x1f9bb;&#x1f443;&#x1f445;&#x1f9e0;&#x1fac0;&#x1fac1;&#x1f9b7;&#x1f9b4;&#x1f4aa;&#x1f9be;&#x1f9bf;&#x1f9b5;&a…

【嵌入式】——Linux系統遠程操作和程序編譯

目錄 一、虛擬機配置網絡設置 二、使用PuTTY登錄新建的賬戶 1、在ubuntu下開啟ssh服務 2、使用PuTTY連接 三、樹莓派實現遠程登錄 四、樹莓派使用VNC viewer登錄 五、Linux使用talk聊天程序 1、使用linux自帶的talk命令 2、使用c語言編寫一個talk程序 一、虛擬機配置網絡…

春和景明-C語言簡單代碼

題目要求&#xff1a; 請在centOS Linux中編寫一個C語言程序實現如下功能&#xff1a; 同時創建100個用戶&#xff0c;用戶的賬戶名稱為&#xff1a;Student01 Student02 … Student100;設置每個用戶的初始密碼為&#xff1a;stud123456請用gcc編譯C的源代碼&#xff0c;生…

設計模式之工廠模式(factory pattern):在商品對象創建系統中的應用

目錄 一、設計思路 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 二、UML類圖&#xff08;PlantUML格式&#xff09; 1.簡單工廠模式 2.工廠方法模式 3.抽象工廠模式 三、實現過程與結果 1. 簡單工廠模式 2. 工廠方法模式 3. 抽象工廠模式 四、總結 在面向對…

Trae,字節跳動推出的 AI 編程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能編程助手&#xff08;前身為 MarsCode 編程助手&#xff09;&#xff0c;以插件形式集成在本地開發環境中&#xff0c;具備極高的兼容性和靈活性&#xff0c;旨在提升開發效率和代碼質量。它支持超過100種編程語言&#xff0c;兼容主流…

工作紀實_63-Mac電腦使用brew安裝軟件

最近在接觸kafka&#xff0c;想著在自己的電腦安裝一套環境&#xff0c;docker也能行&#xff0c;但是還是想裝一些原生的軟件試試看&#xff0c;因此便想著整理一下brew的命令&#xff0c;這命令確實是方便&#xff0c;不需要下載tar包亂八七糟的東西&#xff0c;一鍵安裝 bre…

Python語法系列博客 · 第8期[特殊字符] Lambda函數與高階函數:函數式編程初體驗

上一期小練習解答&#xff08;第7期回顧&#xff09; ? 練習1&#xff1a;找出1~100中能被3或5整除的數 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]? 練習2&#xff1a;生成字符串長度字典 words ["apple", "banana", "grape…

Redis--主從復制

目錄 一、配置 1.1 建立復制 1.2 斷開復制 1.3 安全性 1.4 只讀 1.5 傳輸延遲 二、拓撲 2.1 一主一從結構 2.2 一主多從結構 2.3 樹形主從結構 在分布式系統中為了解決單點問題&#xff0c;通常會把數據復制多個副本部署到其他服務器&#xff0c;滿足故障恢 復和負載均衡等需求…

已注冊商標如何防止被不使用撤銷!

近年來已注冊商標被撤銷越來越多&#xff0c;不乏著名企業或機構&#xff0c;普推知產商標老楊看到前一陣看到央視和百度等申請的商標也被申請撤銷&#xff0c;連續三年不使用撤銷也是正常的商標流程。 已注冊商標被撤銷普推老楊看到案例主要是集中在一些早期申請注冊的好記的商…

解密大模型背后的秘密:訓練、優化與挑戰

解密大模型背后的秘密&#xff1a;訓練、優化與挑戰 在當今的人工智能領域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已經成為了一個不可忽視的存在。從自然語言處理到圖像生成&#xff0c;再到推薦系統&#xff0c;大模型以其強大的泛化能力和創…