开发环境 OS: Win8.1 x64 JDK: 1.8 SE DB: MySQL 5.5 Lib: mysql-connector-java.jar
1. MySQL数据库数据类型与JDK之间的特殊对应关系
下表只列举几个特殊的值类型对照,其余的又需要可以参考MySQL官网的值类型说明(http://dev.mysql.com/doc/refman/5.1/zh/index.html)以及JDK的相关资料。
| MySQL | JDK |
| tinyint(1) | boolean |
| int unsigined | long |
| datetime | java.sql.Timestamp |
| varchar | String |
2. 采用JDK的反射机制将JDBC ResultSet的自动加载到Bean类
首先要确保MySQL中的列名和 JavaBean类的属性名是一一对应的,然后就可以使用反射机制调用setter对Bean进行赋值,关键代码:
/** * Using reflection to storage the result from database into Bean class. * */ public static List
mysql> describe cake; +--------------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------------+---------------------+------+-----+---------+-------+ | name | varchar(20) | NO | PRI | NULL | | | serialNumber | int(10) unsigned | YES | | NULL | | | buildDate | datetime | YES | | NULL | | | isSweet | tinyint(1) unsigned | YES | | NULL | | +--------------+---------------------+------+-----+---------+-------+2)初始化的数据:
mysql> select * from cake; +--------+--------------+---------------------+---------+ | name | serialNumber | buildDate | isSweet | +--------+--------------+---------------------+---------+ | Danisa | 2021344 | 2013-11-19 10:20:00 | 1 | | Orion | 2004720 | 2014-06-29 22:00:00 | 0 | +--------+--------------+---------------------+---------+
4.2 Bean类设计 1)Cake类的属性:
private String name; private long serialNumber; private Timestamp buildDate; private boolean isSweet;
2)Bean中特殊值类型变量的Setter的设计细节: JDK整形类型的setter参数需用java.lang中的类,如long对应java.lang.Long, int对应java.lang.Integer。 这样的动机是,可以使Bean的属性符合2中叙述的resultSetToList的形参Class< > cls。 本例中,ResultSet取出的MySql的int unsigned,会自动在内存中转化为Long类型,故setter需要使用Long;
public void setSerialNumber(Long /*long*/ serialNumber) { //Type was java.lang.Long but not 'long'.
this. serialNumber = serialNumber;
} 从MySql取出的tinyint(1)存为Boolean,故Bean类的setter形参是Boolean类型。 此外,属性isSweet在eclipse中自动生成的setter名为setSweet,在反射赋值时,就会出现找不到方法的异常,因为反射赋值搜索的方法是'setissweet',所以要把自动生成的setter改名。
public void /*setSweet*/setIsSweet( /*boolean*/Boolean isSweet) { // Type was java.lang.Boolean but not boolean
this. isSweet = isSweet;
}