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

     

    It's a lonely road!!!
  • 相关阅读:
    Visual Prolog 的 Web 专家系统 (7)
    spring来源理解-BeanFactory子类XmlBeanFactory创建过程
    Threejs 它可以在建立其内部房间效果可见
    Android AlarmManager报警的实现
    什么是注册表和注册表中的作用
    精致的外观Request
    数据仓库的工作日记_创纪录的(一)
    servlet api.jar是干什么的?
    servlet-api-2.5.jar
    用poi-3.6-20091214.jar 实现java给excel资料加密
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15369369.html
Copyright © 2020-2023  润新知