@Test public void testQueryNo1() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //获取连接 conn = JDBCUtils.getConnection(); //执行语句 String sql = "select `order_id`,`order_name`,`order_date` from `order` where `order_id` = ?;"; ps = conn.prepareStatement(sql); //填充占位符 ps.setObject(1, 3); //执行查询 rs = ps.executeQuery(); //读取内容 if (rs.next()) { /*获取每一列上的具体的值*/ //因为获取三次所以不需要获取元数据 int id = (int) rs.getObject(1); String name = (String) rs.getObject(2); Date date = (Date) rs.getObject(3); /*new一个对象,封装获取到的信息然后返回*/ Order order = new Order(id, name, date); System.out.println(order); } }catch (Exception e){ e.printStackTrace(); }finally { JDBCUtils.closeResource(conn, ps, rs); } }
需求:
传入sql
根据字段
动态生成需要查询的字段
@Test public Order orderForQuery(String sql, Object ...args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //获取连接 conn = JDBCUtils.getConnection(); //预编译sql ps = conn.prepareStatement(sql); //填充占位符--->根据可变形参的个数决定占位符填充的次数 for (int i=0; i<args.length; i++) { ps.setObject(i+1, args[i]); } //执行获取结果集 rs = ps.executeQuery(); //如果有结果,取出字段,放入对象中 //获取结果集的元数据 ResultSetMetaData rsmd = rs.getMetaData(); //获取列数--->通过元数据获取 int columnCount = rsmd.getColumnCount(); if (rs.next()) { Order order = new Order(); //元数据获取每一个列的列值--->次数取决于列个数 for (int j=0; j<columnCount; j++) { //通过结果集获取列值--->结果集:ResultSet Object columnValue = rs.getObject(j+1); //获取每个列的列名--->通过结果集的元数据获取列值--->结果集的元数据:ResultSetMetaData // String columnName = rsmd.getColumnName(j+1); --->不推荐使用 //获取列的别名--->如果没有起别名直接获取到列名--->该方法针对于表的字段名和类的属性名不一致的情况,写sql的时候必须使用类的属性名来命名字段的别名 String columnLabel = rsmd.getColumnLabel(j+1); //通过反射将对象指定成员名的赋予指定的值--->columnName赋值columnValue //反射加载类--->注意属性名和数据库的字段名不一致--->使用结果集将数据库的字段名转换成属性相同的名 /* 1、通过sql查询的时候直接将字段名转成与属性相同的别名 2、不要使用getColumnName方法,该方法是直接获取到列名而非别名 3、使用获取别名的方法来获取别名 */ Field field = Order.class.getDeclaredField(columnLabel); //私有的属性也能够访问 field.setAccessible(true); //给order对象当前该名称的属性赋值为columnVlaue field.set(order, columnValue); } return order; } }catch (Exception e){ e.printStackTrace(); }finally { //资源关闭 JDBCUtils.closeResource(conn, ps, rs); } //没进if当中 return null; }