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. [Tailwind] Extending Tailwind with Responsive Custom Utility Classes

    You are able to extend the custom css with hover, focus, group-hover, responsive variants class in t ...

  2. jQuery Mobile页面跳转切换的几种方式

    jQuery Mobile在移动开发中越来越受到欢迎. 而他的各个版本号也在持续不断的更新中.相同的我也非常喜欢它,它加快了我们开发HTML5的速度. 同一时候又具备jQuery一样的操作方法. 学起 ...

  3. esql开发总结

    1 定义或者声明方法 int method(char *arg1,char* arg2...);   实现方法 int method(char *arg1,char* arg2...)     EXE ...

  4. 0x16 Trie

    这章刷的真带劲 嘿嘿 裸题 #include<cstdio> #include<iostream> #include<cstring> #include<cs ...

  5. 随机森林算法demo python spark

    关键参数 最重要的,常常需要调试以提高算法效果的有两个参数:numTrees,maxDepth. numTrees(决策树的个数):增加决策树的个数会降低预测结果的方差,这样在测试时会有更高的accu ...

  6. 深度理解Jquery 中 scrollTop() 方法

    这是工作遇到scrollTop() 方法.为了强化自己,把它记录在博客园当中. 下面就开始scrollTop 用法讲解: scrollTop() 定义和用法 scrollTop() 方法设置或返回被选 ...

  7. 11.MATLAB基本编程

    概述: 1 脚本M文件 clear all; %设置精度 format long; %定义变量 n= s= %循环 :n s=s+/^i; end s format short; 2 函数M文件 fu ...

  8. 使用右键打开Visual Code

    Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\Visual Code]@="Edit with Visual ...

  9. Python—使用xml.sax解析xml文件

    什么是sax? SAX是一种基于事件驱动的API. 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器. 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件; 而事件处 ...

  10. Spring《一》

    1.支持的注入方式 构建注入,set注入 2.bean属性 id.name.class.singleton(true.false).depends-on="date"(初始化依赖) ...