说明:使用PreparedStatement实现的查询操作可以替换Statement实现的查询操作,解决Statement拼串和SQL注入问题。

    // 通用的针对于不同表的查询:返回一个对象 (version 1.0)
    publicTgetInstance(Classclazz,String sql,Object…args){
    Connection conn=null;
    PreparedStatement ps=null;
    ResultSet rs=null;
    try{
    // 1.获取数据库连接
    conn=JDBCUtils.getConnection();
    // 2.预编译sql语句,得到PreparedStatement对象
    ps=conn.prepareStatement(sql);
    // 3.填充占位符
    for(inti=0;i ps.setObject(i+1,args[i]);
    }
    // 4.执行executeQuery(),得到结果集:ResultSet
    rs=ps.executeQuery();
    // 5.得到结果集的元数据:ResultSetMetaData
    ResultSetMetaData rsmd=rs.getMetaData();
    // 6.1通过ResultSetMetaData得到columnCount,columnLabel;通过ResultSet得到列值
    intcolumnCount=rsmd.getColumnCount();
    if(rs.next()){
    T t=clazz.newInstance();
    for(inti=0;i // 获取列值
    Object columnVal=rs.getObject(i+1);
    // 获取列的别名:列的别名,使用类的属性名充当
    String columnLabel=rsmd.getColumnLabel(i+1);
    // 6.2使用反射,给对象的相应属性赋值
    Field field=clazz.getDeclaredField(columnLabel);
    field.setAccessible(true);
    field.set(t,columnVal);
    }
    returnt;
    }
    }catch(Exceptione){
    e.printStackTrace();
    }finally{
    // 7.关闭资源
    JDBCUtils.closeResource(conn,ps,rs);
    }
    returnnull;
    }