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<Object> resultSetToList(ResultSet rs, Class<? > cls) {
Method[] methods = cls.getDeclaredMethods();
int methodLength = methods.length; int index;
Map<String, Integer> map = new HashMap<String, Integer>();
// record all methods name in a HashMap, for quickly locate.
for (index = 0; index < methodLength; index++) {
map.put(methods[index].getName().toLowerCase(), index);
} ResultSetMetaData meta = null;
Object obj = null;
List<Object> list = new ArrayList<Object>(); try {
meta = rs.getMetaData();
int colCount = meta.getColumnCount();
while (rs.next()) {
obj = cls.newInstance(); for (int i = 1; i <= colCount; i++) {
String colName = meta.getColumnName(i);
String setMethodName = "set" + colName;
// System.out.println(setMethodName);
int j = map.get(setMethodName.toLowerCase()); //get index of method array
setMethodName = methods[j].getName(); Object value = rs.getObject(colName);
if(value == null){
continue;
} try {
Method setMethod = obj.getClass().getMethod(setMethodName, value.getClass());
setMethod.invoke(obj, value);
} catch (Exception e) {
System.out.println(setMethodName + " exception");
e.printStackTrace();
} }
list.add(obj);
}
} catch (InstantiationException | IllegalAccessException | SQLException e) {
e.printStackTrace();
} return list;
}




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 boolean
this. isSweet = isSweet;
}





JDK+JDBC+MySQL实例及注意事项的更多相关文章

  1. JDBC MySQL 实例之 用户管理系统

    1 Java 和 MySQL 怎么建立连接 2 通过Java怎么对数据库进行操作 package day01; import java.sql.Connection; import java.sql. ...

  2. mac在 aliyun linux ecs实例上安装 jdk tomcat mysql

    用了一个ftp 工具 把 gz rpm 等 传递到ecs 上 -- 用这个Transmit 用ssh远程登录,然后依次安装 jdk tomcat  mysql 到 /usr/local/... 设置环 ...

  3. java 访问mysql 实例

    前提条件: 1.安装eclipse,mysql.java jdk 2.安装mysql connect J  (我安装的版本是mysql connect J 5.1.39) 3.配置java环境变量 4 ...

  4. Linux 安装JDK Tomcat MySQL(使用Mac远程访问)

    阅读本文需要一定的Linux基础 一 环境 阿里云服务器: CentOS 7.4 64位(基于RedHat) 本机: macOS High Sierra 二 压缩包 JDK http://www.or ...

  5. linux 下 jdk+tomcat+mysql 的 jsp 环境搭建

    JDK 在 linux 下安装 1.          把安装文件放在 /opt 下,并执行 [root@localhost opt]# ./jdk-1_5_0_06-linux-i586.bin 并 ...

  6. 使用Inno Setup 打包jdk、mysql、tomcat、webapp等为一个exe安装包(转)

    之前一直都没涉及到打包安装方面的东西,都是另一个同事负责的,使用的工具(installshield)也比较高大上一点,可是后来他离职以后接受的同事也只能是在这个基础上做个简单的配置,然后打包,可是现在 ...

  7. 使用Inno Setup 打包jdk、mysql、tomcat、webapp等为一个exe安装包

    之前一直都没涉及到打包安装方面的东西,都是另一个同事负责的,使用的工具(installshield)也比较高大上一点,可是后来他离职以后接受的同事也只能是在这个基础上做个简单的配置,然后打包,可是现在 ...

  8. no suitable driver found for jdbc:mysql//localhost:3306/..

      出现这样的情况,一般有四种原因(网上查的): 一:连接URL格式出现了问题(Connection conn=DriverManager.getConnection("jdbc:mysql ...

  9. JDBC 程序实例小练习

    JDBC 程序实例问题 编程实现如下功能:在数据库中建立一个表,表名为student,其结构为学号.姓名.性别.年龄.英语.JavaSE程序设计.初级日语.总分,在表中输入多条记录. 学生的总分信息, ...

随机推荐

  1. [Web Worker] Introduce to Web Worker

    What is web worker for? OK, read it docs to get full details idea. Or just a quick intro to web work ...

  2. Chrome插件开发新手教程

    近期在用百词斩这个站点来学单词,感觉非常不错,就是在回想单词列表的时候仅仅有单词和意思.却没有读音.感觉非常不方便,思来思去,想到了Chrome插件能够胜任这个工作.于是小小的研究了一下. Chrom ...

  3. MFC 与Excel文件的交互操作

    假日快要结束了.带着沉重的心情写下之前关于MFC与Excel文件交互的总结. 因为VS的版本号不同可能在操作上有些差异.所以在此指明下本篇文章的project环境为VS2013,也建议大家用最新的. ...

  4. Unity5.1 新的网络引擎UNET(七) UNET 单人游戏转换为多人

     单人游戏转换为多人   孙广东   2015.7.12 本文档描写叙述将单人游戏转换为使用新的网络系统的多人游戏的步骤.这里描写叙述的过程是简化,对于一个真正的游戏事实上须要更高级别版本号的实际 ...

  5. Python—JSON数据解析

    1.安装pip pip是python的包管理工具,使用它能非常方便地安装和卸载各种python工具包 第一步:直接用浏览器访问地址:https://raw.github.com/pypa/pip/ma ...

  6. 手把手教你写带登录的NodeJS爬虫+数据展示

    其实在早之前,就做过立马理财的销售额统计,只不过是用前端js写的,需要在首页的console调试面板里粘贴一段代码执行,点击这里.主要是通过定时爬取https://www.lmlc.com/s/web ...

  7. jquery应用实例1:手风琴特效

    效果: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...

  8. visio中如何取消跨线和去掉页边距

    比较来说,写论文visio和inkscape都不可缺少. 比如visio跨线的问题,已经遇到过两次忘记了.这次截个图作为记录.其实就是在“设计”一栏里,把连接线里面的跨线显示的对勾去掉即可. *** ...

  9. (转)Django学习之 第一章:Django介绍

    Django: Python编程Web框架 如果你上djangoproject.com你会发现对Django的如下解释: “Django is a high-level Python Web fram ...

  10. 有关DevExpress 安装后vs工具箱不显示图标的错误

    在https://www.devexpress.com/Support/Center/Question/Details/T214296/missing-icons-from-toolbox找到解决方法 ...