对使用泛型和元数据,做一个通用的JDBC增、删、查、改操作,急需!
要源码,有分析更好!

解决方案 »

  1.   

    欢迎来到js世界,没有泛型和元数据的世界~
    当然也没有odbc jdbc
      

  2.   

    public abstract class SupperDAOImpl<T> {
    private static Connection conn = DBUtil.getConnection(); public void delete(long id) {
    StringBuffer deleteSql = new StringBuffer();
    deleteSql.append("delete from ").append(getTableName()).append(" where id=").append(id);
    try {
    PreparedStatement preparedStatement = conn.prepareStatement(deleteSql.toString());
    preparedStatement.execute();
    preparedStatement.close();
    } catch (SQLException e) {
    e.printStackTrace();
    }
    } public abstract String getTableName(); public abstract Class getParamClass(); public List<T> getList() {
    String querySql = "select * from " + getTableName();
    List list = new ArrayList();
    try {
    PreparedStatement preparedStatement = conn.prepareStatement(querySql);
    ResultSet resultSet = preparedStatement.executeQuery();
    ResultSetMetaData metaData = resultSet.getMetaData();
    Object object = null;
    Field[] fields = getParamClass().getDeclaredFields();
    while (resultSet.next()) {
    object = getParamClass().newInstance();
    for (int i = 0; i < fields.length; i++) {
    fields[i].setAccessible(true);
    fields[i].set(object, resultSet.getObject(fields[i].getName()));
    }
    list.add(object);
    }
    /* 
    int columnCount = metaData.getColumnCount(); //获得查询的列数个数
    while (resultSet.next()) {
    object = getParamClass().newInstance();//根据String型的类名,得到一个Object
    for (int i = 1; i <= columnCount; i++) { //循环设置该类的set方法的相关属性
    String methodName = StringUtil.setMethodSetName(metaData.getColumnName(i));
    Method method = getParamClass().getMethod(methodName, Object.class);
    method.invoke(object, resultSet.getObject(metaData.getColumnName(i)));
    }
    list.add(object); //增加到List中
    }*/
    resultSet.close();
    } catch (SQLException ex) {
    ex.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InstantiationException e) {
    e.printStackTrace();
    }/*catch (InvocationTargetException e) {
    e.printStackTrace();
    }catch (NoSuchMethodException e) {
    e.printStackTrace();
    } */
    return list;
    } public void update(Object bean) {
    Map<String, Object> fieldMap = getFieldMap(bean);
    String id = getPrimarykeyName();
    StringBuffer updateSql = new StringBuffer();
    updateSql.append("update ").append(getTableName()).append(" set ");
    Set<Entry<String, Object>> set = fieldMap.entrySet();
    Iterator iterator = set.iterator();
    while (iterator.hasNext()) {
    Entry<String, Object> entry = (Entry<String, Object>) iterator.next();
    if (!iterator.hasNext()) {
    updateSql.append(entry.getKey()).append("=? ").append("where ").append(id).append("=?");
    } else if (!entry.getKey().equalsIgnoreCase(id)) {
    updateSql.append(entry.getKey()).append("=?,");
    } else if (entry.getKey().equalsIgnoreCase(id)) {
    id = entry.getKey();
    }
    }
    iterator = set.iterator();
    int j = 1;
    try {
    PreparedStatement preparedStatement = conn.prepareStatement(updateSql.toString());
    while (iterator.hasNext()) {
    Entry<String, Object> entry = (Entry<String, Object>) iterator.next();
    if (!entry.getKey().equalsIgnoreCase(id)) {
    preparedStatement.setObject(j++, entry.getValue());
    }
    }
    preparedStatement.setObject(j, fieldMap.get(id));
    preparedStatement.execute();
    preparedStatement.close();
    } catch (SQLException e) {
    e.printStackTrace();
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    }
    } @SuppressWarnings("unchecked")
    private Map<String, Object> getFieldMap(Object bean) {
    Class c = bean.getClass();
    Field[] fields = c.getDeclaredFields();
    Map<String, Object> fieldMap = new TreeMap<String, Object>();
    for (int i = 0; i < fields.length; i++) {
    String fieldName = fields[i].getName();
    try {
    fieldMap.put(fieldName, c.getMethod(StringUtil.getMethodGetName(fieldName)).invoke(bean));
    } catch (IllegalArgumentException e) {
    e.printStackTrace();
    } catch (SecurityException e) {
    e.printStackTrace();
    } catch (IllegalAccessException e) {
    e.printStackTrace();
    } catch (InvocationTargetException e) {
    e.printStackTrace();
    } catch (NoSuchMethodException e) {
    e.printStackTrace();
    }
    }
    return fieldMap;
    } private String getPrimarykeyName() {
    String primarykeyNam = null;
    try {
    PreparedStatement preparedStatement = conn
    .prepareStatement("select * from user_cons_columns where constraint_name=(select constraint_name from user_constraints where table_name = 'STUDENT' and constraint_type ='P')");
    ResultSet resultSet = preparedStatement.executeQuery();
    if (resultSet.next()) {
    primarykeyNam = resultSet.getString(4);
    }
    } catch (SQLException e) {
    e.printStackTrace();
    }
    return primarykeyNam;
    }}