9.29JavaWeb之PreparedStatement针对测试表的操作

9.29JavaWeb之PreparedStatement针对测试表的操作

针对order表的常规操作流程

    @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);
      }
  }

针对order表的通用操作流程

需求:

  1. 传入sql

  2. 根据字段动态生成需要查询的字段

    @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;
  }

 

上一篇:JSP开发模型


下一篇:Python 项目