(jdbcType)mybatis 查询Oracle Date类型字段只精确到年月日

本文介绍了解决使用MyBatis Generator生成代码后,在Oracle数据库中Date类型字段精度仅限于年月日的问题。通过将JDBC类型从DATE改为TIMESTAMP,可以确保日期时间包括时分秒部分。

用mybatis generator生成代码后,执行查询语句时,oracle里的Date类型字段只精确到年月日,后面时分秒都为零。


后来发现是jdbcType问题,改成 jdbcType="TIMESTAMP" 就可以。(原先默认生成时是jdbcType="DATE")


ps:实体类里Date是java.util.Date包里的,不是java.sql.Date,否则也会只精确到年月日

在使用 MyBatisOracle 数据库插入数据时,若字段类型为 `DATE` 并遇到错误代码 17041(“索引中丢失 IN 或 OUT 参数”),通常是因为 MyBatisOracle 的 JDBC 驱动之间在参数绑定过程中未能正确识别日期类型的映射。 ### 常见原因及解决方案 #### 1. 使用 `#{}` 占位符时未指定 JDBC 类型 当插入 `DATE` 类型字段时,MyBatis 默认可能无法正确推断该字段的 JDBC 类型,导致参数绑定失败。应在 SQL 映射文件中显式指定 `jdbcType=DATE`: ```xml <insert id="saveCustomer"> INSERT INTO buff.customers ( identity, custname, sex, address, phone, career, birth_date ) VALUES ( #{identity}, #{custname}, #{sex}, #{address}, #{phone}, #{career}, #{birthDate, jdbcType=DATE} ) </insert> ``` 这样可以确保 MyBatis 在设置参数时正确地将其转换为 Oracle 所需的 `java.sql.Date` 类型 [^1]。 #### 2. 使用 `RETURNING INTO` 子句时的参数绑定问题 如果在插入语句中使用了 `RETURNING ... INTO` 子句来获取生成的主键或其他字段值,例如: ```sql INSERT INTO customers (...) VALUES (...) RETURNING rowid INTO :nav_rowid ``` Oracle 的 JDBC 驱动要求 `:nav_rowid` 这类变量必须是已注册的输出参数(OUT parameter)。MyBatis 对此支持有限,建议改用以下方式处理返回值: - **使用 `<selectKey>` 标签**: ```xml <insert id="saveCustomer"> <selectKey keyProperty="rowId" resultType="string" order="AFTER"> SELECT RAWTOHEX(rowid) FROM customers WHERE id = #{id} </selectKey> INSERT INTO customers (...) VALUES (...) </insert> ``` - **或使用数据库触发器/序列手动管理主键** [^1]。 #### 3. 检查 Java 中的日期类型 确保传入的日期对象是 `java.util.Date` 或其子类(如 `java.sql.Date`)。若使用的是 `LocalDate` 或 `LocalDateTime`,则需要配置 MyBatis类型处理器(`TypeHandler`)或将日期转换为 `java.sql.Date`: ```java @Insert("INSERT INTO customers (name, birth_date) VALUES (#{name}, #{birthDate})") void saveCustomer(@Param("name") String name, @Param("birthDate") java.sql.Date birthDate); ``` #### 4. 配置 MyBatis 的 JDBC 类型映射 可以在全局配置文件中添加如下配置,以确保所有 `Date` 类型自动映射为 `JDBC DATE`: ```yaml mybatis: configuration: mapUnderscoreToCamelCase: true defaultEnumTypeHandler: org.apache.ibatis.type.EnumTypeHandler typeHandlers: - handler: org.apache.ibatis.type.DateTypeHandler javaType: java.util.Date jdbcType: DATE ``` ### 总结 解决此类问题的核心在于明确指定 JDBC 类型、避免在 `RETURNING INTO` 中使用命名参数,并确保 Java 端日期类型的兼容性。通过上述方法可有效规避 Oracle 插入 DATE 类型字段时报错 17041 的问题 。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值