jdbc元数据 以及自己动手写一个curd框架
数据库元数据(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框架的更多相关文章
- 动手写一个简单版的谷歌TPU-矩阵乘法和卷积
谷歌TPU是一个设计良好的矩阵计算加速单元,可以很好的加速神经网络的计算.本系列文章将利用公开的TPU V1相关资料,对其进行一定的简化.推测和修改,来实际编写一个简单版本的谷歌TPU.计划实现到行为 ...
- 死磕 java同步系列之自己动手写一个锁Lock
问题 (1)自己动手写一个锁需要哪些知识? (2)自己动手写一个锁到底有多简单? (3)自己能不能写出来一个完美的锁? 简介 本篇文章的目标一是自己动手写一个锁,这个锁的功能很简单,能进行正常的加锁. ...
- 动手写一个简单版的谷歌TPU-指令集
系列目录 谷歌TPU概述和简化 基本单元-矩阵乘法阵列 基本单元-归一化和池化(待发布) TPU中的指令集 SimpleTPU实例: (计划中) 拓展 TPU的边界(规划中) 重新审视深度神经网络中的 ...
- 死磕 java线程系列之自己动手写一个线程池
欢迎关注我的公众号"彤哥读源码",查看更多源码系列文章, 与彤哥一起畅游源码的海洋. (手机横屏看源码更方便) 问题 (1)自己动手写一个线程池需要考虑哪些因素? (2)自己动手写 ...
- 自己动手写一个服务网关-java
自己动手写一个服务网关 原文链接:https://www.cnblogs.com/bigben0123/p/9252444.html 引言 什么是网关?为什么需要使用网关? 如图所示,在不使用网关的情 ...
- 动手写一个简单的Web框架(模板渲染)
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
- 自己动手写PHP MVC框架
自己动手写PHP MVC框架 来自:yuansir-web.com / yuansir@live.cn 代码下载: https://github.com/yuansir/tiny-php-framew ...
随机推荐
- javascript中所有函数的参数都是按值传递的
[javascript中所有函数的参数都是按值传递的] 参考:http://www.jb51.net/article/89297.htm
- Ubuntu 14.04 LTS 安装Docker(转)
转自:https://www.cnblogs.com/leolztang/p/5097278.html Docker官方是有很详细的安装文档(https://docs.docker.com/engin ...
- CentOS 下环境变量
1. 显示环境变量HOME(不要把一个#号输进去了,#代表用户名) # echo #HOME /home/redbooks 2. 设置一个新的环境变量hello # export HELLO=&quo ...
- TOJ 3589 likaer的最长点距
传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=3589 时间限制(普通/Jav a) ...
- DBVIS工具 管理数据库链接
- RxJS之catchError
Catches errors on the observable to be handled by returning a new observable or throwing an error. 返 ...
- vue 返回上一页后,上一页由参数渲染的内容无法显示
思路1:将参数传递给第二个页面后,返回上一页时,再讲参数传回第一页(此方法适用于层级少的)(亲测有效) 思路2:将参数放到全局变量中(还未尝试过)
- f5健康检查
1.1)一般pool的健康检查 Pool member 2)检查member的多个端口,若有任意一个端口down,则切换到另一member Pool的健康检查不填,pool member的健康检查填多 ...
- SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用
1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1 ...
- python之格式化输出
字符串格式化有两种方式,%和format 先介绍下%号的方法 #%s的语法结构,叫做占位符,就是先占一个位置,然后我们用真实的要显示的数据替换占位符即可#最简单的用法就是下面的方式,其实%s还有其他的 ...