zoukankan      html  css  js  c++  java
  • 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;
    	}
    
    }
    

      

  • 相关阅读:
    C# 保存base64格式图片
    C# 日期比较
    Socket的使用
    地质演变完整事记
    计算机实用的使用技巧
    ebook 电子书项目
    ppt演讲者模式
    IT行业三大定律
    史前生命
    Oracle DataGuard发生归档丢失增量备份恢复备库
  • 原文地址:https://www.cnblogs.com/javabigdata/p/5631769.html
Copyright © 2011-2022 走看看