package metadata; import java.sql.Connection; import java.sql.ParameterMetaData; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.util.List; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; import entity.Student; import util.SQLUtil; /** * 结果集元数据: * @author mzy * */ public class Demo03 { private static DataSource ds = new ComboPooledDataSource(); public static void main(String[] args) throws Exception { // easyUse(); // 补充完SQLUtil中的Query方法 List<Student> list = SQLUtil.query("select * from student", null, Student.class); for(Student student : list) { System.out.println(student); } } private static void easyUse() throws Exception { Connection conn = ds.getConnection(); String sql = "select * from student"; PreparedStatement stmt = conn.prepareStatement(sql); /* * 获取参数元数据: * 目的是取得我们需要赋值的参数数量; * 例如如如果我们的查询中有where条件! */ ParameterMetaData param = stmt.getParameterMetaData(); int count = param.getParameterCount(); Object[] values = null; System.out.println(count); /* // 因为恒无法进入,所以注释掉 if(values != null) { // 当传入的values为空,说明不需要参数 // 有需要赋值的参数的时才进行if中的操作 for(int i=0; i<count; i++) { stmt.setObject(i+1, values[i]); } } */ ResultSet rs = stmt.executeQuery(); /* while(rs.next()) { // 原来的办法,手动的取出每一行中的数据 int id = rs.getInt(1); String name = rs.getString(2); System.out.println(id+"\t"+name); } */ // 这里的while中从结果集中取得元素的时候 // 程序并不知道没一行有几个元素 // 所以这里需要结果集元数据,就可以知道一共有几列了 ResultSetMetaData metaData = rs.getMetaData(); int col = metaData.getColumnCount(); while(rs.next()) { // 遍历每列 for(int i=1; i<=col; i++) { Object value = rs.getObject(i); System.out.print(value+"\t"); } System.out.println(); } conn.close(); } }
其中部分已经封装到了 SQLUtil中,请点击