个人作品集网站模板,网站设计公司哪家好,图书馆网站建设情况,dedecms购物网站Spring Boot 集成 MyBatis 全面讲解
MyBatis 是一款优秀的持久层框架#xff0c;与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis#xff0c;包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介
1. SqlSession …
Spring Boot 集成 MyBatis 全面讲解
MyBatis 是一款优秀的持久层框架与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介
1. SqlSession
SqlSession 是 MyBatis 的核心接口负责执行 SQL 语句、获取映射器实例以及管理事务。
1.1 SqlSession 的创建
SqlSession 通常通过 SqlSessionFactory 获取。以下是创建 SqlSessionFactory 的典型代码
InputStream inputStream Resources.getResourceAsStream(mybatis-config.xml);
SqlSessionFactory sqlSessionFactory new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session sqlSessionFactory.openSession()) {// 使用 session 进行数据库操作
}注意在 Spring 集成中SqlSessionFactory 和 SqlSession 的创建由框架管理我们只需要通过依赖注入获取即可。 1.2 SqlSession 的常用方法
SqlSession 提供了多种方法用于执行数据库操作 查询操作 // 单条记录查询
User user session.selectOne(namespace.statementId, parameter);// 多条记录查询
ListUser users session.selectList(namespace.statementId, parameter);插入操作 int rows session.insert(namespace.statementId, parameter);更新操作 int rows session.update(namespace.statementId, parameter);删除操作 int rows session.delete(namespace.statementId, parameter);事务控制 session.commit(); // 提交事务
session.rollback(); // 回滚事务2. Mapper 映射器
Mapper 映射器是 MyBatis 的核心功能用于实现 SQL 和 Java 方法之间的映射。它可以通过注解或 XML 配置。
2.1 基于注解的 Mapper
注解方式直接将 SQL 写在 Mapper 接口中简单高效适合简单场景。
示例代码
Mapper
public interface UserMapper {Select(SELECT * FROM user WHERE id #{id})User selectById(Long id);Insert(INSERT INTO user (username, email) VALUES (#{username}, #{email}))int insertUser(User user);Update(UPDATE user SET email #{email} WHERE id #{id})int updateUser(User user);Delete(DELETE FROM user WHERE id #{id})int deleteUser(Long id);
}2.2 基于 XML 的 Mapper
XML 配置更加灵活适合复杂查询场景。Mapper XML 文件通常位于 resources/mapper 目录。
Mapper XML 文件示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.mapper.UserMapper!-- 查询 --select idselectById parameterTypelong resultTypecom.example.entity.UserSELECT * FROM user WHERE id #{id}/select!-- 插入 --insert idinsertUser parameterTypecom.example.entity.UserINSERT INTO user (username, email)VALUES (#{username}, #{email})/insert!-- 更新 --update idupdateUser parameterTypecom.example.entity.UserUPDATE user SET email #{email} WHERE id #{id}/update!-- 删除 --delete iddeleteUser parameterTypelongDELETE FROM user WHERE id #{id}/delete
/mapper2.3 Mapper 映射器的工作机制
Mapper 接口的方法名和参数需要与 XML 中的 id 和 parameterType 对应。MyBatis 会通过动态代理为 Mapper 接口生成实现类并调用对应的 SQL。 3. 配置文件
MyBatis 的配置文件包括全局配置文件mybatis-config.xml和映射文件mapper.xml。 3.1 全局配置文件
mybatis-config.xml 定义了数据库连接、日志设置、别名等全局配置。
典型配置示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configuration PUBLIC -//mybatis.org//DTD Config 3.0//EN http://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 环境配置 --environments defaultdevelopmentenvironment iddevelopmenttransactionManager typeJDBC/dataSource typePOOLEDproperty namedriver valuecom.mysql.cj.jdbc.Driver/property nameurl valuejdbc:mysql://localhost:3306/mybatis_demo/property nameusername valueroot/property namepassword valueroot//dataSource/environment/environments!-- 别名配置 --typeAliasestypeAlias typecom.example.entity.User aliasUser//typeAliases!-- Mapper 映射文件 --mappersmapper resourcemapper/UserMapper.xml//mappers
/configuration3.2 映射文件配置
映射文件定义了具体的 SQL 和 Java 对象之间的关系。以 UserMapper.xml 为例
mapper namespacecom.example.mapper.UserMapperselect idselectAll resultTypeUserSELECT * FROM user/selectresultMap idUserResultMap typeUserid columnid propertyid/result columnusername propertyusername/result columnemail propertyemail//resultMap
/mapper4. ResultMap
ResultMap 是 MyBatis 的强大特性之一用于处理复杂查询结果与 Java 对象的映射关系。 4.1 什么是 ResultMap
ResultMap 用于自定义数据库字段与 Java 对象属性的映射。它支持嵌套映射、别名和字段处理适合复杂的对象映射场景。 4.2 ResultMap 配置示例
以下是一个带嵌套对象的 ResultMap 配置
数据库表
CREATE TABLE user (id BIGINT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100)
);CREATE TABLE address (id BIGINT PRIMARY KEY,user_id BIGINT,city VARCHAR(50),FOREIGN KEY (user_id) REFERENCES user(id)
);Java 对象
Data
public class User {private Long id;private String username;private String email;private Address address;
}Data
public class Address {private Long id;private String city;
}ResultMap 配置
resultMap idUserWithAddress typeUserid columnid propertyid/result columnusername propertyusername/result columnemail propertyemail/association propertyaddress javaTypeAddressid columnaddress_id propertyid/result columncity propertycity//association
/resultMap查询语句
select idgetUserWithAddress resultMapUserWithAddressSELECT u.id, u.username, u.email, a.id AS address_id, a.cityFROM user uLEFT JOIN address a ON u.id a.user_idWHERE u.id #{id}
/select4.3 嵌套集合映射
对于一对多的嵌套关系可以使用 collection
resultMap idUserWithPosts typeUserid columnid propertyid/result columnusername propertyusername/collection propertyposts ofTypePostid columnpost_id propertyid/result columntitle propertytitle//collection
/resultMap总结
SqlSession、Mapper、配置文件 和 ResultMap 是 MyBatis 的核心概念。通过灵活的配置和映射MyBatis 可以高效地处理各种复杂的数据库操作需求。熟练掌握这些特性可以让开发者在项目中更高效地处理数据访问逻辑。 三、Spring Boot 集成 MyBatis
MyBatis 是一种轻量级的持久层框架与 Spring Boot 集成后可以极大地提升开发效率。以下是集成的完整步骤包括项目配置、数据库设计和基本操作。 1. 创建 Spring Boot 项目
在创建项目时可以使用 Spring Initializr 快速生成骨架项目。以下依赖是集成 MyBatis 所必需的
Spring Web用于创建 REST API。MyBatis FrameworkMyBatis 的核心依赖。MySQL Driver连接 MySQL 数据库。Lombok简化实体类的开发减少样板代码。 2. 配置 pom.xml
以下是需要在 pom.xml 中添加的 Maven 依赖
dependencies!-- Spring Boot Starter --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactId/dependency!-- MyBatis Starter --dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion3.0.0/version/dependency!-- MySQL Driver --dependencygroupIdmysql/groupIdartifactIdmysql-connector-j/artifactId/dependency!-- Lombok --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency
/dependencies这些依赖包括 Spring Boot 核心、MyBatis 框架、MySQL 数据库驱动和 Lombok。版本号可以根据项目需求进行调整。 3. 配置数据库连接
在 src/main/resources 目录下创建 application.yml 文件用于配置项目的数据库连接。
application.yml 示例
spring:datasource:url: jdbc:mysql://localhost:3306/mybatis_demo?useSSLfalseserverTimezoneUTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Drivermybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.example.demo.entity说明 url数据库连接地址。username 和 password数据库的用户名和密码。mapper-locations指定 MyBatis 的 XML 映射文件路径。type-aliases-package指定实体类所在的包用于启用简化的类名映射。 4. 创建数据库表
使用以下 SQL 语句创建一个简单的用户表
SQL 示例
CREATE DATABASE IF NOT EXISTS mybatis_demo;USE mybatis_demo;CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) NOT NULL,password VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);此 SQL 创建了一个名为 user 的表用于存储用户信息。字段包括用户 ID、用户名、密码、电子邮件以及创建时间。 5. 编写实体类
创建与数据库表对应的 Java 实体类。
User.java
package com.example.demo.entity;import lombok.Data;
import java.time.LocalDateTime;Data
public class User {private Long id;private String username;private String password;private String email;private LocalDateTime createdAt;
}说明 使用了 Lombok 的 Data 注解自动生成 getter、setter、toString 等方法。字段名称与数据库表的列名保持一致便于自动映射。 6. 创建 Mapper 接口
MyBatis 的 Mapper 接口用于定义数据库操作。可以选择使用注解方式或者 XML 配置方式编写 SQL。
注解方式 Mapper
以下是一个基于注解的 Mapper 接口示例
package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;Mapper
public interface UserMapper {Insert(INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email}))int insertUser(User user);Select(SELECT * FROM user WHERE id #{id})User selectById(Long id);Select(SELECT * FROM user)ListUser selectAllUsers();Update(UPDATE user SET username #{username}, password #{password}, email #{email} WHERE id #{id})int updateUser(User user);Delete(DELETE FROM user WHERE id #{id})int deleteUser(Long id);
}XML 配置方式 Mapper
XML 配置方式更灵活适合复杂查询场景。以下是对应的 XML 映射文件。
文件位置src/main/resources/mapper/UserMapper.xml
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.example.demo.mapper.UserMapperinsert idinsertUser parameterTypecom.example.demo.entity.UserINSERT INTO user (username, password, email)VALUES (#{username}, #{password}, #{email})/insertselect idselectById parameterTypelong resultTypecom.example.demo.entity.UserSELECT * FROM user WHERE id #{id}/selectselect idselectAllUsers resultTypecom.example.demo.entity.UserSELECT * FROM user/selectupdate idupdateUser parameterTypecom.example.demo.entity.UserUPDATE user SET username #{username}, password #{password}, email #{email} WHERE id #{id}/updatedelete iddeleteUser parameterTypelongDELETE FROM user WHERE id #{id}/delete/mapper在 Spring Boot 中MyBatis 会自动扫描 mapper 文件夹下的 XML 文件。 7. 创建 Service 层
为了更好地分离业务逻辑建议将 Mapper 操作封装到 Service 层中。
UserService.java
package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;import java.util.List;Service
public class UserService {private final UserMapper userMapper;public UserService(UserMapper userMapper) {this.userMapper userMapper;}public int createUser(User user) {return userMapper.insertUser(user);}public User getUserById(Long id) {return userMapper.selectById(id);}public ListUser getAllUsers() {return userMapper.selectAllUsers();}public int updateUser(User user) {return userMapper.updateUser(user);}public int deleteUser(Long id) {return userMapper.deleteUser(id);}
}8. 创建 Controller 层
最后为了提供对外接口创建 Controller。
UserController.java
package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;import java.util.List;RestController
RequestMapping(/api/users)
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService userService;}PostMappingpublic String createUser(RequestBody User user) {userService.createUser(user);return User created successfully!;}GetMapping(/{id})public User getUserById(PathVariable Long id) {return userService.getUserById(id);}GetMappingpublic ListUser getAllUsers() {return userService.getAllUsers();}PutMappingpublic String updateUser(RequestBody User user) {userService.updateUser(user);return User updated successfully!;}DeleteMapping(/{id})public String deleteUser(PathVariable Long id) {userService.deleteUser(id);return User deleted successfully!;}
}9. 启动应用
创建项目主类 MyBatisDemoApplication.java
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;SpringBootApplication
public class MyBatisDemoApplication {public static void main(String[] args) {SpringApplication.run(MyBatisDemoApplication.class, args);}
}启动项目使用工具如 Postman 或 CURL测试接口。 四、MyBatis 基础操作详解
以下将详细讲解 MyBatis 的基础操作包括如何创建实体类、Mapper 接口、XML 映射文件以及如何通过 Service 和 Controller 层完成基础的增删改查功能。 1. 创建实体类
实体类用于表示数据库中的表记录在 MyBatis 中实体类字段与数据库表的列进行一一对应。
示例代码User.java
package com.example.demo.entity;import lombok.Data;
import java.time.LocalDateTime;Data
public class User {private Long id; // 用户IDprivate String username; // 用户名private String password; // 密码private String email; // 邮箱private LocalDateTime createdAt; // 创建时间
}说明 使用 Data 注解自动生成 getter、setter、toString 等方法。字段名称与数据库表的列名保持一致便于 MyBatis 自动映射。 2. 创建 Mapper 接口
Mapper 接口定义了对数据库表的操作。MyBatis 支持两种方式基于注解和基于 XML 映射文件。
基于注解的 Mapper 接口
以下是使用注解定义的基础增删改查操作
package com.example.demo.mapper;import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;import java.util.List;Mapper
public interface UserMapper {// 插入用户Insert(INSERT INTO user (username, password, email) VALUES (#{username}, #{password}, #{email}))int insertUser(User user);// 查询所有用户Select(SELECT * FROM user)ListUser getAllUsers();// 根据 ID 查询用户Select(SELECT * FROM user WHERE id #{id})User getUserById(Long id);// 更新用户Update(UPDATE user SET username #{username}, password #{password}, email #{email} WHERE id #{id})int updateUser(User user);// 删除用户Delete(DELETE FROM user WHERE id #{id})int deleteUser(Long id);
}注意 使用 Mapper 注解让 Spring 容器自动扫描 Mapper 接口。注解方式适合简单的 SQL 语句对于复杂查询建议使用 XML。 3. 配置 XML 映射文件
在复杂查询场景中XML 配置文件更加灵活。
文件位置
src/main/resources/mapper/UserMapper.xmlUserMapper.xml 示例
?xml version1.0 encodingUTF-8 ?
!DOCTYPE mapperPUBLIC -//mybatis.org//DTD Mapper 3.0//ENhttp://mybatis.org/dtd/mybatis-3-mapper.dtdmapper namespacecom.example.demo.mapper.UserMapper!-- 定义字段与属性的映射 --resultMap idUserResultMap typecom.example.demo.entity.Userid columnid propertyid /result columnusername propertyusername /result columnpassword propertypassword /result columnemail propertyemail /result columncreated_at propertycreatedAt //resultMap!-- 查询所有用户 --select idgetAllUsers resultMapUserResultMapSELECT * FROM user/select!-- 插入用户 --insert idinsertUser parameterTypecom.example.demo.entity.UserINSERT INTO user (username, password, email)VALUES (#{username}, #{password}, #{email})/insert!-- 更新用户 --update idupdateUser parameterTypecom.example.demo.entity.UserUPDATE userSET username #{username}, password #{password}, email #{email}WHERE id #{id}/update!-- 删除用户 --delete iddeleteUser parameterTypelongDELETE FROM user WHERE id #{id}/delete/mapper注意 namespace 必须与 Mapper 接口的全路径名称一致。resultMap 定义了表字段与实体类属性之间的映射关系。#{} 用于参数占位MyBatis 会根据参数类型自动替换。 4. 创建 Service 层
为了实现业务逻辑与数据访问的分离建议通过 Service 层封装 Mapper 的操作。
示例代码UserService.java
package com.example.demo.service;import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;import java.util.List;Service
public class UserService {private final UserMapper userMapper;public UserService(UserMapper userMapper) {this.userMapper userMapper;}// 添加用户public int addUser(User user) {return userMapper.insertUser(user);}// 获取所有用户public ListUser getAllUsers() {return userMapper.getAllUsers();}// 根据 ID 查询用户public User getUserById(Long id) {return userMapper.getUserById(id);}// 更新用户public int updateUser(User user) {return userMapper.updateUser(user);}// 删除用户public int deleteUser(Long id) {return userMapper.deleteUser(id);}
}说明 通过依赖注入的方式引入 UserMapper。将所有的数据库操作封装为独立的方法便于管理和复用。 5. 创建 Controller 层
Controller 层提供 RESTful API 接口供外部访问 Service 方法。
示例代码UserController.java
package com.example.demo.controller;import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.web.bind.annotation.*;import java.util.List;RestController
RequestMapping(/api/users)
public class UserController {private final UserService userService;public UserController(UserService userService) {this.userService userService;}// 创建用户PostMappingpublic String createUser(RequestBody User user) {userService.addUser(user);return User created successfully!;}// 获取所有用户GetMappingpublic ListUser getAllUsers() {return userService.getAllUsers();}// 根据 ID 获取用户GetMapping(/{id})public User getUserById(PathVariable Long id) {return userService.getUserById(id);}// 更新用户PutMappingpublic String updateUser(RequestBody User user) {userService.updateUser(user);return User updated successfully!;}// 删除用户DeleteMapping(/{id})public String deleteUser(PathVariable Long id) {userService.deleteUser(id);return User deleted successfully!;}
}说明 使用 RestController 标注类返回 JSON 数据。通过 RequestBody 接收前端传递的 JSON 数据。通过 PathVariable 获取 URL 中的动态参数。 五、高级功能
1. 动态 SQL
动态 SQL 是 MyBatis 的强大功能之一可以根据输入条件动态生成 SQL 语句。相比手动拼接 SQL这种方式更加安全、高效且可维护。
1.1 动态 SQL 标签
MyBatis 提供了以下动态 SQL 标签
if用于条件判断。choose类似于 Java 的 switch-case。where自动添加 WHERE 关键字并处理多个条件。set动态生成 SET 子句常用于更新语句。foreach用于迭代生成 SQL如 IN 子句或批量插入。trim自定义 SQL 前后缀如添加括号、处理多余逗号等。 1.2 动态 SQL 示例
1条件查询根据用户输入动态生成查询条件
XML 配置文件
select idsearchUsers resultMapUserResultMapSELECT * FROM userwhereif testusername ! nullAND username #{username}/ifif testemail ! nullAND email #{email}/if/where
/select注意where 标签会自动处理条件的拼接并在至少有一个条件成立时自动添加 WHERE 关键字。 Java 调用代码
MapString, Object params new HashMap();
params.put(username, John);
params.put(email, null);ListUser users userMapper.searchUsers(params);2动态更新根据非空字段更新用户信息
在实际场景中往往需要对部分字段进行更新MyBatis 的动态 SQL 可以轻松实现。
XML 配置文件
update idupdateUser parameterTypeUserUPDATE usersetif testusername ! nullusername #{username},/ifif testpassword ! nullpassword #{password},/ifif testemail ! nullemail #{email},/if/setWHERE id #{id}
/update注意 set 标签会自动处理逗号确保生成的 SQL 语句语法正确。null 值的字段会被忽略避免误更新。 Java 调用代码
User user new User();
user.setId(1L);
user.setUsername(NewName);int rows userMapper.updateUser(user);3批量查询使用 foreach 生成 IN 子句
XML 配置文件
select idfindUsersByIds resultMapUserResultMapSELECT * FROM userWHERE id INforeach collectionidList itemid open( separator, close)#{id}/foreach
/select说明 collection 指定输入参数一般为 List 或数组。item 是每次迭代的变量。open、separator 和 close 分别定义 SQL 子句的开头、分隔符和结尾。 Java 调用代码
ListLong idList Arrays.asList(1L, 2L, 3L);
ListUser users userMapper.findUsersByIds(idList);生成的 SQL
SELECT * FROM user WHERE id IN (1, 2, 3);2. 分页查询
分页查询是 Web 应用中最常见的功能之一。在 MyBatis 中可以借助 PageHelper 插件实现高效分页。 2.1 使用 PageHelper 插件
1引入依赖
在 pom.xml 中添加以下依赖
dependencygroupIdcom.github.pagehelper/groupIdartifactIdpagehelper-spring-boot-starter/artifactIdversion1.4.0/version
/dependency2分页查询示例
在 Service 层调用分页方法
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;public ListUser getUsersByPage(int pageNum, int pageSize) {// 启用分页PageHelper.startPage(pageNum, pageSize);ListUser users userMapper.getAllUsers();// 封装分页结果return new PageInfo(users).getList();
}3自定义分页
如果不想引入插件也可以通过手动拼接分页 SQL
XML 配置文件
select idgetUsersByPage resultMapUserResultMapSELECT * FROM userLIMIT #{offset}, #{pageSize}
/selectMapper 接口
ListUser getUsersByPage(Param(offset) int offset, Param(pageSize) int pageSize);Java 调用代码
int offset (pageNum - 1) * pageSize;
ListUser users userMapper.getUsersByPage(offset, pageSize);3. 复杂对象映射
3.1 一对多映射
场景一个用户有多个订单。
数据库表设计
CREATE TABLE orders (id BIGINT PRIMARY KEY,user_id BIGINT,order_name VARCHAR(255),FOREIGN KEY (user_id) REFERENCES user(id)
);XML 配置文件
resultMap idUserWithOrders typeUserid columnid propertyid/result columnusername propertyusername/collection propertyorders ofTypeOrderid columnorder_id propertyid/result columnorder_name propertyorderName//collection
/resultMapselect idgetUserWithOrders resultMapUserWithOrdersSELECT u.id, u.username, o.id AS order_id, o.order_nameFROM user uLEFT JOIN orders o ON u.id o.user_idWHERE u.id #{id}
/select3.2 嵌套查询
对于复杂的多表查询可以使用嵌套查询实现。
XML 配置
resultMap idOrderResultMap typeOrderid columnid propertyid/result columnorder_name propertyorderName/
/resultMapresultMap idUserWithOrders typeUserid columnid propertyid/result columnusername propertyusername/collection propertyorders resultMapOrderResultMap columnid/
/resultMapselect idgetUserWithOrders resultMapUserWithOrdersSELECT * FROM user WHERE id #{id};
/select六、最佳实践
1. 分层设计
Controller 层负责接收请求和返回响应。Service 层封装业务逻辑。Mapper 层专注于数据库交互。
2. 避免 N1 查询
一对多、多对多场景中优先使用联合查询或嵌套查询避免多个 SQL 执行。
3. 启用日志
在 application.yml 中启用 MyBatis 日志
mybatis:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl4. 动态 SQL
使用 foreach 实现批量操作。使用 if 结合 set 实现动态更新。 总结
MyBatis 的高级功能如动态 SQL、分页查询和复杂对象映射为开发者提供了极大的灵活性。在项目中结合实际场景选择合适的实现方式可以显著提高开发效率并降低维护成本。如果有任何疑问欢迎在评论区留言讨论