经典查询

传智播客——statement和preparedStatement比较 (2010-01-09 09:56:52)

思路:

     a.statement和预处理sql语句的性能比较。//oracle机制完成

     b.调用存储过程实现某一功能模块

     c.高级查询。多条件查询。主要实现思路:拼接sql语句和模糊查询结合。

     d.多表连接高级查询。添加多表连接条件。只不过不能再用dbutile的query简单方法。必须重写接口ResultSetHandler并出入到query方法中,不能使用new BeanListHandler(clazz)方式进行查询。

Statement VS  PreparedStatement 比较

5000条数据:前者7秒  后者3秒

 

代码的可读性和可维护性.

PreparedStatement 能最大可能提高性能:

DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。

在statement语句中,即使是相同操作但因为数据内容不一样,所以整个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. 

PreparedStatement能保证安全性

单条语句的执行:

   PreparedStatement执行效率比statement执行率低

 

调用存储过程

Connection conn=null;

        DBManager  dBManager=new DBManager();

        CallableStatement cstmt=null;

        conn=dBManager.getConnection();

       

        String sql="{call insertdept(?,?,?)}";

       

        try {

            //创建一个 CallableStatement 对象来调用数据库存储过程

            cstmt=conn.prepareCall(sql);

            cstmt.setInt(1, 34);

            cstmt.setString(2, "ppp");

            cstmt.setString(3, "beijing");

            //在此 PreparedStatement 对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句

            cstmt.execute();

       

        } catch (SQLException e) {

            // TODO Auto-generated catch block

            e.printStackTrace();

        }

        finally{

            dBManager.closeResourece(conn, cstmt, null);

        }

 

高级查询精华详解

   查询条件:

String username=""; //request.getParameter("username");

       String sex="";      //request.getParameter("sex");

       String edu="";      //request.getParameter("edu");

        Date beginDate=null;//request.getParameter("beginDate");

                Date endDate=null;//request.getParameter("endDate");

               随意拼接,并按要求查询出结果

    方法一:拼接sql字符串,如果查询条件为”” 则用“%%”来处理,但问题是时间类型的数据没法处理

        //重点如何组成复合条件的sql语句

       //处理客户端传递过来的数据

       if(username==null||"".equals(username.trim())){

           username="";

       }

      String sql="select id,username,realname,sex,birthday, edu,"+

                   "hiredate from employees "+

                   " where username like '%"+username+"%' and sex like  '%"+sex+"%' and edu like '%"+edu+"%'";

 

方法二:拼接sql字符串,如果查询条件为”” 则不添加该字段,精华:where 1=1 防止出错!!但问题是时间类型的数据没法处理

String sql="select id,username,realname,sex,birthday, edu,"+

                  "hiredate from employees where 1=1 ";

     //判断字段是否存在,如果不存在则不添加

     if(username!=null&&!"".equals(username.trim())){

        sql=sql+" and username like '%"+username.trim()+"%'";

     }

 

方法三:拼接sql字符串,如果查询条件为”” 则不添加该字段,精华:用一个boole变量来标示sql语句中是否存在where关键字防止出错!!但问题是时间类型的数据没法处理

    String sql="select id,username,realname,sex,birthday, edu,"+

                   "hiredate from employees";

      boolean whereFlag=false; //表示没有where

     

     if(username!=null&&!"".equals(username.trim())){

         if(!whereFlag){

           sql=sql+" where username like '%"+username.trim()+"%'";

           whereFlag=true;

         }else{

             sql=sql+" and username like '%"+username.trim()+"%'";

         }

     }

     

     if(sex!=null&&!"".equals(sex.trim())){

         if(!whereFlag){ 

           sql=sql+" where sex = '"+sex.trim()+"'";

           whereFlag=true;

         }else{

             sql=sql+" and sex = '"+sex.trim()+"'";

         }

      }

 

方法四:绝对经典。精华:拼接sql如果查询条件不存在则不加入.用预编译的prepareStatement来处理sql语句,用list集合来存储sql语句中需要的对应参数,及其对应的参数类型.

 

List paramsList=new ArrayList();

        List<Integer> typeList=new ArrayList<Integer>();

       

       

       String sql="select id,username,realname,sex,birthday, edu,"+

                   "hiredate from employees "+

                   " where 1=1";

   

     

      if(username!=null&&!"".equals(username.trim())){

          sql=sql+ " and username like ?";

          paramsList.add("%"+username+"%");

          typeList.add(java.sql.Types.VARCHAR);

       

      }

      if(sex!=null&&!"".equals(sex.trim())){

          sql=sql+ " and sex = ?";

          paramsList.add(sex);

          typeList.add(java.sql.Types.VARCHAR);

      }

      if(edu!=null&&!"".equals(edu.trim())){

          sql=sql+ " and edu like ?";

          paramsList.add("%"+edu+"%");

          typeList.add(java.sql.Types.VARCHAR);

      }

     

      //当开始日期和结束日期都不为null的时候,才执行查询

      if(beginDate!=null&&endDate!=null){

          sql=sql+" and  birthday  between ? and ?";

          paramsList.add(beginDate);

          typeList.add(java.sql.Types.DATE);

         

          paramsList.add(endDate);

          typeList.add(java.sql.Types.DATE);

      }

     

     

      //list转化为对象数组  返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。

      Object[] params=paramsList.toArray();

      //

      Integer[] type=new Integer[typeList.size()];

      //toArray(Integer[] type) 

      typeList.toArray(type);

     

     

     

      System.out.println("^^^ "+sql);

          

      DBManager dbManager =new DBManager();

      Connection conn=null;

      PreparedStatement pstmt=null;

      ResultSet rs=null;

      conn=dbManager.getConnection();

 

         pstmt=conn.prepareStatement(sql);

       

         if(params!=null&&params.length>0){

             for(int i=0;i<params.length;i++){

                 //使用给定对象设置指定参数的值。第二个参数必须是 Object 类型

                 pstmt.setObject(i+1, params[i],type[i]);

             }

         }

 

        rs=pstmt.executeQuery();

        while(rs.next()){

            System.out.println(rs.getObject(1)+"  "

                    +rs.getObject(2)+"  "+rs.getObject(3)+"  "

                    +rs.getObject(4)+"  "+rs.getObject(5)+"  "

                    +rs.getObject(6)+"  "+rs.getObject(7));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值