Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码

以下是Spring和Spring Boot集成MyBatis的完整对比示例,包含从项目创建到测试的全流程代码:
在这里插入图片描述


一、Spring集成MyBatis示例

1. 项目结构
spring-mybatis-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example/
│   │   │       ├── config/
│   │   │       ├── mapper/
│   │   │       ├── service/
│   │   │       └── web/
│   │   └── resources/
│   │       ├── mybatis-config.xml
│   │       ├── applicationContext.xml
│   │       └── mapper/
│   │           └── UserMapper.xml
│   └── test/
│       └── java/
│           └── com.example/
│               └── UserTest.java
├── pom.xml
└── schema.sql
2. Maven依赖(pom.xml)
<!-- Spring核心 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version>
</dependency>
<!-- MyBatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version>
</dependency>
<!-- MyBatis-Spring整合 -->
<dependency><groupId>org.mybatis.spring</groupId><artifactId>mybatis-spring</artifactId><version>2.0.6</version>
</dependency>
<!-- 数据库驱动 -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.30</version>
</dependency>
<!-- 测试 -->
<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>
3. 数据库表(schema.sql)
CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255) NOT NULL,email VARCHAR(255) UNIQUE NOT NULL
);
4. MyBatis全局配置(mybatis-config.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="cacheEnabled" value="true"/></settings>
</configuration>
5. Spring配置(applicationContext.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 数据源 --><bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/><property name="username" value="root"/><property name="password" value="root"/></bean><!-- MyBatis工厂 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><!-- 扫描Mapper接口 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mapper"/></bean></beans>
6. Mapper接口(UserMapper.java)
package com.example.mapper;import com.example.entity.User;public interface UserMapper {User selectById(Long id); // 对应XML中的SQL
}
7. Mapper XML(UserMapper.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.example.mapper.UserMapper"><select id="selectById" resultType="com.example.entity.User">SELECT * FROM user WHERE id = #{id}</select>
</mapper>
8. Service层(UserService.java)
package com.example.service;import org.springframework.beans.factory.annotation.Autowired;
import com.example.mapper.UserMapper;
import com.example.entity.User;public class UserService {@Autowiredprivate UserMapper userMapper;public User getUser(Long id) {return userMapper.selectById(id);}
}
9. 测试类(UserTest.java)
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class UserTest {@Testpublic void testGetUser() {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");UserService userService = context.getBean(UserService.class);User user = userService.getUser(1L);System.out.println(user.getName());}
}

二、Spring Boot集成MyBatis示例

1. 项目结构
springboot-mybatis-demo/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com.example/
│   │   │       ├── config/
│   │   │       ├── mapper/
│   │   │       ├── service/
│   │   │       └── Application.java
│   │   └── resources/
│   │       ├── application.properties
│   │       └── mapper/
│   │           └── UserMapper.xml
│   └── test/
│       └── java/
│           └── com.example/
│               └── UserTest.java
├── pom.xml
└── schema.sql
2. Maven依赖(pom.xml)
<dependencies><!-- Spring Boot Starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><!-- MyBatis Starter --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.0</version></dependency><!-- 数据库驱动 --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.30</version></dependency><!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>
3. 数据库表(schema.sql)
// 与Spring示例相同
4. 配置文件(application.properties)
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Drivermybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.entity
5. 启动类(Application.java)
package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication // 自动扫描组件
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
6. Mapper接口(UserMapper.java)
package com.example.mapper;import org.apache.ibatis.annotations.Mapper; // 非必需,但显式标注
import com.example.entity.User;@Mapper
public interface UserMapper {User selectById(Long id);
}
7. Mapper XML(UserMapper.xml)
// 与Spring示例相同
8. Service层(UserService.java)
package com.example.service;import org.springframework.beans.factory.annotation.Autowired;
import com.example.mapper.UserMapper;
import com.example.entity.User;@Service // Spring Boot自动扫描组件
public class UserService {@Autowiredprivate UserMapper userMapper;public User getUser(Long id) {return userMapper.selectById(id);}
}
9. 测试类(UserTest.java)
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
public class UserTest {@Autowiredprivate UserService userService;@Testpublic void testGetUser() {User user = userService.getUser(1L);System.out.println(user.getName());}
}

三、核心差异对比表

特性Spring集成Spring Boot集成
依赖管理需显式声明所有依赖(如MyBatis、Spring模块)通过starter自动引入依赖,减少配置
配置方式XML/Java Config手动配置Bean属性文件(application.properties)+ 注解
数据源配置手动定义dataSource Bean通过spring.datasource前缀自动配置
Mapper扫描MapperScannerConfigurer配置通过@Mapper注解或mybatis.mapper-locations
启动方式ClassPathXmlApplicationContext加载配置单一入口类加@SpringBootApplication注解
测试框架需JUnit4和Spring Test支持Spring Boot Test简化测试配置
环境兼容性兼容传统Spring应用服务器(如Tomcat)内置嵌入式Tomcat,直接运行JAR
代码量配置复杂,需定义多个Bean配置简洁,依赖约定优于配置原则
扩展性手动控制所有配置细节通过@EnableAutoConfiguration禁用自动配置

四、关键差异总结

  1. 依赖简化:Spring Boot通过starter自动管理依赖版本,避免冲突。
  2. 配置自动化:Spring Boot的application.properties替代了大量XML配置,如数据源和Mapper扫描。
  3. 启动便捷性:Spring Boot通过@SpringBootApplication简化了应用启动流程。
  4. 测试效率:Spring Boot的测试框架(如@SpringBootTest)减少了测试代码的复杂性。
  5. 开发模式:Spring Boot遵循“约定优于配置”,适合快速开发;Spring保留了对复杂场景的完全控制能力。

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

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

相关文章

【数据可视化-24】巧克力销售数据的多维度可视化分析

🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN人工智能领域的优质创作者,提供AI相关的技术咨询、项目开发和个…

c语言-分支结构

以下是我初学C语言的笔记记录&#xff0c;欢迎留言补充 一&#xff0c;分支结构分为几个 两个&#xff0c;一个是if语句&#xff0c;一个是Switch语句 二&#xff0c;if语句 &#xff08;1&#xff09;结构体 int main() {if()//判断条件{//表达式}else if()//判断条件{//表达式…

数据库MySQL学习——day4(更多查询操作与更新数据)

文章目录 1、聚合函数&#xff08;Aggregate Functions&#xff09;2、分组查询&#xff08;GROUP BY&#xff09;3、更新数据&#xff08;UPDATE&#xff09;4、删除数据&#xff08;DELETE&#xff09;5、进阶练习示例6、 今日小结 1、聚合函数&#xff08;Aggregate Functio…

Spark-SQL 项目

一、项目概述 &#xff08;一&#xff09;实验目标 统计有效数据条数&#xff1a;筛选出uid、phone、addr三个字段均无空值的记录并计数。提取用户数量最多的前 20 个地址&#xff1a;按地址分组统计用户数&#xff0c;按降序排序后取前 20 名。 &#xff08;二&#xff09;…

Redis的ZSet对象底层原理——跳表

我们来聊聊「跳表&#xff08;Skip List&#xff09;」&#xff0c;这是一个既经典又优雅的数据结构&#xff0c;尤其在 Redis 中非常重要&#xff0c;比如 ZSet&#xff08;有序集合&#xff09;底层就用到了跳表。 &#x1f31f; 跳表&#xff08;Skip List&#xff09;简介 …

2025深圳中兴通讯安卓开发社招面经

2月27号 中兴通讯一面 30多分钟 自我介绍 聊项目 我的优缺点&#xff0c;跟同事相比&#xff0c;有什么突出的地方 Handler机制&#xff0c;如何判断是哪个消息比较耗时 设计模式&#xff1a;模板模式 线程的状态 线程的开启方式 线程池原理 活动的启动模式 Service和Activity…

【Castle-X机器人】二、智能导览模块安装与调试

持续更新。。。。。。。。。。。。。。。 【Castle-X机器人】智能导览模块安装与调试 二、智能导览模块安装与调试2.1 智能导览模块安装2.2 智能导览模块调试2.2.1 红外测温传感器测试2.2.2 2D摄像头测试 二、智能导览模块安装与调试 2.1 智能导览模块安装 使用相应工具将智能…

深入理解二叉树遍历:递归与栈的双重视角

二叉树的遍历前序遍历中序遍历后续遍历总结 二叉树的遍历 虽然用递归的方法遍历二叉树实现起来更简单&#xff0c;但是要想深入理解二叉树的遍历&#xff0c;我们还必须要掌握用栈遍历二叉树&#xff0c;递归其实就是利用了系统栈去遍历。特此记录一下如何用双重视角去看待二叉…

Qt Creator中自定义应用程序的可执行文件图标

要在Qt Creator中为你的应用程序设置自定义可执行文件图标&#xff0c;你需要按照以下步骤操作&#xff1a; Windows平台设置方法 准备图标文件&#xff1a; 创建一个.ico格式的图标文件&#xff08;推荐使用256x256像素&#xff0c;包含多种尺寸&#xff09; 可以使用在线工…

Windows11系统中GIT下载

Windows11系统中GIT下载 0、GIT背景介绍0.0 GIT概述0.1 GIT诞生背景0.2 Linus Torvalds 的设计目标0.3 Git 的诞生&#xff08;2005 年&#xff09;0.4 Git 的后续发展0.5 为什么 Git 能成功&#xff1f; 1、资源下载地址1.1 官网资源1.2 站内资源 2、安装指导3、验证是否下载完…

react的fiber 用法

在 React 里&#xff0c;Fiber 是 React 16.x 及后续版本采用的协调算法&#xff0c;它把渲染工作分割成多个小任务&#xff0c;让 React 可以在渲染过程中暂停、恢复和复用任务&#xff0c;以此提升渲染性能与响应能力。在实际开发中&#xff0c;你无需直接操作 Fiber 节点&am…

FPGA前瞻篇-数字电路基础-逻辑门电路设计

模拟信号&#xff1a; 一条随时间连续变化、平滑波动的曲线&#xff0c;比如正弦波。 数字信号&#xff1a; 一条只有高低两个状态&#xff08;0和1&#xff09;&#xff0c;跳变清晰的方波曲线。 在 IC 或 FPGA 的逻辑设计中&#xff0c;我们通常只能处理数字信号&#xff0…

RabbitMQ 基础概念(队列、交换机、路由键、绑定键、信道、连接、虚拟主机、多租户)介绍

本文是博主在梳理 RabbitMQ 知识的过程中&#xff0c;将所遇到和可能会遇到的基础知识记录下来&#xff0c;用作梳理 RabbitMQ 的整体架构和功能的线索文章&#xff0c;通过查找对应的知识能够快速的了解对应的知识而解决相应的问题。 文章目录 一、RabbitMQ 是什么&#xff1f…

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…

Java面试高频问题(29-30)

二十九、全链路压测&#xff1a;数据隔离与流量 关键技术点 1. 流量染色&#xff1a;通过Header注入X-Test-TraceId标识压测流量 2. 影子库表&#xff1a;通过ShardingSphere实现数据隔离 3. 熔断降级&#xff1a;压测流量触发异常时自动切换回生产数据源 数据隔离方案对比 …

Python常用的第三方模块之数据分析【pdfplumber库、Numpy库、Pandas库、Matplotlib库】

【pdfplumber库】从PDF文件中读取内容 import pdfplumber #打开PDF文件 with pdfplumber.open(DeepSeek从入门到精通(20250204).pdf) as pdf:for i in pdf.pages: #遍历页print(i.extract_text()) #extract_text()方法提取内容print(f----------------第{i.page_number}页结束…

长短板理论——AI与思维模型【83】

一、定义 长短板理论思维模型&#xff0c;也被称为木桶原理&#xff0c;是指一只木桶能盛多少水&#xff0c;并不取决于最长的那块木板&#xff0c;而是取决于最短的那块木板。该理论将木桶视为一个整体系统&#xff0c;各个木板代表着系统的不同组成部分或要素&#xff0c;强…

2025蓝桥省赛c++B组第二场题解

前言 这场的题目非常的简单啊&#xff0c;至于为什么有第二场&#xff0c;因为当时河北正在刮大风被迫停止了QwQ&#xff0c;个人感觉是历年来最简单的一场&#xff0c;如果有什么不足之处&#xff0c;还望补充。 试题 A: 密密摆放 【问题描述】 小蓝有一个大箱子&#xff0…

【数据结构与算法】从完全二叉树到堆再到优先队列

完全二叉树 CBT 设二叉树的深度为 h , 若非最底层的其他各层的节点数都达到最大个数 , 最底层 h 的所有节点都连续集中在左侧的二叉树叫做 完全二叉树 . 特点 对任意节点 , 其右分支下的叶子节点的最底层为 L , 则其左分支下的叶子节点的最低层一定是 L 或 L 1 .完全二叉树…

Leetcode:1. 两数之和

题目 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示…