Mybatis 多数据库兼容 jdbcType
在一些企业中难免在数据存储过程会使用到Oracle、DB2等收费维护的数据库,有时候会根据业务需要或技术栈改造的过程中会使用到更换数据库存储,这种多表现于系统改造,软件升级,客户要求等情况。
Myatis映射文件改造之路
在初始化数据库表与Mybatis的映射文件建立对应关系,我们一般都是通过Mybatis generator逆向工程去生成映射代码,生成的格式可以自定义,有很多种,但Mapper方法是根据生成者的意愿自我选择的,同一个表Mapper方法不管是以何种方式生成,所执行的结果是一致,所以可以简单地兼容,前提是不暴露数据库独有的特性,类型。
说到类型就不得不提jdbcType。
jdbcType
在mybatis中,从java代码与sql映射的过程过程,传入的参数都会指定jdbcType。
常见的jdbcType对应关系:
jdbcType | javaType |
---|---|
JDBC Type | Java Type |
CHAR | String |
VARCHAR | String |
LONGVARCHAR | String |
NUMERIC | java.math.BigDecimal |
DECIMAL | java.math.BigDecimal |
BIT | boolean |
BOOLEAN | boolean |
TINYINT | byte |
SMALLINT | short |
INTEGER | INTEGER |
BIGINT | long |
REAL | float |
FLOAT | double |
DOUBLE | double |
BINARY | byte[] |
VARBINARY | byte[] |
LONGVARBINARY | byte[] |
DATE | java.sql.Date |
TIME | java.sql.Time |
TIMESTAMP | java.sql.Timestamp |
CLOB | Clob |
BLOB | Blob |
ARRAY | Array |
DISTINCT | mapping of underlying type |
STRUCT | Struct |
REF | Ref |
DATALINK | java.net.URL |
UPDATE
TEST_TAKE
SET
INDEX_NO = #{
indexNo},
INDEX_NAME = #{
indexName, jdbcType=VARCHAR},
APPLY_DATE = #{
applyDate, jdbcType=INTEGER},
END_DATE = #{
endDate, jdbcType=INTEGER},
INDEX_TYPE = #{
indexType, jdbcType=VARCHAR},
APPLY_DIM = #{
applyDim, jdbcType=VARCHAR},
BUSINESS_TYPE = #{
businessType, jdbcType=VARCHAR}
WHERE
SERIAL_NO = #{
serialNo, jdbcType=VARCHAR}
上述update语句中,INDEX_NO = #{indexNo} 如果不为null的情况下,执行是没有问题的,如果为null的情况就会导致Mybatis框架无法识别indexNo=null的数据库类型,执行报错,程序不可用。
综上,在未判断为null的情况下,尽可能地加上jdbcType参数,如果进来是非null的情况下,可写可不写, 注意避坑!!!