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’
1
1
那么m=11是正确的,因为考虑到“-”(负数),长度最大为11位。
而如果你的数据字段是这样子的话
`uid` int(11) unsigned NOT NULL COMMENT ‘用户id’
1
1
那么m=11是没有意义的,因为最大长度为10位,如果你比较专业的话,此时,你的数据字段就应该是这样子的
`uid` int(10) unsigned NOT NULL COMMENT ‘用户id’
1
1
五、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);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
方法很详细的介绍了应该匹配哪一种mysql数据类型。