mybatis-plus mysql迁移oracle实践

本文介绍了在Spring Boot环境下,使用mybatis-plus 3.3.0和Sharding进行MySQL到Oracle的数据迁移过程。重点讨论了Oracle中表名字段名需用双引号、无LIMIT语句、ID自增需借助序列、空串与NULL等价这四个关键改造点,并提供了相应的解决方案。配置文件的调整和KeyGenerator的使用也在文中提及。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

集成环境

spring boot 
mybatis-plus 3.3.0 
sharding

迁移改造点

  1. oracle 表名字段名小写是需要使用双引号

  2. oracle 没有limit

  3. oracle ID自增需要借助序列

  4. oracle 空串与NULL等价,均存为NULL

oracle 表名字段名小写是需要使用双引号

类com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig中存在相关配置 
capitalMode=true即可

oracle 没有limit

limit 应借助Pagenation插件实现,使用page获取其中一页

oracle ID自增需要借助序列

使用KeySequence注解以及KeyGenerator进行,相关底层代码见com.baomidou.mybatisplus.core.injector.methods.Insert#injectMappedStatement

oracle 空串与NULL等价,均存为NULL

  1. 插入值使用代码默认填充,屏蔽mysql和oracle的区别,具体见注解中TableField的fill属性,如FieldFill.INSERT

  2. 更新时仅更新非空串,见update-strategy中FieldStrategy

配置文件如下


 

mybatis-plus:

mapper-locations: classpath:mapper/*.xml

configuration:

#log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

map-underscore-to-camel-case: true

global-config:

db-config:

capital-mode: true # 大写

id-type: 2 # INPUT

insert-strategy: IGNORED # 默认填充

update-strategy: NOT_EMPTY # 非空串才更新

需要声明keyGenerator,在config类中增加如下代码配合KeySequence使用


 

@Bean

public OracleKeyGenerator oracleKeyGenerator(){

return new OracleKeyGenerator();

}

结语

本实践尚未达到oracle和mysql无代码改动迁移,后续需继续推进

MyBatis-Plus 是在 MyBatis 基础上进行的增强工具,旨在简化开发、提高效率。两者都用于 Java 应用程序中的持久层操作,但它们在功能和使用方式上有显著区别。 ### 功能与特性对比 1. **CRUD 操作简化** MyBatis 需要手动编写 SQL 语句并在 XML 文件或注解中配置映射关系,开发者需要为每个表编写对应的增删改查方法。而 MyBatis-Plus 提供了通用的 `BaseMapper` 接口,内置了常见的 CRUD 方法,几乎不需要编写额外的 SQL 即可完成基础数据操作。例如: ```java public interface UserMapper extends BaseMapper<User> { } ``` 这种方式极大减少了样板代码,并提高了开发效率[^2]。 2. **自动填充功能** MyBatis-Plus 支持字段自动填充功能(如创建时间和更新时间),通过实现 `MetaObjectHandler` 接口即可定义自动填充逻辑。这种方式避免了在每次插入或更新时都需要手动设置这些字段值的情况。相比之下,MyBatis 需要自行处理这些字段的赋值逻辑。 3. **分页查询支持** 在 MyBatis 中实现分页通常需要借助插件或者自定义 SQL,而 MyBatis-Plus 内置了强大的分页插件 `PaginationInterceptor`,只需简单配置即可轻松实现分页功能。例如: ```java Page<User> page = new Page<>(1, 10); userMapper.selectPage(page, null); ``` 4. **条件构造器** MyBatis-Plus 引入了 `QueryWrapper` 和 `UpdateWrapper` 等条件构造器,使得构建动态查询条件更直观且类型安全。例如: ```java List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("age", 30)); ``` 而在 MyBatis 中,虽然可以通过 `<if>` 标签实现类似功能,但其语法较为繁琐且容易出错。 5. **性能优化与扩展性** MyBatis-Plus 提供了一些性能优化的功能,比如批量插入 (`insertBatchSomeColumn`) 和乐观锁机制等。此外,它还支持多种数据库方言以及与 ShardingSphere 等分库分表中间件的集成,进一步提升了系统的可扩展性和灵活性[^1]。 6. **分布式全局唯一 ID 生成** MyBatis-Plus 可以方便地集成百度 UIDGenerator 或 Snowflake 算法来生成分布式环境下的唯一主键。这种能力对于微服务架构尤为重要,因为它确保了跨节点的数据一致性。而在 MyBatis 中,这类需求通常需要额外引入第三方库或自行实现。 7. **事务管理** 对于复杂的业务场景,MyBatis-Plus 同样能够很好地支持声明式事务管理,并且可以结合 XA 事务协议实现跨库事务控制。例如: ```java @Transactional(rollbackFor = Exception.class) public void batchAdd() { TransactionTypeHolder.set(TransactionType.XA); // 插入订单及订单项... } ``` 此外,它还可以与其他框架(如 Spring)无缝协作,提供更高级别的事务抽象[^3]。 8. **SQL 兼容性与迁移支持** 当从 MySQL 迁移Oracle 时,MyBatis-Plus 提供了一定程度上的 SQL 语法兼容性转换支持,帮助减少因底层数据库变更带来的工作量。例如,在 Oracle 中计算两个日期之间的差异可以直接使用 ROUND 函数配合 TO_DATE 实现,而无需修改大量现有代码[^4]。 9. **易用性与社区生态** MyBatis-Plus 拥有活跃的中文社区和支持文档,适合国内开发者快速上手;同时,它也提供了丰富的示例项目和最佳实践指南。这使得即使是初学者也能迅速掌握其核心功能并应用于实际项目中。 综上所述,尽管 MyBatis 作为一款经典的 ORM 框架依然具有广泛的适用范围,但 MyBatis-Plus 以其简洁的设计理念、高效的开发模式以及对现代应用场景的良好适配能力,在许多方面超越了原生 MyBatis。特别是在大型分布式系统中,MyBatis-Plus 的优势更为明显。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值