spring boot oracle 中insert语句字段缺失问题

问题描述:spring boot中使用mybatis plus 新增实体类时,实体类十个字段。而执行的时候只有五个字段成功插入。

方法解读:是因为使用insert方法的时候,添加了if的判空 所以空值是不插入数据库的。如果想全部插入数据库 则使用insertAllColumn方法进行插入。

 

关于数据库主键插入无效的方法或主键插入非空的提示

解决办法 在实体类中加入

@TableId(value = "MDT_ID",type = IdType.INPUT)
private Long mdtId;

这样的语句即可  表示主键为输入类型的主键,然后即可保存。

<think>嗯,用户的问题是关于在Spring Boot项目中,使用Druid和MyBatis连接Oracle数据源时,编码格式不一致导致的问题,需要确保插入和查询都用UTF-8编码。首先,我需要回忆一下相关的配置步骤以及可能出问题的地方。 首先,用户提到的是多数据源配置,所以应该检查每个数据源的URL是否正确设置了字符编码。根据引用中的例子,比如引用3里的MySQL配置,URL里加了useUnicode和characterEncoding参数。Oracle可能也有类似的参数需要设置。不过Oracle的JDBC驱动参数可能和MySQL不同,需要确认正确的参数名称。 然后,用户使用Druid作为连接池,所以每个数据源的配置应该在application.yml中分别指定,特别是URL部分。引用1和引用2提到多数据源的配置,其中引用1的例子中URL里有characterEncoding=utf8,但用户的问题可能出现在Oracle的配置中没有正确设置这些参数。 接下来,Oracle数据库本身的字符集也需要确认是否是AL32UTF8或者UTF8,否则即使应用层设置了,数据库存储时可能还是会转换。这可能需要DBA的协助,但应用配置同样重要。 MyBatis的配置部分,可能需要检查XML映射文件中是否有正确的参数设置,比如在插入时指定jdbcType,或者在全局配置中设置useUnicode和characterEncoding。另外,MyBatis的SQL会话工厂是否关联了正确配置的数据源,确保每个数据源都正确应用了编码设置。 还有,连接池的配置,比如Druid,是否在连接初始化时执行了修改编码的SQL语句,比如ALTER SESSION SET NLS_LANGUAGE=AMERICAN等,来确保会话级别的编码正确。引用1中的例子有类似的初始化SQL,用户可能需要为Oracle数据源添加这样的设置。 另外,检查应用的全局字符编码过滤器,比如Spring的CharacterEncodingFilter,确保请求和响应的编码都是UTF-8。有时候,虽然数据库和JDBC配置正确,但应用层没有正确处理字符编码,也会导致乱码。 还有可能的问题点包括:数据库表结构的字段是否使用NVARCHAR2等支持Unicode的类型,而不仅仅是VARCHAR2;JDBC驱动版本是否过旧,可能需要升级到支持更好编码处理的版本。 综合这些步骤,解决方案应该包括检查并正确配置每个Oracle数据源的URL参数,设置Druid的初始化SQL,验证数据库和服务器的字符集,配置MyBatis和全局过滤器,以及确保字段类型正确。此外,测试插入和查询操作,使用日志或工具监控实际传输的编码是否正确,也是必要的验证步骤。</think>### 分步解决方案 #### 1. **配置Oracle数据源URL参数** 在Spring Boot的`application.yml`中为每个Oracle数据源添加`useUnicode`和`characterEncoding`参数,确保连接时强制使用UTF-8编码: ```yaml datasource: oracle1: url: jdbc:oracle:thin:@//host:port/service_name?useUnicode=true&characterEncoding=UTF-8 username: "特殊账号" # 特殊符号需单引号包裹[^1] driver-class-name: oracle.jdbc.OracleDriver oracle2: url: jdbc:oracle:thin:@//host:port/service_name?useUnicode=true&characterEncoding=UTF-8 ``` > **注意**:Oracle官方驱动对`characterEncoding`的支持有限,需配合其他参数使用[^3]。 --- #### 2. **设置Druid连接池初始化SQL** 在Druid配置中添加初始化SQL命令,强制会话级编码: ```yaml druid: oracle1: connection-init-sqls: - "ALTER SESSION SET NLS_LANGUAGE=AMERICAN" - "ALTER SESSION SET NLS_TERRITORY=AMERICA" - "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'" ``` 此配置可统一日期、语言等字符集相关参数。 --- #### 3. **验证数据库服务器字符集** 通过SQL检查Oracle服务器字符集: ```sql SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); ``` 确保结果包含`AL32UTF8`或`UTF8`。若为`ZHS16GBK`等,需联系DBA修改数据库字符集。 --- #### 4. **配置MyBatis参数** 在MyBatis的XML映射文件中明确指定`jdbcType`: ```xml <insert id="insertData"> INSERT INTO table (content) VALUES (#{content,jdbcType=VARCHAR}) </insert> ``` 同时,在`mybatis-config.xml`中全局配置: ```xml <settings> <setting name="jdbcTypeForNull" value="NULL"/> <setting name="defaultStatementTimeout" value="30"/> </settings> ``` --- #### 5. **应用层全局编码过滤器** 添加Spring的`CharacterEncodingFilter`: ```java @Bean public FilterRegistrationBean<CharacterEncodingFilter> encodingFilter() { FilterRegistrationBean<CharacterEncodingFilter> bean = new FilterRegistrationBean<>(); bean.setFilter(new CharacterEncodingFilter()); bean.addInitParameter("encoding", "UTF-8"); bean.addInitParameter("forceEncoding", "true"); bean.addUrlPatterns("/*"); return bean; } ``` --- #### 6. **字段类型与驱动验证** - 数据字段类型应使用`NVARCHAR2`代替`VARCHAR2`以支持完整Unicode - 升级Oracle JDBC驱动至最新版本(如ojdbc8.jar) --- #### 验证步骤 1. 插入包含中文和特殊符号的测试数据 2. 直接查询数据库确认存储结果 3. 通过MyBatis查询后检查返回结果 4. 使用`Wireshark`或`JDBC日志`监控实际传输编码 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值