JDBC 学习复习10 编写自己的JDBC框架
首先万分感谢狼哥 孤傲苍狼 博客,整个jdbc学习的博客资料 链接为http://www.cnblogs.com/xdp-gacl/p/4006830.html
详细代码见狼哥博客,列出我学习过程中遇到的问题吧。
public static Object query(String sql, Object[] params, ResultSetHandler rsh)
throws SQLException {
Connection conn = null;
PreparedStatement ppst = null;
ResultSet rs = null;
try {
conn = getConnection();
ppst = conn.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ppst.setObject(i + 1, params[i]);
}
rs = ppst.executeQuery();
return rsh.handler(rs);//关于这个策略模式的学习,详见设计模式吧,熟悉这种写法,在公司的工作过程中,类似写法遇到过,有用!
} finally {
release(conn, ppst, rs);
}
}
后面这么调用的
public User queryByID(int id) throws SQLException{
String sql = "select * from user where uid=?";
return (User) JDBCUtil.query(sql,new Object[]{id}, new BeanHandler(User.class));
}
然后BeanHandler实际上就是ResultSetHandler 借口的实现类,主要目的就是把查询结果,放到通过发射获取到的JavaBean里面,也就从数据库里面加载到JVM内存里了
package dbex.domain;
import java.lang.reflect.Field;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
public class BeanHandler implements ResultSetHandler {
private Class<?> clazz;
public BeanHandler(Class<?> clazz) {
this.clazz = clazz;
}
public Object handler(ResultSet rs) {
Object bean=null;
try {
if (!rs.next()) {//判空 直接返回null
return bean;
}
// 把resultset对象中的列数据放入到Bean对应的属性中去
bean = clazz.newInstance();
ResultSetMetaData rsm = rs.getMetaData();
int len = rsm.getColumnCount();
for (int i = 0; i < len; i++) {
String name = rsm.getColumnName(i + 1);
Object data = rs.getObject(i+1);
Field field = clazz.getDeclaredField(name);
field.setAccessible(true);
String type = rsm.getColumnTypeName(i+1);
// if("INTEGER".equals(type)){
// System.out.println(type);
field.set(bean,data.toString());
// }else if("String".equalsIgnoreCase(type)){
// field.set(bean,(String)data);
// System.out.println(type);
// }else{
// field.set(bean, data);
// }
}
} catch (Exception e) {
e.printStackTrace();
}
return bean;
}
}
总结下:策略模式 ,java反射
JDBC 学习复习10 编写自己的JDBC框架的更多相关文章
- JDBC 学习复习8 C3P0数据源使用
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. c3p0与dbcp区别 dbcp ...
- JDBC 学习笔记(四)—— 自定义JDBC框架+Apache—DBUtils框架+事务管理+操作多表
本文目录: 1.自定义JDBC框架 ——数据库元数据:DataBaseMetaData 2.自定义JDBC框架 ——数据库元数据:DataBaseMetaData ...
- JDBC 学习笔记(十)—— 使用 JDBC 搭建一个简易的 ORM 框架
1. 数据映射 当我们获取到 ResultSet 之后,显然这个不是我们想要的数据结构. 数据库中的每一个表,在 Java 代码中,一定会有一个类与之对应,例如: package com.gerrar ...
- JDBC 学习复习6 学习与编写数据库连接池
之前的工具类DBUtil暴露的问题 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的 ...
- JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 * 可以由Connection得到 */ 具体的应用代码: @Te ...
- 【转】JDBC学习笔记(10)——调用函数&存储过程
转自:http://www.cnblogs.com/ysw-go/ 如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个C ...
- 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法
转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...
- JDBC 学习复习7 学习 Apache 开源DBCP 数据源
DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包:comm ...
- JDBC学习笔记(10)——调用函数&存储过程
如何使用JDBC调用存储在数据库中的函数或存储过程: * 1.通过COnnection对象的prepareCall()方法创建一个CallableStatement * 对象的实例,在使用Con ...
随机推荐
- git如何获取获取子模块的代码?
答: 步骤如下: 1. git submodule init 2. git submodule update
- SurfaceView双缓冲技术引入
package com.loaderman.customviewdemo; import android.content.Context; import android.graphics.Canvas ...
- Centos7安装zabbix3.4.0以及配置和使用
一.安装ZABBIX 1.环境和软件版本 注:此次是采用的rpm包方式安装,所以服务器必须要能连接互联网通过yum方式解决依赖关系 ①系统: [root@zabbix ~]# cat /etc/red ...
- SpringMVC拦截器工作流程图
- Python - Django - 编辑作者
在作者列表页面的操作栏中加上编辑按钮 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- js 高级程序设计 第四章学习笔记
问题:怎么才能形象的理解堆栈空间? 1. 声明变量 使用 var 声明的变量会自动被添加到最接近的环境中.在函数内部,最接近的环境就是函数的局部 环境:在 with 语句中,最接近的环境是函数环境.如 ...
- python获取昨日日期
获取昨日日期oneday = datetime.timedelta(days=1) 一天 day = datetime.datetime.strptime(self.date,'%Y-%m-%d') ...
- 性能优化-Bitmap内存管理及优化
Bitmap作为重要Android应用之一,在很多时候如果应用不当,很容易造成内存溢出,那么这篇文章的目的就在于探讨Bitmap的有效运用及其优化 缓存介绍 当多次发送请求的时候,请求同一内容,为了使 ...
- 使用eclipse插件mybatis generator来自动生成实体类及映射文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE generatorConfiguratio ...
- 洛谷 题解 P1908 【逆序对】
一开始竟然妄想用\(n^2\)的算法过这题,然而这是不可能的 所以只好写归并排序来求逆序対惹 比如将下面两个区间排序 3 4 7 9 1 5 8 10 首先将右区间的\(1\)取出,放到\(r_k\) ...