当前位置: 首页 > news >正文

MyBatis基础到高级实践:全方位指南(上)

目录

一、引言:MyBatis 与 Spring 整合概述

1.1 MyBatis 与 Spring 整合的优势

1.2 整合方式概览

二、环境配置与基础整合

2.2 数据源配置

2.2.1 简单数据源配置

2.2.2 连接池数据源配置

2.3 SqlSessionFactory 配置

2.3.1 基础配置

2.3.2 MyBatis 全局配置

2.4 Mapper 接口扫描与注册

2.4.1 使用 MapperFactoryBean

2.4.2 使用 MapperScannerConfigurer

2.4.3 使用 @MapperScan 注解

2.5 简单整合示例


一、引言:MyBatis 与 Spring 整合概述

在当今的 Java 企业级开发中,数据持久化是一个核心需求。随着 Java 生态系统的不断发展,出现了多种 ORM 框架,如 Hibernate、MyBatis、JPA 等。其中,MyBatis 因其灵活性、高性能和易用性,在企业级应用中占据了重要地位。而 Spring 框架则凭借其强大的依赖注入、事务管理和 AOP 等功能,成为了 Java 企业级开发的首选框架。

将 MyBatis 与 Spring 整合,可以充分发挥两者的优势,构建高效、可维护的数据访问层。MyBatis 提供了灵活的 SQL 映射和动态 SQL 功能,使开发者能够精细控制数据库操作;而 Spring 则提供了依赖注入、事务管理和统一的异常处理机制,简化了企业级应用的开发。

本文将全面介绍 MyBatis 与 Spring 的整合方法,从基础配置到高级特性,再到性能优化和常见问题解决,帮助中级开发者深入理解并掌握这一关键技术。通过本文的学习,读者将能够在 Spring 项目中高效地使用 MyBatis,构建健壮的数据访问层,为后续学习 Spring 框架打下坚实基础。

由于篇幅较长,本次内容将分为上,中,下三个部分进行.

1.1 MyBatis 与 Spring 整合的优势

MyBatis 与 Spring 的整合具有以下显著优势:

  1. 简化开发流程:通过 Spring 的依赖注入机制,MyBatis 的SqlSessionFactorySqlSession等核心组件可以被自动管理,减少了大量样板代码。
  2. 统一事务管理:Spring 提供了一致的声明式和编程式事务管理机制,可以无缝管理 MyBatis 的数据库操作。
  3. 增强可维护性:将 MyBatis 的映射器接口和 SQL 语句与业务逻辑分离,提高了代码的可维护性和可扩展性。
  4. 提高性能:通过合理配置 MyBatis 的缓存机制和 Spring 的事务管理,可以显著提升数据库操作的性能。
  5. 增强灵活性:MyBatis 允许开发者直接编写 SQL 语句,保留了对数据库操作的完全控制,同时利用 Spring 的各种功能增强应用的灵活性。

1.2 整合方式概览

MyBatis 与 Spring 的整合主要有两种方式:

  1. 传统 XML 配置方式:通过 Spring 的 XML 配置文件定义 MyBatis 的核心组件,如SqlSessionFactoryMapper接口。
  2. 注解和 Java 配置方式:使用 Spring 的 Java 配置类和 MyBatis 的注解,实现零 XML 配置的整合,提高开发效率。

在实际开发中,推荐使用注解和 Java 配置方式,尤其是在 Spring Boot 项目中,这种方式更为简洁高效。

二、环境配置与基础整合

2.1 依赖配置

要在 Spring 项目中整合 MyBatis,首先需要添加必要的依赖。在 Maven 项目中,可以通过以下方式引入依赖:

<dependencies><!-- Spring核心依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.0</version></dependency><!-- MyBatis核心库 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.10</version></dependency><!-- MyBatis与Spring整合库 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>3.0.0</version></dependency>
<!-- 数据库驱动(以MySQL为例) --><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.33</version></dependency><!-- 可选:Lombok简化代码 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency>
</dependencies>

这里需要注意的是,mybatis-spring的版本必须与 Spring 和 MyBatis 的版本兼容。根据 MyBatis 官方文档,MyBatis-Spring 3.0 版本需要 Spring 6.0 + 和 MyBatis 3.5 + 的支持。

2.2 数据源配置

在整合 MyBatis 和 Spring 之前,需要先配置数据库数据源。Spring 支持多种数据源,包括传统的DriverManagerDataSource和连接池数据源如 HikariCP。

2.2.1 简单数据源配置

最简单的数据源配置可以使用DriverManagerDataSource

@Bean
public DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC");dataSource.setUsername("root");dataSource.setPassword("password");return dataSource;
}

这种配置方式适用于开发环境或简单应用,但在生产环境中建议使用连接池数据源。

2.2.2 连接池数据源配置

使用 HikariCP 连接池的配置示例:

@Bean
public DataSource dataSource() {HikariDataSource dataSource = new HikariDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC");dataSource.setUsername("root");dataSource.setPassword("password");// 连接池配置dataSource.setMaximumPoolSize(20);dataSource.setMinimumIdle(5);dataSource.setIdleTimeout(30000);dataSource.setConnectionTimeout(30000);return dataSource;
}

连接池配置对于性能和资源管理至关重要,应该根据应用的负载情况进行合理调整。

2.3 SqlSessionFactory 配置

SqlSessionFactory是 MyBatis 的核心组件,用于创建SqlSession。在 Spring 中,可以通过SqlSessionFactoryBean来配置和创建SqlSessionFactory

2.3.1 基础配置

最简单的SqlSessionFactory配置:

@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 可选:指定MyBatis全局配置文件factoryBean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));// 可选:指定Mapper XML文件位置factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/**/*.xml"));return factoryBean.getObject();
}

这里需要注意,SqlSessionFactory需要一个DataSource,并且可以通过setConfigLocation方法指定 MyBatis 的全局配置文件,通过setMapperLocations方法指定 Mapper XML 文件的位置。

2.3.2 MyBatis 全局配置

MyBatis 的全局配置文件(如mybatis-config.xml)可以配置 MyBatis 的各种行为,例如:

<?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="mapUnderscoreToCamelCase" value="true"/><!-- 开启延迟加载 --><setting name="lazyLoadingEnabled" value="true"/><!-- 禁用激进延迟加载 --><setting name="aggressiveLazyLoading" value="false"/><!-- 设置默认获取数量 --><setting name="defaultFetchSize" value="100"/><!-- 设置超时时间(秒) --><setting name="defaultStatementTimeout" value="30"/></settings><!-- 插件配置 --><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"><property name="helperDialect" value="mysql"/><property name="reasonable" value="true"/></plugin></plugins>
</configuration>

这些配置会影响 MyBatis 的行为,应该根据项目需求进行合理设置。

2.4 Mapper 接口扫描与注册

在 Spring 中,Mapper 接口可以通过以下几种方式注册到 Spring 容器中:

2.4.1 使用 MapperFactoryBean

MapperFactoryBean可以将单个 Mapper 接口注册为 Spring Bean:

@Bean
public UserMapper userMapper(SqlSessionFactory sqlSessionFactory) {MapperFactoryBean<UserMapper> factoryBean = new MapperFactoryBean<>(UserMapper.class);factoryBean.setSqlSessionFactory(sqlSessionFactory);return factoryBean.getObject();
}

这种方式适用于少量 Mapper 接口的情况,但如果有大量 Mapper 接口,逐一注册会很麻烦。

2.4.2 使用 MapperScannerConfigurer

MapperScannerConfigurer可以自动扫描指定包下的所有 Mapper 接口并注册为 Spring Bean:

@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();scannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");scannerConfigurer.setBasePackage("com.example.mapper");return scannerConfigurer;
}

这种方式更为便捷,只需要指定基础包路径,Spring 会自动扫描并注册所有 Mapper 接口

2.4.3 使用 @MapperScan 注解

在 Spring Boot 中,推荐使用@MapperScan注解来扫描 Mapper 接口:

@SpringBootApplication
@MapperScan("com.example.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

这种方式更为简洁,只需要在主类上添加@MapperScan注解,并指定 Mapper 接口的基础包路径即可(7)。

2.5 简单整合示例

以下是一个简单的 MyBatis 与 Spring 整合的完整示例:

1.定义实体类

@Data
public class User {private Long id;private String username;private String email;private LocalDateTime createTime;
}

2.定义 Mapper 接口

@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User selectById(Long id);@Insert("INSERT INTO user(username, email, create_time) VALUES(#{username}, #{email}, #{createTime})")@Options(useGeneratedKeys = true, keyProperty = "id")int insert(User user);@Update("UPDATE user SET username=#{username}, email=#{email} WHERE id=#{id}")int update(User user);@Delete("DELETE FROM user WHERE id=#{id}")int delete(Long id);@Select("SELECT * FROM user")List<User> selectAll();
}

3.定义 Service 层

@Service
public class UserService {private final UserMapper userMapper;@Autowiredpublic UserService(UserMapper userMapper) {this.userMapper = userMapper;}public User getUserById(Long id) {return userMapper.selectById(id);}public List<User> getAllUsers() {return userMapper.selectAll();}public int createUser(User user) {return userMapper.insert(user);}public int updateUser(User user) {return userMapper.update(user);}public int deleteUser(Long id) {return userMapper.delete(id);}
}

4.定义 Controller 层

@RestController
@RequestMapping("/users")
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {User user = userService.getUserById(id);return ResponseEntity.ok(user);}@GetMappingpublic ResponseEntity<List<User>> getAllUsers() {List<User> users = userService.getAllUsers();return ResponseEntity.ok(users);}@PostMappingpublic ResponseEntity<Void> createUser(@RequestBody User user) {userService.createUser(user);return ResponseEntity.status(HttpStatus.CREATED).build();}@PutMapping("/{id}")public ResponseEntity<Void> updateUser(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateUser(user);return ResponseEntity.ok().build();}@DeleteMapping("/{id}")public ResponseEntity<Void> deleteUser(@PathVariable Long id) {userService.deleteUser(id);return ResponseEntity.noContent().build();}
}

这个示例展示了 MyBatis 与 Spring 整合的基本用法,包括实体类、Mapper 接口、Service 层和 Controller 层的实现.


文章转载自:

http://M1FM8ro5.qkrzn.cn
http://kIvIpJRu.qkrzn.cn
http://EZaRQNOz.qkrzn.cn
http://xLkYsVdD.qkrzn.cn
http://7L9SELUX.qkrzn.cn
http://psxQhybs.qkrzn.cn
http://yb9kvZ5m.qkrzn.cn
http://Xu6QQMiI.qkrzn.cn
http://E7kLUXFP.qkrzn.cn
http://6ci1qkwl.qkrzn.cn
http://bOtWeP4A.qkrzn.cn
http://3gvB03jd.qkrzn.cn
http://A73E4AVq.qkrzn.cn
http://AtlfcImh.qkrzn.cn
http://d1FzUvM2.qkrzn.cn
http://Jmdw8rI2.qkrzn.cn
http://EGgQl9VO.qkrzn.cn
http://5sWU7qGw.qkrzn.cn
http://UYNkCE2J.qkrzn.cn
http://fStGeZIY.qkrzn.cn
http://q9DPGPD1.qkrzn.cn
http://7cdFy715.qkrzn.cn
http://XPiYq94Q.qkrzn.cn
http://UhcC3vLs.qkrzn.cn
http://hIWMSAS7.qkrzn.cn
http://2c89AlBl.qkrzn.cn
http://h3uMCuzT.qkrzn.cn
http://hHYLwUW5.qkrzn.cn
http://lWZxzXzI.qkrzn.cn
http://yrC3OZrN.qkrzn.cn
http://www.dtcms.com/a/376075.html

相关文章:

  • 开始 ComfyUI 的 AI 绘图之旅-RealESRGAN图生图之图像放大(四)
  • [HUBUCTF 2022 新生赛]help
  • Matlab机器人工具箱6.1 导入stl模型——用SerialLink描述
  • 大数据存储域——Kafka设计原理
  • B站 韩顺平 笔记 (Day 28)
  • Biomedical HPC+AI Platform:48款计算生物学工具集成的一站式高性能在线平台,赋能药物发现
  • Linux 基础 IO 核心知识总结:从系统调用到缓冲区机制(一)
  • 滴滴二面(准备二)
  • leetcode14(判断子序列)
  • 深度学习基本模块:Conv2D 二维卷积层
  • spring中case一直返回else中的值-问题和原理详解
  • 传输层:UDP/TCP协议
  • Java学习之——“IO流“的进阶流之序列化流的学习
  • LeetCode 面试经典 150 题:轮转数组(三次翻转法详解 + 多解法对比)
  • 什么是PFC控制器
  • 【卷积神经网络详解与实例3】——池化与反池化操作
  • Bean的生命周期 高频考点!
  • Redis 主从复制详解:原理、配置与主从切换实战
  • Java锁机制全解析:从AQS到CAS,深入理解synchronized与ReentrantLock
  • 基于SpringBoot的天气预报系统的设计与实现
  • Android 14 servicemanager的前世今生
  • TC_Motion多轴运动-电子齿轮
  • webrtc弱网-DelayBasedBwe 类源码分析与算法原理
  • 【Floor报错注入】
  • Docker生产部署
  • 小型语言模型:智能体AI的未来?
  • js垃圾回收机制
  • STM32开发(USART总线:UART总线)
  • Typescript - 通俗易懂的 interface 接口,创建接口 / 基础使用 / 可选属性 / 只读属性 / 任意属性(详细教程)
  • FastGPT源码解析 Agent 智能体应用创建流程和代码分析