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类型: | – | – |
CHAR | java.sql.Types.CHAR | java.lang.String | oracle.sql.CHAR |
VARCHAR2 | java.sql.Types.VARCHAR | java.lang.String | oracle.sql.CHAR |
LONG | java.sql.Types.LONGVARCHAR | java.lang.String | oracle.sql.CHAR |
NUMBER | java.sql.Types.NUMERIC | java.math.BigDecimal | oracle.sql.NUMBER |
NUMBER | java.sql.Types.DECIMAL | java.math.BigDecimal | oracle.sql.NUMBER |
NUMBER | java.sql.Types.BIT | boolean | oracle.sql.NUMBER |
NUMBER | java.sql.Types.TINYINT | byte | oracle.sql.NUMBER |
NUMBER | java.sql.Types.SMALLINT | short | oracle.sql.NUMBER |
NUMBER | java.sql.Types.INTEGER | int | oracle.sql.NUMBER |
NUMBER | java.sql.Types.BIGINT | long | oracle.sql.NUMBER |
NUMBER | java.sql.Types.REAL | float | oracle.sql.NUMBER |
NUMBER | java.sql.Types.FLOAT | double | oracle.sql.NUMBER |
NUMBER | java.sql.Types.DOUBLE | double | oracle.sql.NUMBER |
RAW | java.sql.Types.BINARY | byte[] | oracle.sql.RAW |
RAW | java.sql.Types.VARBINARY | byte[] | oracle.sql.RAW |
LONGRAW | java.sql.Types.LONGVARBINARY | byte[] | oracle.sql.RAW |
DATE | java.sql.Types.DATE | java.sql.Date | oracle.sql.DATE |
DATE | java.sql.Types.TIME | java.sql.Time | oracle.sql.DATE |
TIMESTAMP | java.sql.Types.TIMESTAMP | javal.sql.Timestamp | oracle.sql.TIMESTAMP |
– | 2.0标准的JDBC类型: | – | |
BLOB | java.sql.Types.BLOB | java.sql.Blob | oracle.sql.BLOB |
CLOB | java.sql.Types.CLOB | java.sql.Clob | oracle.sql.CLOB |
用户定义的对象 | java.sql.Types.STRUCT | java.sql.Struct | oracle.sql.STRUCT |
用户定义的参考 | java.sql.Types.REF | java.sql.Ref | oracle.sql.REF |
用户定义的集合 | java.sql.Types.ARRAY | java.sql.Array | oracle.sql.ARRAY |
– | Oracle扩展: | – | – |
BFILE | oracle.jdbc.OracleTypes.BFILE | N/A | oracle.sql.BFILE |
ROWID | oracle.jdbc.OracleTypes.ROWID | N/A | oracle.sql.ROWID |
REF CURSOR | oracle.jdbc.OracleTypes.CURSOR | java.sql.ResultSet | oracle.jdbc.OracleResultSet |
TIMESTAMP | oracle.jdbc.OracleTypes.TIMESTAMP | java.sql.Timestamp | oracle.sql.TIMESTAMP |
TIMESTAMP WITH TIME ZONE | oracle.jdbc.OracleTypes.TIMESTAMPTZ | java.sql.Timestamp | oracle.sql.TIMESTAMPTZ |
TIMESTAMP WITH LOCAL TIME ZONE | oracle.jdbc.OracleTypes.TIMESTAMPLTZ | java.sql.Timestamp | oracle.sql.TIMESTAMPLTZ
|