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. 关于synchronized与volatile的一点认识

    贪婪是一种原罪,不要再追求性能的路上离正确越来越远. 内存模型 java内存模型 pageId=27903261#%E5%85%B3%E4%BA%8Esynchronized%E4%B8%8Evola ...

  2. reactjs simple text editor

    import React, { Component } from 'react' import PubSub from 'pubsub' import GlobalVars from 'globalV ...

  3. tapestry3创建自己定义组件

    两种方法创建自己定义标签: 一.通过AbstractComponent父类渲染,此种方法直接在java类中编写页面脚本.然后输出. 1.编写java类com/ailk/ech/ecop/view/te ...

  4. springmvc+spring+jpa(hibernate)+redis+maven配置

    废话不多少 项目结构 pom.xml配置例如以下 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=& ...

  5. oracle手工生成AWR报告方法

    AWR(Automatic Workload Repository)报告是我们进行日常数据库性能评定.问题SQL发现的重要手段.熟练掌握AWR报告,是做好开发.运维DBA工作的重要基本功. AWR报告 ...

  6. springmvc-mvc:resource标签使用

    转自:http://www.cnblogs.com/gzulmc/p/6746174.html <!-- 配置静态资源 --><mvc:resources location=&quo ...

  7. Sort和UnSort的小技巧

    Sort和UnSort的小技巧: 记录sortidx,对sortidx再从小到大排序就可以得到用于还原的unsortidx. 对于序列A: sort_idx = np.argsort(A) un_so ...

  8. 33.Qt模型与视图

    #include "mainwindow.h" #include <QApplication> #include <QAbstractItemModel> ...

  9. python之--初始面向对象

    阅读目录 楔子 面向过程vs面向对象 初识面向对象 类的相关知识 对象的相关知识 对象之间的交互 类命名空间与对象.实例的命名空间 类的组合用法 初识面向对象小结 面向对象的三大特性 继承 多态 封装 ...

  10. P3376 【模板】网络最大流(70)

    题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点序号.汇点序号. 接下来M行每行 ...