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