MyBatis中设置null参数时不加jdbcType有什么解决办法吗?
In MyBatis, is there any solution for not adding jdbcType when setting null parameters?
我正在使用 mybatis-3.2.8.jar 和 JDK 1.6.0_45.
来源 table 被称为 emp
:
> EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SHORTCUT
>
> 7499 ALLEN SALESMAN 7698 1981/02/20 00:00:00 1600 300 30 null
而 SQL 是这样的:
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, SHORTCUT)
values
(#{EMPNO},#{ENAME},#{JOB},#{MGR},#{HIREDATE},#{SAL},#{COMM},#{DEPTNO},#{SHORTCUT});
我正在逐行使用 SQL。 Select 1 行然后插入,一次又一次。或者认为 table 只有 1 行。
然后我遇到了这个错误:
org.apache.ibatis.exceptions.PersistenceException:
#### Error updating database. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #7 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR;BEGIN-OF-STATEMENT;<grant>, DRIVER=4.12.55
#### The error may involve pdss5.hs.hdw.ETLTargetMapper.insertTargetTable-Inline
#### The error occurred while setting parameters
#### SQL: insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,SHORTCUT) values(?,?,?,?,?,?,?,?,?) Call getNextException to see the cause
#### Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #7 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR;BEGIN-OF-STATEMENT;<grant>, DRIVER=4.12.55
我的主管不想这样使用 jdbyTYPE
:
insert into emp
(#{EMPNO},#{ENAME},#{JOB},#{MGR},#{HIREDATE},#{SAL},#{COMM},#{DEPTNO},`#{SHORTCUT,jdbcTYPE=VARCHAR}`)
......
MyBatis中设置null参数时不加jdbcType有什么解决办法吗?
我认为添加 jdbcTYPE=VARCHAR
就足够了,但我的长官不喜欢它(也许...)。
我放弃了
DB2 是超类型数据库。
Oracle可以通过mybatis进行无类型插入。当然在 MyBatis 中设置 jdbdtypeForNull。
但 DB2 不是。
有些数据库不允许在查询中发送未类型化的 null
,因此您应该发送它,否则从一个数据库供应商切换到另一个可能会导致您的 SQL 失败。
查看此处了解更多说明:Is jdbcType necessary in a MyBatis mapper?
jdbcType
实际上不是 MyBatis 的要求,而是 JDBC 的要求。始终为 null
参数发送 jdbcType
是一种很好的做法。
我正在使用 mybatis-3.2.8.jar 和 JDK 1.6.0_45.
来源 table 被称为 emp
:
> EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO SHORTCUT
>
> 7499 ALLEN SALESMAN 7698 1981/02/20 00:00:00 1600 300 30 null
而 SQL 是这样的:
insert into emp (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO, SHORTCUT)
values
(#{EMPNO},#{ENAME},#{JOB},#{MGR},#{HIREDATE},#{SAL},#{COMM},#{DEPTNO},#{SHORTCUT});
我正在逐行使用 SQL。 Select 1 行然后插入,一次又一次。或者认为 table 只有 1 行。
然后我遇到了这个错误:
org.apache.ibatis.exceptions.PersistenceException:
#### Error updating database. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #7 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR;BEGIN-OF-STATEMENT;<grant>, DRIVER=4.12.55
#### The error may involve pdss5.hs.hdw.ETLTargetMapper.insertTargetTable-Inline
#### The error occurred while setting parameters
#### SQL: insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO,SHORTCUT) values(?,?,?,?,?,?,?,?,?) Call getNextException to see the cause
#### Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #7 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-104, SQLSTATE=42601, SQLERRMC=insert into TB_ODS_EMP2(EMPNO,ENAME,JOB,MGR;BEGIN-OF-STATEMENT;<grant>, DRIVER=4.12.55
我的主管不想这样使用 jdbyTYPE
:
insert into emp
(#{EMPNO},#{ENAME},#{JOB},#{MGR},#{HIREDATE},#{SAL},#{COMM},#{DEPTNO},`#{SHORTCUT,jdbcTYPE=VARCHAR}`)
......
MyBatis中设置null参数时不加jdbcType有什么解决办法吗?
我认为添加 jdbcTYPE=VARCHAR
就足够了,但我的长官不喜欢它(也许...)。
我放弃了
DB2 是超类型数据库。
Oracle可以通过mybatis进行无类型插入。当然在 MyBatis 中设置 jdbdtypeForNull。
但 DB2 不是。
有些数据库不允许在查询中发送未类型化的 null
,因此您应该发送它,否则从一个数据库供应商切换到另一个可能会导致您的 SQL 失败。
查看此处了解更多说明:Is jdbcType necessary in a MyBatis mapper?
jdbcType
实际上不是 MyBatis 的要求,而是 JDBC 的要求。始终为 null
参数发送 jdbcType
是一种很好的做法。