数据库元数据(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. 批量更新list<string,string>

    public void UpdateList(List<MysqlModule.Model.pro_premanifest> modelList) { List<MySqlParam ...

  2. msf客户端渗透(七):跳板、post模块、自动运行脚本

    跳板 假设有这样一个场景,有一个局域网内网网关是1.1.1.1,局域网里的主机1是kali,它经过一个防火墙连接到公网,主机2和主机3在另一个内网网关为2.1.1.1的局域网,由于防火墙做了设置,只有 ...

  3. Redis 总结

    Redis官网下载地址: https://redis.io/ Redis 客户端可视化:https://redisdesktop.com/download 一.Redis 是什么? 1.key-val ...

  4. computed

    Vue.js在模板表达式中限制了,绑定表达式最多只能有一条表达式,但某些数据需要一条以上的表达式运算实现,此时就可以将此数据放在计算属性(computed)当中.   Vuejs中关于computed ...

  5. 98. Validate Binary Search Tree (Tree; DFS)

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  6. Intent Activity跳转 传递数据 Bundle

    1.普通跳转: Intent intent=new Intent(); intent.setClass(MainActivity.this,NewActivity.class); //新建一个Inte ...

  7. Codeforces Beta Round #46 (Div. 2)

    Codeforces Beta Round #46 (Div. 2) http://codeforces.com/contest/49 A #include<bits/stdc++.h> ...

  8. Centos7安装Wkhtmltopdf -- nodejs将html转pdf

    安装wkhtmltopdf wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.1 ...

  9. linux命令学习之:ifup/ifdown

    ifup命令网络配置 ifup命令用于激活指定的网络接口.ifdown命令用于禁用指定的网络接口. 实时地手动修改一些网络接口参数,可以利用ifconfig来实现,如果是要直接以配置文件,亦即是在 / ...

  10. linux-ubuntu 安装配置Redis

    >wget http://download.redis.io/releases/redis-3.2.6.tar.gz #下载redis源码包 >tar -zxvf redis-3.2.6. ...