通过rsmd.getColumnLabel(i + 1),做到不定列
通过泛型,做到不定表
通过结果返回ArrayList,做到返回多行(每行1个对象)
[object][object][object]
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 {public <T> List<T> getForList(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();//创建集合对象ArrayList<T> list = new ArrayList<T>();while (rs.next()) {T t = clazz.newInstance();// 处理结果集一行数据中的每一个列:给t对象指定的属性赋值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);}list.add(t);}return list;} catch (Exception e) {e.printStackTrace();} finally {JDBCUtils.closeResource(conn, ps, rs);}return null;}}
@Testpublic void testGetForList(){String sql = "select id,name,email from customers where id < ?";List<Customer> list = getForList(Customer.class,sql,12);list.forEach(System.out::println);String sql1 = "select order_id orderId,order_name orderName from `order`";List<Order> orderList = getForList(Order.class, sql1);orderList.forEach(System.out::println);}