SpringBoot中无需编写SQL,通过JdbcTemplate将Mongo POJO插入Oracle
解决方案:SpringBoot自动映射驼峰POJO到Oracle下划线列完成批量插入
针对多集合迁移、不想手动编写SQL的场景,SpringBoot里有两种成熟方案可以自动完成字段映射和数据插入,完全无需手写插入语句:
方案一:Spring Data JPA
JPA支持全局字段命名策略配置,能自动将驼峰命名的POJO字段转换成Oracle的下划线大写列名。
步骤1:配置全局命名策略
在application.yml(或application.properties)中添加JPA命名策略配置,让Hibernate自动处理驼峰到下划线的转换:
spring: jpa: hibernate: naming: # 物理命名策略:将驼峰转成下划线并自动大写 physical-strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy properties: hibernate: # 可选:格式化SQL方便调试 format_sql: true
步骤2:编写实体类
给从Mongo生成的驼峰POJO添加JPA注解,指定对应的Oracle表名即可,无需给每个字段加@Column(除非有特殊映射需求):
import jakarta.persistence.Entity; import jakarta.persistence.Table; import jakarta.persistence.Id; @Entity @Table(name = "USER_INFO") // 填写Oracle对应的目标表名(大写) public class UserInfo { @Id private String id; // 自动映射Oracle的ID列 private String firstName; // 自动映射到FIRST_NAME private String lastName; // 自动映射到LAST_NAME // 其他字段及对应的getter、setter方法 }
步骤3:编写Repository并执行插入
创建继承JpaRepository的接口,直接使用内置的saveAll方法批量插入数据:
import org.springframework.data.jpa.repository.JpaRepository; public interface UserInfoRepository extends JpaRepository<UserInfo, String> { }
业务层调用示例:
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class MigrationService { private final UserInfoRepository userInfoRepository; // 构造注入 public MigrationService(UserInfoRepository userInfoRepository) { this.userInfoRepository = userInfoRepository; } @Transactional // 事务保证数据一致性 public void migrateUserList(List<UserInfo> userList) { // 批量插入,JPA自动生成对应INSERT语句 userInfoRepository.saveAll(userList); } }
方案二:MyBatis(或MyBatis-Plus)
如果项目使用MyBatis,同样可以通过全局配置开启驼峰转下划线,配合MyBatis-Plus的通用Mapper,插入操作更简洁。
步骤1:开启驼峰映射
在application.yml中配置MyBatis全局映射规则:
mybatis: configuration: # 自动将下划线列名映射为驼峰字段名 map-underscore-to-camel-case: true
若使用MyBatis-Plus,配置类似:
mybatis-plus: configuration: map-underscore-to-camel-case: true
步骤2:编写Mapper接口
继承MyBatis-Plus的BaseMapper,无需编写任何SQL语句:
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface UserInfoMapper extends BaseMapper<UserInfo> { }
步骤3:执行批量插入
直接调用MyBatis-Plus提供的批量插入方法:
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class MigrationService { private final UserInfoMapper userInfoMapper; public MigrationService(UserInfoMapper userInfoMapper) { this.userInfoMapper = userInfoMapper; } @Transactional public void migrateUserList(List<UserInfo> userList) { // MyBatis-Plus批量插入方法,自动生成INSERT语句 userInfoMapper.insertBatchSomeColumn(userList); } }
注意事项
- 特殊字段映射:若个别字段映射不符合默认规则,可单独用
@Column(name = "CUSTOM_COLUMN")(JPA)或@Result(column = "CUSTOM_COLUMN", property = "userAge")(MyBatis)调整。 - 批量插入性能:若迁移数据量极大,建议分批次插入(如每次插500-1000条),避免内存溢出和数据库性能问题。
- 主键策略:若Oracle表使用自增主键,需在POJO主键字段配置对应生成策略,比如JPA用
@GeneratedValue(strategy = GenerationType.IDENTITY),MyBatis-Plus用@TableId(type = IdType.AUTO)。 - 事务控制:迁移过程务必添加
@Transactional注解,防止部分插入成功部分失败导致数据不一致。
内容的提问来源于stack exchange,提问作者C Puneeth
相关产品推荐
相关产品推荐

