java. sql. ResultSetMetaData 인터페이스 사용 (결과 집합 메타 데이터)

5826 단어 codeJava
intro
  • 결과 집합의 메타 데이터 정보 (이후 반사, 범 형 과 결합 하여 일반적인 방법 을 작성 하고 코드 중복 을 줄 여야 합 니 다): columnCount 결과 집합의 열 수 columnName 열의 이름 / / select columnName as columnLabel... columnLabel 열의 다른 이름 (label) columnClassName 자바 에 대응 하 는 종류 (협조 가능 Class.forName(String className) 가 져 오기 Class형식의 반환 값) columnType 데이터베이스 에 열 거 된 형식 (수치 번호) columnTypeName 데이터베이스 에 열 거 된 형식 이름 columnDisplaySize 열 크기
  • ResultSet - > ResultSetMetaData 결과 집 ResultSet 과 결과 집 메타 데이터 ResultSetMetaData 는 JDBC 표준 중의 인터페이스 | 표준 이다.java.sql.ResultSet java.sql.ResultSetMetaData
  • metaData, 메타 데이터.resultSet 인용 을 통 해 메타 데이터 정 보 를 얻 을 수 있 습 니 다. ResultSetMetaData resultSet.getMetaData() 그리고 metaData 에 따라 원 하 는 데 이 터 를 얻 을 수 있 습 니 다.

  • API
    // getCon
    String sql = "select username as 'U', password from user";
    PreparedStatement pstmt = con.prepareStatement(sql);
    ResultSet rs = pstmt.executeQuery();
    
    ResultSetMetaData metaData = rs.getMetaData();
    System.out.println(metaData.toString());
    
    int columnCount = metaData.getColumnCount();
    for (int i = 1; i <= columnCount; i++) {
        String columnName = metaData.getColumnName(i);
        String columnLabel = metaData.getColumnLabel(i);
        String columnClassName = metaData.getColumnClassName(i);
        int columnType = metaData.getColumnType(i);
        String columnTypeName = metaData.getColumnTypeName(i);
        int columnDisplaySize = metaData.getColumnDisplaySize(i);
        System.out.printf("%s %s %s %s %s %s %s
    ", i, columnName, columnLabel, columnClassName, columnType, columnTypeName, columnDisplaySize); }

    출력:
    com.mysql.jdbc.ResultSetMetaData@41906a77 - Field level information: 
    	com.mysql.jdbc.Field@4b9af9a9[catalog=easyui,tableName=user,originalTableName=user,columnName=U,originalColumnName=username,mysqlType=253(FIELD_TYPE_VAR_STRING),flags=, charsetIndex=33, charsetName=UTF-8]
    	com.mysql.jdbc.Field@5387f9e0[catalog=easyui,tableName=user,originalTableName=user,columnName=password,originalColumnName=password,mysqlType=253(FIELD_TYPE_VAR_STRING),flags=, charsetIndex=33, charsetName=UTF-8]
    
    1 username U java.lang.String 12 VARCHAR 50
    2 password password java.lang.String 12 VARCHAR 50
    

    이 중 com.mysql.jdbc.FieldJDBC 기준 에 부합 하 는 구체 적 인 실현 이다.
    code
    다음 도구 류 는 이전 도구 류 에 대한 보충 이다.JDBC CRUD 도구 DBUtil
    import cn.jt.pojo.User;
    
    import java.lang.reflect.InvocationTargetException;
    import java.lang.reflect.Method;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.Arrays;
    
    /**
     *   RowMapper      
     *    +     
     * @author wyj
     * @create 2019-04-28 18:24
     */
    public class MapperGetter {
    
        /**   RowMapper    。
         *       JavaBean,               。  OCP(Open Close Principle)。
         */
        public static RowMapper getUserMapper() {
            RowMapper mapper = new RowMapper() {
                @Override
                public User mapRow(ResultSet rs) throws SQLException {
                    User user = new User();
                    user.setId(rs.getInt("id"));
                    user.setUsername(rs.getString("username"));
                    user.setPassword(rs.getString("password"));
                    return user;
                }
            };
            return mapper;
        }
    
        /**     ,  RowMapper    
         * 
         */
        public static  RowMapper getMapper(Class clazz) {
            RowMapper mapper = new RowMapper() {
                @Override
                public T mapRow(ResultSet rs) throws SQLException {
                    T obj =  null;
                    try {
                        obj = clazz.newInstance();
                    } catch (InstantiationException | IllegalAccessException e) {
                        e.printStackTrace();
                    }
    
                    ResultSetMetaData metaData = rs.getMetaData();
                    int columnCount = metaData.getColumnCount();
                    String[] columnLabelArr = new String[columnCount];
                    for (int i = 0; i < columnCount; i++) {
                        columnLabelArr[i] = metaData.getColumnLabel(i + 1);
                    }
                    System.out.println(Arrays.toString(columnLabelArr));
    
                    for (int i = 0; i < columnCount; i++) {
                        String columnLabel = columnLabelArr[i];
                        Method setter = null;
                        try {
                            setter = clazz.getDeclaredMethod(setterNameWrapper(columnLabel)); // username -> setUsername()  
                            setter.invoke(obj, rs.getObject(columnLabel));    // obj.setUsername(rs.getObject("username"));
                        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
                            e.printStackTrace();
                        }
                    }
                    return obj;
                }
            };
            return mapper;
        }
    
        /**
         * setter      wrapper
         * @param name
         * @return
         */
        private static String setterNameWrapper(String name) {
            return "set" + nameWrapper(name);
        }
    
        /**
         *       
         * @param str
         * @return
         */
        private static String nameWrapper(String str) {
            String firstChar = String.valueOf(str.charAt(0));
            return str.replaceFirst(firstChar, firstChar.toUpperCase());  //          
            // return firstChar.toUpperCase() + str.substring(1, str.length());  //      
        }
    
    }
    

    좋은 웹페이지 즐겨찾기