您好,欢迎访问一九零五行业门户网

JDK+JDBC+MySQL实例及注意事项_MySQL

by qx.zhong
hangzhou 29 jun 2014
开发环境
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
在mysql中,tinyint(1)是bool, boolean的同义词带符号的范围是-128到127。无符号的范围是0到255。boolean非zero为真,zero为假。
int unsigined值的范围超出了jdk的int类型(jdk中的整形类型都是带符号的)的最大取值范围,所以需要用long装载。
2. 采用jdk的反射机制将jdbc resultset的自动加载到bean类
首先要确保mysql中的列名和javabean类的属性名是一一对应的,然后就可以使用反射机制调用setter对bean进行赋值,关键代码:
/** *using reflection to storage the result from database into bean class. * */ public static list resultsettolist(resultset rs, class> cls) { method[] methods = cls.getdeclaredmethods(); int methodlength = methods.length; int index; map map = new hashmap(); // record all methods name in a hashmap, for quickly locate. for (index = 0; index list = new arraylist(); try { meta = rs.getmetadata(); int colcount = meta.getcolumncount(); while (rs.next()) { obj = cls.newinstance(); for (int i = 1; i
3. 其他说明
数据库的连接于释放是jdbc中最耗费时间及系统开销的,因此推荐采用数据库连接池处理。一个池设置最小连接数和最大连接数。
最小连接数是连接池启动时默认的初始化建立的连接,建多了会影响代码的启动时间,建立少了会出现不够用的现象(虽然实际运行中,连接池检测到需求数量大于最小连接数时,会自动新增连接)。
故连接池的最小连接数是需要根据项目实际情况斟酌的。
4. 示例项目
4.1 数据库表设计
1)设计一个cake表,详情如下:
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 booleanthis. issweet = issweet; }
其它类似信息

推荐信息