微信登录

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

作用

通过rsmd.getColumnLabel(i + 1),做到不定列
通过泛型,做到不定表

  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. @Test
  23. public void testGetInstance(){
  24. String sql = "select id,name,email from customers where id = ?";
  25. Customer customer = getInstance(Customer.class,sql,12);
  26. System.out.println(customer);
  27. String sql1 = "select order_id orderId,order_name orderName from `order` where order_id = ?";
  28. Order order = getInstance(Order.class, sql1, 1);
  29. System.out.println(order);
  30. }
  31. /**
  32. *
  33. * @Description 针对于不同的表的通用的查询操作,返回表中的一条记录
  34. * @author shkstart
  35. * @date 上午11:42:23
  36. * @param clazz
  37. * @param sql
  38. * @param args
  39. * @return
  40. */
  41. public <T> T getInstance(Class<T> clazz,String sql, Object... args) {
  42. Connection conn = null;
  43. PreparedStatement ps = null;
  44. ResultSet rs = null;
  45. try {
  46. conn = JDBCUtils.getConnection();
  47. ps = conn.prepareStatement(sql);
  48. for (int i = 0; i < args.length; i++) {
  49. ps.setObject(i + 1, args[i]);
  50. }
  51. rs = ps.executeQuery();
  52. // 获取结果集的元数据 :ResultSetMetaData
  53. ResultSetMetaData rsmd = rs.getMetaData();
  54. // 通过ResultSetMetaData获取结果集中的列数
  55. int columnCount = rsmd.getColumnCount();
  56. if (rs.next()) {
  57. T t = clazz.newInstance();
  58. // 处理结果集一行数据中的每一个列
  59. for (int i = 0; i < columnCount; i++) {
  60. // 获取列值
  61. Object columValue = rs.getObject(i + 1);
  62. // 获取每个列的列名
  63. // String columnName = rsmd.getColumnName(i + 1);
  64. String columnLabel = rsmd.getColumnLabel(i + 1);
  65. // 给t对象指定的columnName属性,赋值为columValue:通过反射
  66. Field field = clazz.getDeclaredField(columnLabel);
  67. field.setAccessible(true);
  68. field.set(t, columValue);
  69. }
  70. return t;
  71. }
  72. } catch (Exception e) {
  73. e.printStackTrace();
  74. } finally {
  75. JDBCUtils.closeResource(conn, ps, rs);
  76. }
  77. return null;
  78. }
  79. }