数据库元数据(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. 《xss跨站脚本剖析与防御》实验笔记

    1.书籍<xss跨站脚本剖析与防御>上介绍的xss测试代码 <img src="javascrpt:alert('xss');">, <table b ...

  2. StringBuffer类和String类(原文地址 : http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html)

    StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBuffer在进行字符串处理时,不生成新的对象,在内存 ...

  3. 关于C/s结构 本地目录的思考

    对于一般客户而言,程序使用时,查看本地目录下的对应内容. 如果有则正常使用.实际上相当于缓存,加快程序执行速度. 如果缓存里没有东西,比如被删除了,那么就在数据库中查找.然后生成缓存. 这样的好处,是 ...

  4. PHP 用正则获取URL的根域名

    function GetUrlRoot($url){ preg_match('/[\w][\w-]*\.(?:com\.cn|com|cn|co|net|org|gov|cc|biz|info)(\/ ...

  5. SQL Server 2008 R2官方中文版下载

    SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本. 在现今数据的世界里,公司要获得成功和不断发展,他们 ...

  6. STL::array

    1,array(仅c++11支持) 固定大小的容器,不能进行扩展和缩小(vector 可以),预分配的大小只是一个参数,在编译时确定真正的大小. Iterator 有下面几种: begin: [ ) ...

  7. pta l2-20(功夫传人)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805059118809088 题意:给定n个人,编号0-n-1, ...

  8. 第二章 向量(d5)有序向量:插值查找

  9. 802.1X技术介绍

    1.802.1X IEEE802 LAN/WAN委员会为解决无线局域网网络安全问题,提出了802.1X协议.后来,802.1X协议作为局域网端口的一个普通接入控制机制在以太网中被广泛应用,主要解决以太 ...

  10. mysql学习1:数据类型:数字型,日期和时间,字符串类型(总结)

    mysql数据类型:数字型,日期和时间,字符串类型 摘要 MySQL中定义数据字段的类型对数据库的优化是非常重要的: MySQL支持多种类型,大致可以分为三类,如下. 数字类型 整数:tinyint. ...