【Mybatis】中设置 jdbcType

先看mybatis官方文档:

http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html

public final enum

JdbcType

extends Enum<E extends Enum<E>>

java.lang.Object
   ↳java.lang.Enum<E extends java.lang.Enum<E>>
    ↳org.apache.ibatis.type.JdbcType

Summary

Enum Values
JdbcType ARRAY  
JdbcType BIGINT  
JdbcType BINARY  
JdbcType BIT  
JdbcType BLOB  
JdbcType BOOLEAN  
JdbcType CHAR  
JdbcType CLOB  
JdbcType CURSOR  
JdbcType DATALINK  
JdbcType DATE  
JdbcType DATETIMEOFFSET  
JdbcType DECIMAL  
JdbcType DISTINCT  
JdbcType DOUBLE  
JdbcType FLOAT  
JdbcType INTEGER  
JdbcType JAVA_OBJECT  
JdbcType LONGNVARCHAR  
JdbcType LONGVARBINARY  
JdbcType LONGVARCHAR  
JdbcType NCHAR  
JdbcType NCLOB  
JdbcType NULL  
JdbcType NUMERIC  
JdbcType NVARCHAR  
JdbcType OTHER  
JdbcType REAL  
JdbcType REF  
JdbcType ROWID  
JdbcType SMALLINT  
JdbcType SQLXML  
JdbcType STRUCT  
JdbcType TIME  
JdbcType TIMESTAMP  
JdbcType TINYINT  
JdbcType UNDEFINED  
JdbcType VARBINARY  
JdbcType VARCHAR  
Fields
public final intTYPE_CODE 
Public Methods
static JdbcTypeforCode(int code)
static JdbcTypevalueOf(String name)
final static JdbcType[]values()
[Collapse]

Inherited Methods

 From class java.lang.Enum
final Objectclone()
final intcompareTo(E arg0)
intcompareTo(Object arg0)
final booleanequals(Object arg0)
final voidfinalize()
final Class<E>getDeclaringClass()
final inthashCode()
final Stringname()
final intordinal()
StringtoString()
static <T extends Enum<T>> TvalueOf(Class<T> arg0, String arg1)
 From class java.lang.Object
Objectclone()
booleanequals(Object arg0)
voidfinalize()
final Class<?>getClass()
inthashCode()
final voidnotify()
final voidnotifyAll()
StringtoString()
final voidwait(long arg0, int arg1)
final voidwait(long arg0)
final voidwait()
 From interface java.lang.Comparable
abstract intcompareTo(T arg0)

Enum Values

public static final JdbcType ARRAY

 

public static final JdbcType BIGINT

 

public static final JdbcType BINARY

 

public static final JdbcType BIT

 

public static final JdbcType BLOB

 

public static final JdbcType BOOLEAN

 

public static final JdbcType CHAR

 

public static final JdbcType CLOB

 

public static final JdbcType CURSOR

 

public static final JdbcType DATALINK

 

public static final JdbcType DATE

 

public static final JdbcType DATETIMEOFFSET

 

public static final JdbcType DECIMAL

 

public static final JdbcType DISTINCT

 

public static final JdbcType DOUBLE

 

public static final JdbcType FLOAT

 

public static final JdbcType INTEGER

 

public static final JdbcType JAVA_OBJECT

 

public static final JdbcType LONGNVARCHAR

 

public static final JdbcType LONGVARBINARY

 

public static final JdbcType LONGVARCHAR

 

public static final JdbcType NCHAR

 

public static final JdbcType NCLOB

 

public static final JdbcType NULL

 

public static final JdbcType NUMERIC

 

public static final JdbcType NVARCHAR

 

public static final JdbcType OTHER

 

public static final JdbcType REAL

 

public static final JdbcType REF

 

public static final JdbcType ROWID

 

public static final JdbcType SMALLINT

 

public static final JdbcType SQLXML

 

public static final JdbcType STRUCT

 

public static final JdbcType TIME

 

public static final JdbcType TIMESTAMP

 

public static final JdbcType TINYINT

 

public static final JdbcType UNDEFINED

 

public static final JdbcType VARBINARY

 

public static final JdbcType VARCHAR

 

Fields

public final int TYPE_CODE

 

Public Methods

public static JdbcType forCode (int code)

 

public static JdbcType valueOf (String name)

 

public static final JdbcType[] values ()

 

Generated by Doclava.

http://www.mybatis.org/mybatis-3/apidocs/reference/org/apache/ibatis/type/JdbcType.html

 

 

 

 

 

 

 

https://www.cnblogs.com/lixuwu/p/5916585.html

CS408

天下事有难易乎?为之,则难者亦易矣;不为,则易者亦难矣。 人之为学有难易乎?学之,则难者亦易矣;不学,则易者亦难矣。

随笔 - 407  文章 - 1  评论 - 27

(转)mybatis常用jdbcType数据类型

阅读目录

回到顶部

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 MybatisjavaTypejdbcType对应关系

复制代码

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")

地址:

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/java.102/B19275-03/datacc.htm#BHCJBJCC

 

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

 

 

 

u

 


如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!

分类: MyBatis

好文要顶 关注我 收藏该文  

CS408
关注 - 3
粉丝 - 52

+加关注

0

0

« 上一篇:(转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType
» 下一篇:(转)maven打包时跳过测试

posted @ 2016-09-28 15:33 CS408 阅读(28124) 评论(0) 编辑 收藏

刷新评论刷新页面返回顶部

https://www.cnblogs.com/lixuwu/p/5916585.html

 

 

 

 

 

 

 

 

https://www.cnblogs.com/DDgougou/p/8578618.html

记自己在mybatis中设置jdbcType的一个坑

  

  项目是用ssm搭建的。主要是为app数据接口。其中有一个需求就app想要查询一段时间内某个用户的测量信息,所以app给我后端传递了3个参数,分别是appuserId(String),startDate(Date),endDate(Date)。我在controller中验证参数没问题之后我将参数传递给service层,然后在service层传递给dao层,执行真正的sql语句查询。

 

service层:

复制代码

1 Map<String, Object> conditionMap = new HashMap<>(3);
2 conditionMap.put("appuserId", appuserId);
3 conditionMap.put("startDate", startDate);
4 conditionMap.put("endDate", endDate);
5 
6 List<Map<String, Object>> list1 = ecgAutoAnalysisMapper.getHealthDataList(conditionMap);

复制代码

  dao层:

  1 List<Map<String, Object>> getHealthDataList(Map<String, Object> conditionMap); 

   dao层的xml文件:

复制代码

 1 <!--measureStartTime为测量时间,在java中是一个java.util.Date,在mysql中是TIMESTAMP类型-->
 2 <resultMap id="healthDataMap" type="map">
 3   <result property="appuserId" column="appuserId" javaType="java.lang.String" jdbcType="CHAR"/>
 4   <result property="measureStartTime" column="measureStartTime" javaType="java.util.Date" jdbcType="TIMESTAMP"/>
 5   <result property="measureSecondLength" column="measureSecondLength" javaType="java.lang.Integer" jdbcType="INTEGER"/>
 6   <result property="hrOverallAvg" column="hrOverallAvg" javaType="java.lang.String" jdbcType="VARCHAR"/>
 7   <result property="chiefComplaint_symptom" column="chiefComplaint_symptom" javaType="java.lang.String" jdbcType="VARCHAR"/>
 8   <result property="chiefComplaint_diet" column="chiefComplaint_diet" javaType="java.lang.String" jdbcType="VARCHAR"/>
 9   <result property="chiefComplaint_activity" column="chiefComplaint_activity" javaType="java.lang.String" jdbcType="VARCHAR"/>
10 </resultMap>
11 
12 <select id="getHealthDataList" parameterType="map" resultMap="healthDataMap">
13   select
14       ea.appuserId,ea.measureStartTime,ed.measureSecondLength,ea.hrOverallAvg,ea.chiefComplaint_symptom,
15       ea.chiefComplaint_diet,ea.chiefComplaint_activity
16   from
17       ecg_auto_analysis ea
18   left join
19       ecg_data ed
20   on
21       ed.autoAnalysisId = ea.id
22   <where>
23     <if test="appuserId != null and appuserId != ''">
24       and ea.appuserId = #{appuserId,jdbcType=CHAR}
25     </if>
26     <if test="startDate != null and startDate != ''">
27       and ea.measureStartTime > #{startDate,jdbcType=Date}
28     </if>
29     <if test="endDate != null and endDate != ''">
30       and #{endDate,jdbcType=Date} > ea.measureStartTime
31     </if>
32   </where>
33 </select>

复制代码

 

  结果是查询出来的的结果与实际的不一样。比如app传递参数,appuserId是“393967382ec34f53a53a4d49271a422a”,startDate是“2018-03-09 00:00:00”,endDate是“2018-03-15 23:59:59”,在数据库中这个用户在这段时间的测量记录有7条,而在mybatis中查询出来的只有4条。很明显是mybatis的sql语句写错了。

数据库查询语句及结果(可以看到测量时间集中在两天,一个是3月9号,一个是3月15号):

复制代码

 1 select
 2     ea.appuserId,ea.measureStartTime,ed.measureSecondLength,ea.hrOverallAvg,ea.chiefComplaint_symptom,ea.chiefComplaint_diet,ea.chiefComplaint_activity
 3 from
 4     ecg_auto_analysis ea
 5 left join
 6     ecg_data ed
 7 on
 8     ed.autoAnalysisId = ea.id
 9 where
10     ea.appuserId = "393967382ec34f53a53a4d49271a422a"
11     and ea.measureStartTime > "2018-03-09 00:00:00"
12     and "2018-03-15 23:59:59" > ea.measureStartTime

复制代码

 

  我是这样解决的,当然故事很曲折,也很折磨人:

  1)先注释掉最后的两个if语句,mybatis的查询结果为7,证明问题就出在最后两个if语句中;

  2)通过翻阅以前的代码,我把这两个if语句中的 jdbcType=Date 去掉,查询结果为7,然后加上 jdbcType=Date 查询结果又为4。没错,问题就出在这句话上,为啥不加就好了,加上就不对了;

  3)网上查询资料,对jdbcType这个参数的描述不多,作用不清楚,大概的意思是“jdbcType这个参数的应用场景就是,当执行mapping文件的时候,有个映射的参数为空,那么无法确定他的类型,这个时候就需要jdbcType来确定类型“。可我还是不清除啥原因导致我的查询结果不正确;

  4)最后看了好长时间,我把 jdbcType=Date 改为 jdbcType=TIMESTAMP,查询结果正确了(这一步花了太多时间)。

 

  我猜想原因是这样的,当我不设置jdbcType时,最后两个if语句在执行比较时,会把参数转换为正确的日期类型,就是 “年月日+时分秒”这种。当我设置 jdbcType=Date 时,就指定日期只用”年月日”,所以传递进来的startDate与endDate就变为“2018-03-09 ”,“2018-03-15”,那在此时间段的记录当然只有4条了。但是设置jdbcType=TIMESTAMP 时,传递进来啥就是啥,所以符合记录的只有7条了,原因就是这样。最后看看mysql数据库中datetime、date、timestamp三种数据类型的区别吧:

 


    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

好文要顶 关注我 收藏该文  

低调的狗狗
关注 - 0
粉丝 - 1

+加关注

0

0

« 上一篇:Linux中各个目录作用
» 下一篇:mysql异常:Packet for query is too large (10240 > 1024). You can change this value

posted @ 2018-03-16 09:44 低调的狗狗 阅读(6765) 评论(0) 编辑 收藏

刷新评论刷新页面返回顶部

https://www.cnblogs.com/DDgougou/p/8578618.html

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值