JDBC_利用反射及JDBC元数据编写通用的查询方法

ResultSetMetaData:
1.what:是描述ResultSet 的元数据对象,即从中可以获取到结果集汇中有多少列,列名是什么
2.how:
方法:

public <T> T get (Class<T> clazz , String sql, Object...args){
	T entity = null;

	Connection connection = null;
	PreparedStatement preparedStatement = null;
	ResultSet resultSet = null;
	//try{①}
	//②
	//③
	//④
	//⑤
	//⑥
}

①得到ResultSetMetaData 对象:

ResultSetMetaData rsmd = resultSet.getMetaData();

调用ResulltSet 的getMeatData() 方法:
②ResultSetMetaData 有哪些好用的方法:
(1)int getColumnCount(): SQL 语句中包含哪些列
(2)String getColumnLabel(int column):获取指定的列的别名,其中索引从1开始.

①:查询(要求列的别名要喝Class对应的类的属性名相同),得到一个ResultSet对象

connection = JDBCTools.getConnection();
preparedStatement = connnection.preparedStatement(sql);
for(int i = 0;i <args.length;i++){
		preparedStatement.setObject(i + 1, args[i])
}
resultSet = preparedStatement.executeQuery();

②:得到ResultSetMetaData对象:可以知道SQL语句中查询了哪些列,以及列的别名都是什么

ResultSetMetaData rsmd = resultSet.getMetaData();

③:创建一个Map<String,Object> 对象,键: SQL 查询的列的别名,值:列的值。

Map<String,Object> values = new HashMap<>();

④:处理结果集,利用ResultSetMetaData填充③对应的 Map 对象

if(resultSet.next()){
	for(int i = 0 ;i < rsmd.getColumnCount(); i++){
			String columnLabel = rsmd.getColumnLabel(i +1);
			Object columnValue = resultSet.getObject(i+1);

			values.put(columnLabel, columnValue);
	}
}

⑤:若 Map 不为空集,利用反射创建 clazz 对应的对象

if(values.size()>0){
		entity = clazz.newInstance();
}

⑥:遍历Map对象,利用反射为Class对象的对应的属性复制。

for(Map.Entry<String,Object> entry: values.entrySet()){
		String fieldName = entry.getKey();
		Object value = entry.getValue();
		ReflectionUtils.setFieldValue(entry, fieldName, value);
}

猜你喜欢

转载自blog.csdn.net/zjhzxjq/article/details/88687683
今日推荐