数据库元数据(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;
} }

  

最新文章

  1. while语句(1)
  2. zk系列-zookeeper概述
  3. 经典排序算法---冒泡排序(Bubble Sort)
  4. 为Dapper编写一个类似于EF的Map配置类
  5. SVN 之 去掉SVN管理标记
  6. Java中如何使用Redis做缓存
  7. 显示Mac电脑下的隐藏文件
  8. android小知识之注释模板(转载)
  9. Android中View绘制优化之一---- 优化布局层次
  10. MVC 和 MVVM
  11. 【原创】Octovis在Ubuntu16.04下运行出现core dump的解决方案
  12. windows 查看端口被哪个程序占用
  13. PADS Layout VX.2.3 制作PCB封装(Decal)时,导入DXF文件
  14. python学习笔记(1)python中的注释和安装python
  15. CDN拾遗
  16. CodeForce VKcup A
  17. Linux 安装erlang
  18. MT【222】几道自招面试真题
  19. 先加载js 后载控件
  20. mysql 导出表,导出数据 命令

热门文章

  1. HTML图片热区map area的用法(转)
  2. sqlserver 查看当前连接数
  3. spring xml头文件xmlns和xsi的意思
  4. Angular之输入输出属性
  5. HDU 4027 Can you answer these queries? (线段树区间修改查询)
  6. iOS 编译部署路径
  7. Delphi:Exception输出堆栈信息
  8. war包内更新文件
  9. [leetcode]101. Symmetric Tree对称树
  10. dup