Java通过反射实现通用查询方法

发布于:2025-02-11 ⋅ 阅读:(30) ⋅ 点赞:(0)
 JDBC连接数据库
public class BaseDao {


    protected Connection conn;  // 连接对象
    protected PreparedStatement pstmt;  // 执行对象
    protected ResultSet rs;  // 结果集对象

    public Connection getConnection() {
        try {
            // 1、加载驱动   ctrl + alt + t
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2、获取数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?serverTimezone=Asia/Shanghai&characterEncoding=utf8", "root", "xxxxx");
            // Context ctx = new InitialContext();
            // DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/ktmall");
            // conn = ds.getConnection();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }

    // 释放资源
    public void closeAll(ResultSet rs, PreparedStatement pstmt, Connection conn) {
        try {
            if (rs != null) rs.close();
            if (pstmt != null) pstmt.close();
            if (conn != null) conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 执行增删改的SQL语句
     *
     * @param sql    预编译的SQL语句。  带?点位符
     * @param params 参数数组
     * @return 返回受影响的行数
     */
    public int executeUpdate(String sql, Object... params) {
        conn = getConnection();
        int count = 0;  // 用来保存受影响的行数
        try {
            pstmt = conn.prepareStatement(sql);  // 创建执行对象
            // 为预编译的SQL语句赋值,即替换掉?占位符
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            count = pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 释放资源
            closeAll(rs, pstmt, conn);
        }
        return count;
    }
    /**
     * 利用 Java 反射机制,写的一个通用查询方法
     */
    public <T> List<T> executeQuery(String sql, Object[] params, Class<T> clazz) {
        List<T> list = new ArrayList<>();
        ResultSet rs = null;
        PreparedStatement pstmt = null;
        Connection conn = getConnection();
        try {
            pstmt = conn.prepareStatement(sql);
            if (params != null) {
                for (int i = 0; i < params.length; i++) {
                    pstmt.setObject(i + 1, params[i]);
                }
            }
            rs = pstmt.executeQuery();
            ResultSetMetaData resultSetMetaData = rs.getMetaData();
            int columnCount = resultSetMetaData.getColumnCount();

            while (rs.next()) {
                T t = clazz.getDeclaredConstructor().newInstance(); // 使用构造器获取实例

                for (int i = 1; i <= columnCount; i++) { // 从1开始遍历列
                    String columnName = resultSetMetaData.getColumnLabel(i); // 使用getColumnLabel
                    Object columnValue = rs.getObject(i);
                    try {
                        Field field = clazz.getDeclaredField(columnName);// 获取属性
                        field.setAccessible(true);
                        field.set(t, columnValue);
                    } catch (NoSuchFieldException e) {
                        // 忽略不存在的字段,或者记录警告
                        System.out.println("No such field: " + columnName);
                    }
                }
                list.add(t);
            }
        } catch (Exception e) {
            e.printStackTrace(); // 打印堆栈跟踪以帮助调试
        } finally {
            this.closeAll(rs, pstmt, conn);
        }
        return list;
    }
}

封装实体类 Users

public class Users {

  private long id;
  private String userName;
  private long ok;
  private String sex;
  private java.sql.Timestamp birthday;
  private double salary;


  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }


  public String getUserName() {
    return userName;
  }

  public void setUserName(String username) {
    this.userName = userName;
  }


  public long getOk() {
    return ok;
  }

  public void setOk(long ok) {
    this.ok = ok;
  }


  public String getSex() {
    return sex;
  }

  public void setSex(String sex) {
    this.sex = sex;
  }


  public java.sql.Timestamp getBirthday() {
    return birthday;
  }

  public void setBirthday(java.sql.Timestamp birthday) {
    this.birthday = birthday;
  }


  public double getSalary() {
    return salary;
  }

  public void setSalary(double salary) {
    this.salary = salary;
  }

  @Override
  public String toString() {
    return "Users{" +
            "id=" + id +
            ", userName='" + userName + '\'' +
            ", ok=" + ok +
            ", sex='" + sex + '\'' +
            ", birthday=" + birthday +
            ", salary=" + salary +
            '}';
  }
}

接口 / 实现类

public interface UsersDao {
    /**
     * 查询用户
     */
    List<Users> queryUsers();
}
public class UsersDaoImpl extends BaseDao implements UsersDao {
    @Override
    public List<Users> queryUsers() {
        String sql= "select id,userName,ok,sex,birthday,salary from users";
        List<Users> userList = executeQuery(sql, new Object[]{}, Users.class);
        return userList;
    }
}

测试方法

public class UserDaoImplTest {
    public static void main(String[] args) {
        UsersDaoImpl usersDao = new UsersDaoImpl();
        List<Users> list = usersDao.queryUsers();
        System.out.println(list.toString());
    }
}

测试

希望能够给大驾货有用!!!


网站公告

今日签到

点亮在社区的每一天
去签到