mysql与jfinal在使用过程中,一定要弄清楚数据关系,否则容易发生类型不匹配的错误。
一、关系整理
为此,我根据jfinal的源码和mysql的数据字段类型,整理列表如下:
mysql
jfinal
例子
编号
varchar, char, enum, set, text, tinytext, mediumtext, longtext
String
getStr(“xxx”)
0001
int, integer, tinyint(n) n > 1, smallint, mediumint
int
getInt(“xxx”)
0002
bigint, unsign int
long
getLong(“xxx”)
0003
unsigned bigint
BigInteger
getBigInteger(“xxx”)
0004
date, year
Date
getDate(“xxx”)
0005
time
Time
getTime(“xxx”)
0006
timestamp, datetime
Timestamp
getTimestamp(“xxx”)
0006
real, double
Double
getDouble(“xxx”)
0007
float
Float
getFloat(“xxx”)
0008
bit, tinyint(1)
Boolean
getBoolean(“xxx”)
0009
decimal, numeric
BigDecimal
getBigDecimal(“xxx”)
0010
binary, varbinary, tinyblob, blob, mediumblob, longblob
byte[]
getBytes(“xxx”)
0011
extends from Number
Number
getNumber(“xxx”)
0012
二、tinyint
在mysql中,tinyint(n)中的n对jfinal的数据转换有影响:
n>1时,jfinal要使用getInt。
n=1时,jfinal要使用getBoolean。
三、unsigned
在mysql中unsigned表示有无符号,举例来说:
unsigned int,表示数据>0,不包含负数,那么jfinal就要使用getLong。
unsigned bigint,表示数据>0,不包含负数,那么jfinal就要使用getBigInteger。
四、int(m)
关于mysql中int(m)中的m,这当然包含bigint(m)的m。
int[(m)]
有符号值:-2147683648 到2147683647(- 231 到231- 1)
无符号值:0到4294967295(0 到232 - 1) 4个字节
这意味着,如果你的数据字段是这样子的话
`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用户id'
那么m=11是正确的,因为考虑到“-”(负数),长度最大为11位。
而如果你的数据字段是这样子的话
`uid` int(11) unsigned NOT NULL COMMENT '用户id'
那么m=11是没有意义的,因为最大长度为10位,如果你比较专业的话,此时,你的数据字段就应该是这样子的
`uid` int(10) unsigned NOT NULL COMMENT '用户id'
五、jfinal的api
只看如下代码:
/**
* Get attribute of mysql type: int, integer, tinyint(n) n > 1, smallint, mediumint
*/
public Integer getInt(String attr) {
return (Integer)attrs.get(attr);
}
/**
* Get attribute of mysql type: bigint, unsign int
*/
public Long getLong(String attr) {
return (Long)attrs.get(attr);
}
方法很详细的介绍了应该匹配哪一种mysql数据类型。
笑对现实的无奈,不能后退的时候,不再傍徨的时候,永远向前 路一直都在──陈奕迅《路一直都在》
本文出自:【沉默王二的博客】