
通过rsmd.getColumnLabel(i + 1),做到不定列
通过泛型,做到不定表
package com.atguigu3.preparedstatement.crud;import java.lang.reflect.Field;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.util.ArrayList;import java.util.List;import org.junit.Test;import com.atguigu3.bean.Customer;import com.atguigu3.bean.Order;import com.atguigu3.util.JDBCUtils;/**** @Description 使用PreparedStatement实现针对于不同表的通用的查询操作* @author shkstart Email:shkstart@126.com* @version* @date 上午11:32:55**/public class PreparedStatementQueryTest {@Testpublic void testGetInstance(){String sql = "select id,name,email from customers where id = ?";Customer customer = getInstance(Customer.class,sql,12);System.out.println(customer);String sql1 = "select order_id orderId,order_name orderName from `order` where order_id = ?";Order order = getInstance(Order.class, sql1, 1);System.out.println(order);}/**** @Description 针对于不同的表的通用的查询操作,返回表中的一条记录* @author shkstart* @date 上午11:42:23* @param clazz* @param sql* @param args* @return*/public <T> T getInstance(Class<T> clazz,String sql, Object... args) {Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;try {conn = JDBCUtils.getConnection();ps = conn.prepareStatement(sql);for (int i = 0; i < args.length; i++) {ps.setObject(i + 1, args[i]);}rs = ps.executeQuery();// 获取结果集的元数据 :ResultSetMetaDataResultSetMetaData rsmd = rs.getMetaData();// 通过ResultSetMetaData获取结果集中的列数int columnCount = rsmd.getColumnCount();if (rs.next()) {T t = clazz.newInstance();// 处理结果集一行数据中的每一个列for (int i = 0; i < columnCount; i++) {// 获取列值Object columValue = rs.getObject(i + 1);// 获取每个列的列名// String columnName = rsmd.getColumnName(i + 1);String columnLabel = rsmd.getColumnLabel(i + 1);// 给t对象指定的columnName属性,赋值为columValue:通过反射Field field = clazz.getDeclaredField(columnLabel);field.setAccessible(true);field.set(t, columValue);}return t;}} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps, rs);}return null;}}