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
相关阅读
工具类如下:import java.security.MessageDigest; /** * @Author:Starry * @Description: * @Date:Created in 9:46 2018/4/13
前言: 输入数字金额参数,运行程序得到其对应的大写中文金额;例如:输入— 12.56,输出— 12.56:壹拾贰元伍角陆分;重点来了
面试整体流程 1.1 简单的自我介绍 我是xxxx,工作xxx年.我先后在xxxx公司、yyyy公司工作。先后做个xxxx项目、yyyy项目。 1.2
1.jsp (1)jsp的九大内置对象:http://note.youdao.com/noteshare?id=6c024325c6498481c42e79d4392a03c7(2)jsp的使用:http://note.yo
Java程序运行原理分析 Java程序运行流程 Java程序运行原理分析----环境介绍 从最初的jdk安装开始,都是程序运行的关键步骤,每