Mybatis 多数据库兼容 jdbcType

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的情况下,可写可不写, 注意避坑!!!

猜你喜欢

转载自blog.csdn.net/jianghuafeng0/article/details/108874170