必威体育Betway必威体育官网
当前位置:首页 > IT技术

java.sql.ResultSetMetaData 接口的使用(结果集元数据)

时间:2019-10-24 14:44:29来源:IT技术作者:seo实验室小编阅读:65次「手机版」
 

resultsetmetadata

intro

  • 有时需要了解结果集的元数据信息(之后与反射,泛型结合,编写通用方法,减少代码重复):

    columnCount 结果集的列数

    columnName 列的名称 // select columnName as columnLabel…

    columnLabel 列的别名(label)

    columnClassName 列在java中对应的类型(可配合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\n",
            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.Field是符合JDBC标准的具体实现。

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<T>下实例的工厂
 * 泛型 + 反射获取
 * @author wyj
 * @create 2019-04-28 18:24
 */
public class MapperGetter {

    /** 获取RowMapper<User>下的实例。
     * 但如果有多重JavaBean,这个工厂类的静态方法要一直扩张。违反OCP(Open Close principle)。
     */
    public static RowMapper<User> getUserMapper() {
        RowMapper<User> mapper = new RowMapper<User>() {
            @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<T>下的实例
     * 
     */
    public static <T> RowMapper<T> getMapper(Class<T> clazz) {
        RowMapper<T> mapper = new RowMapper<T>() {
            @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());  // 字符串拼接
    }

}

文章最后发布于: 2019-04-29 09:42:12

相关阅读

JAVA中MD5加密(MD5工具类)

工具类如下:import java.security.MessageDigest; /** * @Author:Starry * @Description: * @Date:Created in 9:46 2018/4/13

Java实现 “ 将数字金额转为大写中文金额 ”

前言:        输入数字金额参数,运行程序得到其对应的大写中文金额;例如:输入— 12.56,输出— 12.56:壹拾贰元伍角陆分;重点来了

Java面试流程及核心面试题

面试整体流程 1.1 简单的自我介绍  我是xxxx,工作xxx年.我先后在xxxx公司、yyyy公司工作。先后做个xxxx项目、yyyy项目。 1.2

有道云笔记的java后台开发部分笔记整理归纳

1.jsp (1)jsp的九大内置对象:http://note.youdao.com/noteshare?id=6c024325c6498481c42e79d4392a03c7(2)jsp的使用:http://note.yo

Java程序运行堆栈原理

Java程序运行原理分析 Java程序运行流程 Java程序运行原理分析----环境介绍 从最初的jdk安装开始,都是程序运行的关键步骤,每

分享到:

栏目导航

推荐阅读

热门阅读