MyBatis处理MySQL字段类型date与datetime

1) DATETIME
显示格式:yyyy-MM-dd HH:mm:ss
时间范围:[ '1000-01-01 00:00:00''9999-12-31 23:59:59']

2) DATE
显示格式:yyyy-MM-dd
时间范围:['1000-01-01''9999-12-31']

3) TIMESTAMP
显示格式:yyyy-MM-dd HH:mm:ss
时间范围:[ '1970-01-01 00:00:00''2037-12-31 23:59:59']

一、 MyBatis处理日期有两种的jdbcType:

1、jdbcType=DATE
2、jdbcType=TIMESTAMP

二、JAVA中只有一种日期类型 DateTime

当我们使用java.util.Date作为实体的日期类型时(JAVA没有DateTime这个类,Date类能够同时表示日期和时间),java.util.Date实际上是能够表示MySQL的三种字段类型:

1、date
2、datetime
3、timestamp

三、MyBatis处理方式

而实际将java.util.Date当做参数传递给Mapper的时候
1、假如我们不指定jdbcType,那么这个日期会自动转化会MySQL的timestamp,例子如下:
2、指定jdbcType=TIMESTAMP结果同上。
3、指定jdbcType=DATE,那么MyBatis会将传入参数截取为2018-07-24(Date)

在这里插入图片描述

四、总结

使用java.util.Date作为参数传递给Mapper时,不管MySQL的日期字段类型是date、datetime或者timestamp中的哪一种,MyBatis都能够自动做出类型转换,可以直接使用 =、>、<、>=、<=符号来进行筛选。
唯一的不同点是指定jdbcType=DATE的时候,MyBatis会自动截取掉时间,如果MySQL的日期字段类型是datetime或者timestamp一定不要这么写。
总之不手动指定参数的jdbcType必然没有问题

MyBatis 常用jdbcType数据类型

1 MyBatis 通过包含的jdbcType类型

BIT         FLOAT      CHAR           TIMESTAMP       OTHER       UNDEFINED

TINYINT     REAL       VARCHAR        BINARY          BLOB        NVARCHAR

SMALLINT    DOUBLE     LONGVARCHAR    VARBINARY       CLOB        NCHAR

INTEGER     NUMERIC    DATE           LONGVARBINARY   BOOLEAN     NCLOB

BIGINT      DECIMAL    TIME           NULL            CURSOR

2 Mybatis中javaType和jdbcType对应和CRUD例子

<resultMap type="java.util.Map" id="resultjcm">
  <result property="FLD_NUMBER" column="FLD_NUMBER"  javaType="double" jdbcType="NUMERIC"/>
  <result property="FLD_VARCHAR" column="FLD_VARCHAR" javaType="string" jdbcType="VARCHAR"/>
  <result property="FLD_DATE" column="FLD_DATE" javaType="java.sql.Date" jdbcType="DATE"/>
  <result property="FLD_INTEGER" column="FLD_INTEGER"  javaType="int" jdbcType="INTEGER"/>
  <result property="FLD_DOUBLE" column="FLD_DOUBLE"  javaType="double" jdbcType="DOUBLE"/>
  <result property="FLD_LONG" column="FLD_LONG"  javaType="long" jdbcType="INTEGER"/>
  <result property="FLD_CHAR" column="FLD_CHAR"  javaType="string" jdbcType="CHAR"/>
  <result property="FLD_BLOB" column="FLD_BLOB"  javaType="[B" jdbcType="BLOB" />
  <result property="FLD_CLOB" column="FLD_CLOB"  javaType="string" jdbcType="CLOB"/>
  <result property="FLD_FLOAT" column="FLD_FLOAT"  javaType="float" jdbcType="FLOAT"/>
  <result property="FLD_TIMESTAMP" column="FLD_TIMESTAMP"  javaType="java.sql.Timestamp" jdbcType="TIMESTAMP"/>
 </resultMap>

3 Mybatis中javaType和jdbcType对应关系

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                int
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[color=red][/color]

4 oracle数据类型和对应的java类型

用mybatis generator生成代码后,执行查询语句时,oracle里的Date类型字段只精确到年月日,后面时分秒都为零。
jdbcType="DATE"时候,存入到数据库中的字段只有年月日!
后来发现是jdbcType问题,改成 jdbcType=“TIMESTAMP” 就可以。(原先默认生成时是jdbcType=“DATE”)

SQL数据类型JDBC类型代码标准的Java类型Oracle扩展的Java类型
-1.0标准的JDBC类型:--
CHARjava.sql.Types.CHARjava.lang.Stringoracle.sql.CHAR
VARCHAR2java.sql.Types.VARCHARjava.lang.Stringoracle.sql.CHAR
LONGjava.sql.Types.LONGVARCHARjava.lang.Stringoracle.sql.CHAR
NUMBERjava.sql.Types.NUMERICjava.math.BigDecimaloracle.sql.NUMBER
NUMBERjava.sql.Types.DECIMALjava.math.BigDecimaloracle.sql.NUMBER
NUMBERjava.sql.Types.BITbooleanoracle.sql.NUMBER
NUMBERjava.sql.Types.TINYINTbyteoracle.sql.NUMBER
NUMBERjava.sql.Types.SMALLINTshortoracle.sql.NUMBER
NUMBERjava.sql.Types.INTEGERintoracle.sql.NUMBER
NUMBERjava.sql.Types.BIGINTlongoracle.sql.NUMBER
NUMBERjava.sql.Types.REALfloatoracle.sql.NUMBER
NUMBERjava.sql.Types.FLOATdoubleoracle.sql.NUMBER
NUMBERjava.sql.Types.DOUBLEdoubleoracle.sql.NUMBER
RAWjava.sql.Types.BINARYbyte[]oracle.sql.RAW
RAWjava.sql.Types.VARBINARYbyte[]oracle.sql.RAW
LONGRAWjava.sql.Types.LONGVARBINARYbyte[]oracle.sql.RAW
DATEjava.sql.Types.DATEjava.sql.Dateoracle.sql.DATE
DATEjava.sql.Types.TIMEjava.sql.Timeoracle.sql.DATE
TIMESTAMPjava.sql.Types.TIMESTAMPjaval.sql.Timestamporacle.sql.TIMESTAMP
-2.0标准的JDBC类型:-
BLOBjava.sql.Types.BLOBjava.sql.Bloboracle.sql.BLOB
CLOBjava.sql.Types.CLOBjava.sql.Cloboracle.sql.CLOB
用户定义的对象java.sql.Types.STRUCTjava.sql.Structoracle.sql.STRUCT
用户定义的参考java.sql.Types.REFjava.sql.Reforacle.sql.REF
用户定义的集合java.sql.Types.ARRAYjava.sql.Arrayoracle.sql.ARRAY
-Oracle扩展:--
BFILEoracle.jdbc.OracleTypes.BFILEN/Aoracle.sql.BFILE
ROWIDoracle.jdbc.OracleTypes.ROWIDN/Aoracle.sql.ROWID
REF CURSORoracle.jdbc.OracleTypes.CURSORjava.sql.ResultSetoracle.jdbc.OracleResultSet
TIMESTAMPoracle.jdbc.OracleTypes.TIMESTAMPjava.sql.Timestamporacle.sql.TIMESTAMP
TIMESTAMP WITH TIME ZONEoracle.jdbc.OracleTypes.TIMESTAMPTZjava.sql.Timestamporacle.sql.TIMESTAMPTZ
TIMESTAMP WITH LOCAL TIME ZONEoracle.jdbc.OracleTypes.TIMESTAMPLTZjava.sql.Timestamporacle.sql.TIMESTAMPLTZ
Logo

更多推荐