数据库元数据(MetaData):数据库存储结构定义信息 (库、表、列 定义信息)

ParameterMetaData 参数元数据

---- 获得预编译SQL语句中 ? 信息

getParameterCount()  参数个数 ---- ? 个数

getParameterType(int param)  ----- 参数类型

getParameterTypeName(int param)  --- 参数类型名称 mysql支持的不是很好

获得类型时: java.sql.SQLException: Parameter metadata not available for the given statement

3、ResultSetMetaData 结果集元数据 ---- 获得结果集列名称、数量、类型

getColumnCount() 返回resultset对象的列数

getColumnName(int column)  获得指定列的名称

getColumnTypeName(int column) 获得指定列的类型

自定义jdbc框架,涉及知识 jdbc元数据,内省技术,泛型

/**
* 自定义JDBC框架
*/
public class JDBCFramework {
/**
* 通用select方法
*/
public static <T> T query(String sql, MyResultSetHandler<T> handler,
Object... args) {
T obj = null; Connection conn = null;
PreparedStatement stmt = null;
ResultSet rs = null; try {
conn = JDBCUtils.getConnection();
stmt = conn.prepareStatement(sql); // 设置参数
ParameterMetaData parameterMetaData = stmt.getParameterMetaData();
int count = parameterMetaData.getParameterCount();
for (int i = 1; i <= count; i++) {
stmt.setObject(i, args[i - 1]);
} rs = stmt.executeQuery();
obj = handler.handle(rs); } catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
return obj;
} /**
* 通过insert update delete方法
*
* @param sql
* 预编译需要SQL
* @param args
* 根据SQL中? 准备参数
*/
public static void update(String sql, Object... args) {
Connection conn = null;
PreparedStatement stmt = null; try {
conn = JDBCUtils.getConnection(); stmt = conn.prepareStatement(sql);
// 设置参数 --- 根据?设置参数
ParameterMetaData parameterMetaData = stmt.getParameterMetaData();
int count = parameterMetaData.getParameterCount();
for (int i = 1; i <= count; i++) {
stmt.setObject(i, args[i - 1]);
} stmt.executeUpdate(); } catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.release(stmt, conn);
}
} } public interface MyResultSetHandler<T> {
// 将rs中数据封装对象
public T handle(ResultSet rs);
} /**
* 通用handler,处理将所有rs第一行数据 转换指定 JavaBean对象
*/
public class MyBeanHandler<T> implements MyResultSetHandler<T> { private Class<T> domainClass; public MyBeanHandler(Class<T> domainClass) {
this.domainClass = domainClass;
} @Override
public T handle(ResultSet rs) {
try {
ResultSetMetaData resultSetMetaData = rs.getMetaData();// 结果集元数据
int count = resultSetMetaData.getColumnCount(); BeanInfo beanInfo = Introspector.getBeanInfo(domainClass);
PropertyDescriptor[] descriptors = beanInfo
.getPropertyDescriptors();
if (rs.next()) {
T t = domainClass.newInstance();
for (int i = 1; i <= count; i++) {
String columnName = resultSetMetaData.getColumnName(i);
// 获得列名 --- 需要去查找匹配属性
for (PropertyDescriptor propertyDescriptor : descriptors) {
if (columnName.equals(propertyDescriptor.getName())) {
// 列名 存在 同名属性 ---- 列值 存到属性里
Method writeMethod = propertyDescriptor
.getWriteMethod(); // setName setMoney
writeMethod.invoke(t, rs.getObject(columnName));
}
}
}
return t;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
} }

  

jdbc元数据 以及自己动手写一个curd框架的更多相关文章

  1. 动手写一个简单版的谷歌TPU-矩阵乘法和卷积

    谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU.计划实现到行为 ...

  2. 死磕 java同步系列之自己动手写一个锁Lock

    问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...

  3. 动手写一个简单版的谷歌TPU-指令集

    系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...

  4. 死磕 java线程系列之自己动手写一个线程池

    欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...

  5. 自己动手写一个服务网关-java

    自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...

  6. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  7. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  8. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  9. 自己动手写PHP MVC框架

    自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...

随机推荐

  1. 创建java项目思路

    一.搭建 1.创建搭建项目 2.创建分层 二.理解项目(理清总体思路) 1.是否有共同部分(过滤或者拦截) 常用量 (static) 2.搭建单表基本增(是否需要返回值)   删(条件)    查(条 ...

  2. 安装FP

    一.安装Oracle 11.2 64-bit数据库 1.安装数据库软件并将SEINESCM数据库还原到服务器上, 2.配置监听和TNS信息 二.安装数据库32位客户端(为SSIS配套使用).安装ORA ...

  3. CentOS 7 单用户模式+救援模式

    CentOS 7 单用户模式+救援模式 CentOS 7 单用户模式+救援模式.有时候大家可能会忘记自己的root密码,或者错误(命令输入错误,命令位置输入有误等)编辑了一个/etc目录下的核心文件导 ...

  4. LeetCode第20题

    LeetCode20题不多说上代码 public boolean isValid(String s){ Stack<Character> stack = new Stack<Char ...

  5. H5外部浏览器直接调起微信——通过url协议 weixin:// 判断是否安装微信及启动微信

    前言: h5分享到微信,h5使用微信支付这些功能,都需要先判断是否安装微信客户端,如果已安装就启动微信,如果没有安装微信,就提示用户前去安装. 我们可以通过访问微信提供的URL协议(weixin:// ...

  6. 【Android端】代码打包成jar包/aar形式

    Android端代码打包成jar包和aar形式: 首先,jar包的形式和aar形式有什么区别? 1.打包之后生成的文件地址: *.jar:库/build/intermediates/bundles/d ...

  7. c#: List.Sort()实现稳固排序(stable sort)

    1. 源起: KV 7.0加入列表管理功能,处理排序问题时,对空列表执行按大小.日期.长度排序发现,其中次序会发生改变,令人纳闷. 没天理呀,不应该啊!List.Sort()方法,它为什么? 对此问题 ...

  8. 阿里云视频直播API签名机制源码

    阿里云视频直播API签名机制源码 本文展示:通过代码实现下阿里视频直播签名处理规则 阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail ...

  9. 大数据分析界的“神兽”Apache Kylin有多牛?【转】

    本文作者:李栋,来自Kyligence公司,也是Apache Kylin Committer & PMC member,在加入Kyligence之前曾就职于eBay.微软. 1.Apache ...

  10. elasticsearch查询语句总结

    query 和  filter 的区别请看:https://www.cnblogs.com/bainianminguo/articles/10396956.html Filter DSL term 过 ...