You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:57:48