JDBC学习笔记(五) 
Thinkersky[Email:[email protected]] 
◆  爸爸今天打了我两次,第一次是因为看见了我手里两分的成绩单,第二次是因为成绩单是他小时候的。  
◆  悲剧好比是我不小心切掉了自己的小手指;喜剧好比是你不小心掉进了下水道。  
◆  下面,我将公布史密斯先生的遗嘱,在公布遗嘱之前,我想满怀诚意地问一句,史密斯夫人,您是否愿意接受我的求婚?  
◆  我不明白,你为什么放着值钱的东西不偷,却偏偏去偷那些不值钱的东西呢?   
   小偷:够啦!就为这个,老婆都数落我一个多月啦。 
  
恩,这是今天抽空在公司论坛上看到的几条搞笑短信,拿出来与大家一起分享。 
  
今天比较忙,学的东西相对比较少,只是稍微复习了一下JAVA与SQL之间数据类型的转化。想必大家都知道,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。  
 
  |