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