雅典之夏的小站
知人者智 自知者明 Fighting!!
Java和SQL各自有一套自己定义的数据类型(jsp的数据类型实际上就是Java的数据类型),我们要在Jsp程序和数据库管理系统之间正确的交换数据,必然要将二者的数据类型进行转换。先让我们来看两个表:

表SQL到Java数据类型影射表

SQL 数据类型
JAVA数据类型

CHAR
String

VARCHAR
String

LONGVARCHAR
String

NUMERIC
java.math.BigDecimal

DECIMAL
java.math.BigDecimal

BIT
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














Java到SQL数据类型影射表

JAVA数据类型
SQL 数据类型

String
VARCHAR or LONGVARCHAR

java.math.BigDecimal
NUMERIC

Boolean
BIT

Byte
TINYINT

Short
SMALLINT

Int
INTEGER

Long
BIGINT

Float
REAL

Double
DOUBLE

byte[]
VARBINARY or LONGVARBINARY

java.sql.Date
DATE

java.sql.Time
TIME

java.sql.Timestamp
TIMESTAMP




这里,大伙要注意了,并不是所有的数据类型在各种数据库管理系统中都被支持。下面,就几种常用的数据类型之间的转化进行说明:



(1) CHAR, VARCHAR, 和 LONGVARCHAR



在SQL语言中,有三种分别表示不同长度的字符类型CHAR, VARCHAR, 和 LONGVARCHAR,在Java/Jsp中并没有相应的三种不同的数据类型与之一一对应,JDBC的处理方法是将其与String或者char[]对应起来。在实际编程中不必对着三种SQL数据类型进行区分,全部将他们转化为Sting或者char[]就可以了。而且通常使用应用的非常普遍的String类型。我们还可以利用String类提供的方法将一个String对象转化为char[],或者用char[]为参数构造一个Stirng对象。

对于定长度的SQL数据类型CHAR(n),当从数据库管理系统中获得的结果集提取该类型的数据时,JDBC会为其构造一个长度为n的String对象来代表他,如果实际的字符个数不足’n’,系统会自动为String对象补上空格。当向数据库管理系统写入的数据类型应该是CHAR(n)时,JDBC也会将该String对象的末尾补上相应数量的空格。

一般情况下,CHAR, VARCHAR, LONGVARCHAR和String之间可以无差错的进行转换。但非常值得注意的是LONGVARCHAR,这种SQL的数据类型有时在数据库中代表的数据可能有几兆字节的大小,超过了String对象的承受范围。JDBC解决的办法是用Java的Input Stream来接受这种类型的数据[以后我们回涉及到]。Input Stream不仅支持ASCII,而且支持Unicode,我们可以根据需要进行选择。



(2) DECIMAL 和 NUMERIC



SQL的DECIMAL 和 NUMERIC通常用来表示需要一定精度的定点数。在Java的简单数据类型中,没有一种类型与之相对应。但从JDK1.1开始,Sun公司在java.math.*包中加入了一个新的类BigDecimal,该类的对象可以与DECIMAL 、NUMERIC进行转换。

另外,当从数据库管理系统中读取数据时,还可以用getString()方法来获取DECIMAL 和 NUMERIC。



(3) BINARY, VARBINARY, 和 LONGVARBINARY



在编程时无须精确区分这三种SQL数据类型,JDBC将他们统一影射为byte[]。其中LONGVARBINARY和LONGVARCHAR相似,可以代表几兆字节的数据,超出数组的承受范围。解决的办法依然是用Input Stream来接受数据。



(4) BIT



代表一个二进制位的BIT类型被JDBC影射为boolean型。



(5) TINYINT, SMALLINT, INTEGER, 和 BIGINT



SQL语言的TINYINT, SMALLINT, INTEGER, 和 BIGINT分别代表8位、16位、32位、64位的数据。他们分别被影射为Java的byte, short, int, 和 long



(6) REAL, FLOAT, 和 DOUBLE



SQL定义了REAL, FLOAT, DOUBLE来支持浮点数。JDBC将REAL影射到Java的float,将FLOAT,DOUBLE影射到java的double。



(7) DATE, TIME, 和 TIMESTAMP



SQL定义了三种和日期相关的数据类型。 DATE代表年、月、日,TIME代表时、分、秒,TIMESTAMP结合了DATE和TIME的全部信息,而且增加了更加精确的时间计量单位。

在java的标准类库中,java.util.*包中的Date类用来表示日期和时间。但是该类和SQL中的DATE, TIME, 和 TIMESTAMP直接影射关系并不清晰。并且,该类也不支持TIMESTAMP的精确时间计量单位。因此,Sun公司在java.sql.*中为java.util.Date增加了三个子类:java.sql.Date,java.sql.Time ,java.sql.Timestamp,分别与SQL中的三个日期数据类型相对应。



总之,关于SQL与JAVA之见数据类型的转化,还有很多细节方面的东西,这里就不一一介绍了,有需要的朋友自己可以去查一下相关文档。这里给大家介绍一个我常去的网站:

http://java.sun.com/docs/books/tutorial/jdbc。
posted on 2005-10-27 12:52 rkind 阅读(303) 评论(0)  编辑  收藏 所属分类: JAVA基础&数据库

只有注册用户登录后才能发表评论。


网站导航: