微信登录

JDBC - PS - 查 - 封装ORM - 1sql多表多列多行

作用

通过rsmd.getColumnLabel(i + 1),做到不定列
通过泛型,做到不定表
通过结果返回ArrayList,做到返回多行(每行1个对象)
[object][object][object]

  1. package com.atguigu3.preparedstatement.crud;
  2. import java.lang.reflect.Field;
  3. import java.sql.Connection;
  4. import java.sql.PreparedStatement;
  5. import java.sql.ResultSet;
  6. import java.sql.ResultSetMetaData;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import org.junit.Test;
  10. import com.atguigu3.bean.Customer;
  11. import com.atguigu3.bean.Order;
  12. import com.atguigu3.util.JDBCUtils;
  13. /**
  14. *
  15. * @Description 使用PreparedStatement实现针对于不同表的通用的查询操作
  16. * @author shkstart Email:shkstart@126.com
  17. * @version
  18. * @date 上午11:32:55
  19. *
  20. */
  21. public class PreparedStatementQueryTest {
  22. public <T> List<T> getForList(Class<T> clazz,String sql, Object... args){
  23. Connection conn = null;
  24. PreparedStatement ps = null;
  25. ResultSet rs = null;
  26. try {
  27. conn = JDBCUtils.getConnection();
  28. ps = conn.prepareStatement(sql);
  29. for (int i = 0; i < args.length; i++) {
  30. ps.setObject(i + 1, args[i]);
  31. }
  32. rs = ps.executeQuery();
  33. // 获取结果集的元数据 :ResultSetMetaData
  34. ResultSetMetaData rsmd = rs.getMetaData();
  35. // 通过ResultSetMetaData获取结果集中的列数
  36. int columnCount = rsmd.getColumnCount();
  37. //创建集合对象
  38. ArrayList<T> list = new ArrayList<T>();
  39. while (rs.next()) {
  40. T t = clazz.newInstance();
  41. // 处理结果集一行数据中的每一个列:给t对象指定的属性赋值
  42. for (int i = 0; i < columnCount; i++) {
  43. // 获取列值
  44. Object columValue = rs.getObject(i + 1);
  45. // 获取每个列的列名
  46. // String columnName = rsmd.getColumnName(i + 1);
  47. String columnLabel = rsmd.getColumnLabel(i + 1);
  48. // 给t对象指定的columnName属性,赋值为columValue:通过反射
  49. Field field = clazz.getDeclaredField(columnLabel);
  50. field.setAccessible(true);
  51. field.set(t, columValue);
  52. }
  53. list.add(t);
  54. }
  55. return list;
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. } finally {
  59. JDBCUtils.closeResource(conn, ps, rs);
  60. }
  61. return null;
  62. }
  63. }

使用

  1. @Test
  2. public void testGetForList(){
  3. String sql = "select id,name,email from customers where id < ?";
  4. List<Customer> list = getForList(Customer.class,sql,12);
  5. list.forEach(System.out::println);
  6. String sql1 = "select order_id orderId,order_name orderName from `order`";
  7. List<Order> orderList = getForList(Order.class, sql1);
  8. orderList.forEach(System.out::println);
  9. }