大道至简 少字全意 易经的方式看 Mybatis 事务实例 核心组件及运行 实力例 及Mybatis-Plus 适用于 懂而久未用回忆 ,不懂而需明正理而用

目录

介绍

Mybatis 核心组件

Mybatis 运行原理

Mybaits 核心流程图

Mybatis-plus 核心组件

Mybatis-plus 运行原理

MyBatis-plus 开启事务 实例

一、基础配置(自动生效) 

二、事务示例代码

1.实体类与Mapper

2.service 层事务控制    重点 @Transactional

三、事务验证测试

四、关键说明

@Transactional 事务各种场景示例

一、基础声明式事务 场景:单方法内的事务控制

示例:在 Service 方法上添加@Transactional默认回滚RuntimeException

注意

二、嵌套事务与传播行为 场景:方法间事务嵌套(如主业务调用子业务)

示例:设置传播行为为Propagation.REQUIRES_NEW强制新建事务。

风险提示:

三、批量操作事务控制 场景: 批量插入/更新需原子性保证

示例:避免使用自带事务的saveBatch改用编程式事务

替代方案:

四、异常捕获与手动回滚 场景:需捕获异常但不影响事务回滚

示例:通过TransactionAspectSupport手动回滚

五、事务隔离级别设置 场景:高并发下控制数据可见性

五.一、示例:设置 READ_COMMITTED 隔离级别。

五.二、事务隔离级别配置方式 isolation 五种隔离级别

五.三、不同隔离级别解决的问题

四、关键注意事项

五、典型问题示例

六、事务失效场景及规避

总结

MyBatis 和Mbatis-Plus 区别

1.核心定位与功能扩展

2.开发效率

3.功能增加特性

4.sql维护与移植性

5.社区与生态

选择建议


介绍

mybatis 核心组件  运行原理。Mybatis-plus 升级了哪些区别 以及对比  上下文 没有强关联性 根据需要看即可 

Mybatis 核心组件

1.SalSessionFactoryBuilder
        负责根据配置文件代码构建 sqisessionFactory(工厂对象),采用建造者模式。
2.SalSessionFactory
        生产 sqlsesion 的核心工厂,线程安全且全局唯一。通常通过 XML 配置(如 mpatis config.xml)初始化,存储数据库连接映射关系等信息。
3.SqlSession
        核心会话对象,用于执行 SQL管理事务及获取 Mapper 接口。其底层通过 Executor、StatementHandler 等组件操作数据库,生命周期为请求或方法级
4.Mapper 接口
        定义数据库操作的 Java 接口,MvBatis 通过动态代理生成实现类(如 MapperProxy),将接口方法映射到 XML 或注解中的 SQL
5.Executor
执行 SQL的核心组件,分为三种类型:
        SimpleExecutor:默认执行器,逐条处理 SQL.
        ReuseExecutor: 重用预处理语句(PreparedStatement)
        BatchExecutor: 批量处理 SQL。

Mybatis 运行原理

1.初始化阶段
        加载配置:读取 mybatis-config.xml 和 Mapper 映射文件,解析为 configuration 对象
        构建 SqlSessionFactory:通过 sqlsessionFactoryBuilder 创建工厂实例存储全局配置映射信息 
2.SQL执行流程
        获取 SqlSession:从工厂创建会话,内部通过 Executor 执行 SQL
        动态代理 Mapper: 调用 Mapper 接口方法时,MyBatis 生成代理对象,将方法转换为对应的 SQL语句ID
        参数处理与 SQL 执行:
                1. ParameterHandler:处理 SQL 参数
                2. StatementHandler: 操作JDBC 的PreparedStatement 
                3.ResultSetHandler:封装查询结果到 Java 对象
3.事务与资源释放
        默认 手动提交事务 (需调用 commit() ),执行完毕后关闭 sqlSession 释放连接资源

Mybaits 核心流程图

配置文件 → SqlSessionFactoryBuilder → SqlSessionFactory  
                          ↓  
                  SqlSession → Executor → StatementHandler  
                                     ↓  
                                JDBC 执行 → 返回结果

关键点: MyBatis 通过动态代理将接口与 SQL 解耦,利用配置文件和核心组件实现灵活、高效的数据库操作

Mybatis-plus 核心组件

1.BaseMapper 接口
        提供基础 CRUD 操作(如selectByld、insert 等) ,开发者只需继承该接口即可直接使用,无需编写 XML 或 SQL
2.条件构造器(QueryWrapper/LambdaQueryWrapper)
        通过链式调用生成动态 SQL,支持字段防误写 (Lambda 表达式)和复杂查询条件(如 eq、like、in等) 
3. IService 与Servicelmpl
        封装通用业务层方法(如分页查询、批量操作),通过继承 Servicelmp 快速实现业务逻辑
4.代码生成器 (AutoGenerator
        根据数据库表自动生成 Entity、Mapper、Service、Controller 等代码,减少重复开发项目
5.分页插件(PaginationInterceptor)
        基于物理分页,自动拦截 SQL 并添加分页语句 (如 MySQL 的 LMIT) ,简化分页操作

Mybatis-plus 运行原理

1.自动配置与代理机制
        启动时通过 Spring Boot 的自动配置加载数据源、事务管理器等组件
        Mapper 接口通过动态代理生成实现类(如 MapperProy),将接口方法转换为对 BaseMapper或自定义 SQL的调用
2.SQL动态生成
        条件构造器将链式调用的条件转换为 WHERE 子句,并拼接到预编译 SQL 中
        通过反射解析实体类与数据库表的映射关系 (如 @TableName 注解))。
3.插件机制
        内置性能分析、分页、乐观锁等插件,通过拦截 Executor 等方法修改 SQL执行流程                      支持自定义插件 (如数据权限拦截),通过 @Intercepts 注解定义拦截点 。
4.事务与执行流程
        默认使用 MyBatis 的 sqlSessionTemplate 管理会话,确保线程安全                                                执行 SQL 时,由sqlSession 调用 Executor,经过插件链处理后访问数据库并返回结果 

总结
        MyBatis-Plus 通过封装通用操作(如 CRUD、分页)和提供扩展组件(如代码生成器),显著简化了数据库开发。其核心原理依赖于动态代理生成 Mapper 实现、条件构造器生成动态 SQL,以及插件机制增强功能。开发者只需关注业务逻辑,复杂 SQL 和重复代码由框架自动处理。 

MyBatis-plus 开启事务 实例

以下是一个基于 MyBatis-Plus 的事务使用示例,结合 Spring Boot 的声明式事务管理:

一、基础配置(自动生效) 

MyBatis-Plus 已集成 Spring 事务管理,无需额外配置事务管理器。只需确保依赖包含 spring-boot-starterjdbc 或mybatis-plus-boot-starte(已内置事务支持)
 

<!-- pom.xml 关键依赖 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

二、事务示例代码

1.实体类与Mapper

// User.java 实体类 
@Data 
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
}
 
// UserMapper.java 
public interface UserMapper extends BaseMapper<User> {}

2.service 层事务控制    重点 @Transactional

@Service 
public class UserService {
    @Autowired 
    private UserMapper userMapper;
 
    // 使用 @Transactional 注解开启事务 
    @Transactional(rollbackFor = Exception.class)
    public void batchInsertWithTransaction() {
        User user1 = new User(null, "Alice", 25, "alice@example.com");
        userMapper.insert(user1); // 插入第一条数据 
 
        // 模拟异常场景(事务会回滚)
        if (true) {
            throw new RuntimeException("测试事务回滚");
        }
 
        User user2 = new User(null, "Bob", 30, "bob@example.com");
        userMapper.insert(user2); // 第二条数据不会执行 
    }
}

三、事务验证测试

@SpringBootTest 
public class TransactionTest {
    @Autowired 
    private UserService userService;
 
    @Test 
    void testTransactionRollback() {
        // 执行会抛出异常的方法 
        Assertions.assertThrows(RuntimeException.class, 
            () -> userService.batchInsertWithTransaction());
 
        // 验证数据库无新增数据 
        List<User> users = userService.list();
        Assertions.assertTrue(users.stream()
            .noneMatch(u -> "Alice".equals(u.getName())));
    }
}

四、关键说明

1.事务生效条件
        方法需通过 Spring 代理调用 (直接调用同类方法不生效)
        默认回滚 RuntimeException ,可通过rollbackFor :指定其他异常类型6
        避免在事务方法中捕获异常后不抛出
2.多数据源事务
        若涉及多个数据库操作,需使用分布式事务方案 (如 Atomikos)6
3.日志调试
        配置 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutimpl 可查看 SQL 执行日志1

@Transactional 事务各种场景示例

一、基础声明式事务 场景:单方法内的事务控制


示例:在 Service 方法上添加@Transactional默认回滚RuntimeException

@Service 
public class UserService {
    @Transactional 
    public void updateUser(User user) {
        userMapper.updateById(user);
        // 其他操作(若此处抛出异常,事务回滚)
    }
}

注意

        1.默认仅回滚RuntimeException,  需自定义回滚异常时添加rollbackFor = Exception.class

        2.注解应作用于 public 方法,否则事务失效

二、嵌套事务与传播行为 场景:方法间事务嵌套(如主业务调用子业务)

示例:设置传播行为为Propagation.REQUIRES_NEW强制新建事务。

@Service 
public class OrderService {
    @Transactional 
    public void createOrder(Order order) {
        // 主事务操作 
        inventoryService.deductStock(); // 调用子事务方法 
    }
}
 
@Service 
public class InventoryService {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void deductStock() {
        // 独立事务(异常不影响主事务)
    }
}

风险提示:

MyBatis-Plus 内置方法(如saveBatch )可能自带事务,导致意外嵌套
 

三、批量操作事务控制 场景: 批量插入/更新需原子性保证

示例:避免使用自带事务的saveBatch改用编程式事务

@Service 
public class BatchService {
    @Autowired 
    private PlatformTransactionManager transactionManager;
 
    public void batchInsert(List<User> users) {
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            users.forEach(userMapper::insert);
            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
            throw e;
        }
    }
}

替代方案:

使用原生批量模式提升性能SqlSession
 

四、异常捕获与手动回滚 场景:需捕获异常但不影响事务回滚

示例:通过TransactionAspectSupport手动回滚

@Service 
public class PaymentService {
    @Transactional 
    public void pay(BigDecimal amount) {
        try {
            // 支付逻辑 
        } catch (BusinessException e) {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            throw e;
        }
    }
}

五、事务隔离级别设置 场景:高并发下控制数据可见性

五.一、示例:设置 READ_COMMITTED 隔离级别。

@Service 
public class AccountService {
    @Transactional(isolation = Isolation.READ_COMMITTED)
    public void transfer(Account from, Account to) {
        // 转账逻辑 
    }
}

五.二、事务隔离级别配置方式 isolation 五种隔离级别

通过 @Transactional(isolation = lsolation.XXX)指定隔离级别,可选参数包括

1.DEFAULT
        使用底层数据库默认隔离级别。例如,MySQL默认是 REPEATABLE_READ,Oracle是 READ COMMITTED 
2.READ_UNCOMMITTED
         允许读取未提交的数据变更,可能引发脏读、不可重复读、幻读。通过排他写锁实现,适用于低一致性要求的场景
3.READ_COMMITTED
        仅读取已提交的数据,避免脏读。通过瞬间共享读锁和排他写锁实现,是多数应用的推荐级别(如 Oracle默认)
4.REPEATABLE_READ
        同一事务多次读取数据一致,防止脏读和不可重复读。通过共享读锁和排他写锁实现,但可能发生幻读(MVSOL默认)
5.SERIALIZABLE
        完全串行化执行,避免所有并发问题,但性能最差。需结合行级锁与其他机制实现 

五.三、不同隔离级别解决的问题

四、关键注意事项

1.隔离级别与性能权衡
        隔离级别越高,数据一致性越强,但并发性能越低。建议优先使用 READ_COMMITTED,必要时通过乐观锁/悲观锁补充控制 
2.与传播行为的结合
        隔离级别常与事务传播行为(如 Propagation.REQUIRED)配合使用,确保事务链的完整性和隔离性 
3.默认行为依赖数据库
        未显式指定时,@Transactional 会继承数据库的默认隔离级别,需根据实际数据库类型调整配置 
4.只读事务优化
        @Transactionallreadony= truel 可优化查询性能(如启用数据库只读模式),但需注意一级缓存可能影响数据可见性  

五、典型问题示例

  • 脏读: 事务A未提交的修改被事务B读取,若A回滚则B读到无效数据
    • 读后 回滚 无效
  • 幻读:事务A两次查询结果集数量不一致,因事务B插入新数据导致
    • 读后 增删 条不一致
  • 不可重复读:两事务同时修改同一数据,后提交的事务覆盖前者的变更
    • a修改 读 b修改 被新覆盖

通讨合理配置隔离级别和传播行为,可有效平衡数据一致性与系统性能。具体选择需结合业务场景和数据库特性。建议通过压认验证不同级别的实际影响

六、事务失效场景及规避

 1.自调用问题:同类中非代理方法调用@Transactional 方法无效 (需通过代理对象调用)   

 2.异常被吞没:try-catch 未重新抛出异常时需手动回滚;

 3.非 public方法:注解仅对 public 方法生效。


总结


        MyBatis-Plus 事务管理需注意 Spring 事务机制的特性,推荐优先使用声明式事务,复杂场景(如批量操作、嵌套事务)结合编程式事务或自定义实现。实际开发中应通过日志监控事务状态,避免隐性嵌套等问题

MyBatis 和Mbatis-Plus 区别

MyBatis 和 MyBatis-Plus 是两个广泛使用的 Java 持久层框架,核心区别如下:

1.核心定位与功能扩展


MyBatis
基础 ORM 框架,通过 XML 或注解配置 SQL,提供对象与数据库的映射功能。开发者需手动编写 SQL和 XML 映射文件,灵活但开发效率较低3
MyBatis-Plus
在 MyBatis 基础上增强的工具,保留原生功能的同时,内置通用 Mapper、Service、分页插件、代码生成器等,减少重复代码支持动态 SQL、Lambda 表达式等高级特性124
 

2.开发效率

  • MvBatis

      需手动编写所有 SQL 语句及实体映射,复杂查询需搭配 MyBatis Generator 生成基础代码,但仍需维护 XML 文件 2

  • MyBatis-Plus

        继承 BaseMapper: 单表 CRUD 操作无需写 SQL或XML,直接调用内置方法(如 selectByld0)、insert ) 2日代码生成器: 自动生成 Entity、Mapper、Service、Controller等代码,简化开发流程 2 3
·条件构造器: 通过 QueryWrapper 或 LambdaQueryWrapper 动态构建复杂查询条件,避免 SQL 拼接错误0。

3.功能增加特性

  • 动态 SQL优化

        MyBatis-Plus 优化了动态 SQL 生成逻辑,性能更高,且支持自动防 SQL 注入

  • 插件支持

        提供性能分析、乐观锁、多租户等插件,扩展性强 。

  • Lambda 表达式

        支持 Lambda 形式调用,提升代码可读性和类型安全性 (如
LambdaQueryWrapper<User>.eq(User::getName, "Tom")

4.sql维护与移植性

  • MyBatis

        SQL 与 Java 代码分离(存于 XML) ,便于统一管理,但数据库移植时需重写 SQL,灵活性受限 

  • MyBatis-Plus

        通过自动解析实体与表字段的映射关系,减少 SQL 依赖,提升跨数据库兼容性3

5.社区与生态

  • MyBatis

        国际社区成熟,但国内支持相对较少,部分高级功能需自行实现。

  • MyBatis-Plus

        国内开发者主导,社区活跃,文档完善,提供中文教程和快速响应支持2

选择建议


MyBatis:适合需要高度定制 SQL 或复杂多表关联的项目
MyBatis-Plus:推荐用于快速开发单表场景,或需减少重复代码的中小型项目
 

***************持续更新 易经的方式看技术*************************

***************持续更新 易经的方式看技术*************************

***************持续更新 易经的方式看技术*************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值