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;
	}

}

  

原文地址:https://www.cnblogs.com/javabigdata/p/5631769.html