zoukankan      html  css  js  c++  java
  • JDBC基础二

    1.JDBC中Statement与PreparedStatement的区别:

      1)statement每次执行sql语句,相关数据库都要执行sql语句的编译;preparedstatement是预编译的, 采用Cache机制(预编译语句,放在Cache中,下次执行相同SQL语句时,则可以直接从Cache中取出来,有利于sql生成查询计划。),对于批量处理可以大大提高效率. 也叫JDBC存储过程,;DBServer会对预编译语句提供性能优化。因为预编译语句有可能被重复调用,所以语句在被DBServer的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中就会得到执行。。

     2)PrepareStatement中执行的SQL语句中是可以带参数的,也就是说可以替换变量,尽量采用使用?号的方式传递参数,增加代码的可读性又可以预编译加速;而Statement则不可以。

     3)防止SQL注入。在SQL中包含特殊字符或SQL的关键字(如:’ or 1 or ‘)时,Statement将出现不可预料的结果(出现异常或查询的结果不正确),可用PreparedStatement来解决。

    注:SQL注入或者说SQL注入攻击就是利用Statement的漏洞完成的,例如用个用户登录,那么form表单有用户名和密码

    那么我提交时,在用户名输入框内 输入 “aaa’ or ’a’=’a” 密码框随便输入,那么这样意味着 sql的查询语言就是 “select * from 表 where 用户名=’aaa’ or ’a’=’a‘and 密码=’123’”,这样查询出来所有的数据或者是混乱。那么不被授权的用户照样可以登录,岂不是被黑了?

    2.使用PreparedStatement类的增删改查:

     原始表格如下:

      

      ---带参的SQL语句-------------------------------------------------------

    //用PreparedStatement类实现增加数据

    import java.sql.*;

    public class mytest {

        public static void main(String[] args) {

            try {

                Class.forName("com.mysql.jdbc.Driver");

                Connection cnn=DriverManager.getConnection(

                 "jdbc:mysql://localhost:3306/test","root","root");

                PreparedStatement ps=cnn.prepareStatement(

                 "insert into person values(?,?,?,?)");

                ps.setInt(1,6);

                ps.setString(2,"liu");

                ps.setString(3,"chengdu");

                ps.setString(4,"sichaung");

                ps.executeUpdate();          

                ps.close();

                cnn.close();

            } catch (Exception ex) {

                System.out.println(ex);

            }

        }

    }

    ------------------------------------------------

    //用PreparedStatement类实现删除操作

    import java.sql.*;

    public class mytest {

        public static void main(String[] args) {

            try {

                Class.forName("com.mysql.jdbc.Driver");

                Connection cnn=DriverManager.getConnection(

                 "jdbc:mysql://localhost:3306/test","root","root");

                PreparedStatement ps=cnn.prepareStatement(

                 "delete from person where name=?");

                ps.setString(1,"liu");

                ps.executeUpdate();          

                ps.close();

                cnn.close();

            } catch (Exception ex) {

                System.out.println(ex);

            }

        }

    }

    ------------------------

    //用PreparedStatement实现改数据操作

    import java.sql.*;

    public class mytest {

        public static void main(String[] args) {

            try {

                Class.forName("com.mysql.jdbc.Driver");

                Connection cnn=DriverManager.getConnection(

                 "jdbc:mysql://localhost:3306/test","root","root");

                PreparedStatement ps=cnn.prepareStatement(

                 "update person set name=? where address=? ");

                ps.setString(1,"wu");

                ps.setString(2,"hangzhou");

                ps.executeUpdate();          

                ps.close();

                cnn.close();

            } catch (Exception ex) {

                System.out.println(ex);

            }

        }

    }

    -------------------------

    //用PreparedStatement实现数据的查询操作

    import java.sql.*;

    public class mytest {

        public static void main(String[] args) {

            try {

                Class.forName("com.mysql.jdbc.Driver");

                Connection cnn=DriverManager.getConnection(

                 "jdbc:mysql://localhost:3306/test","root","root");

                PreparedStatement ps=cnn.prepareStatement(

                 "select * from person where name=?");

                ps.setString(1,"gao");

                ResultSet rs=ps.executeQuery();

                while(rs.next()){

                    String a=rs.getString("name");

                    String b=rs.getString("address");

                    System.out.println(a+" "+b);

                }       

                ps.close();

                cnn.close();

            } catch (Exception ex) {

                System.out.println(ex);

            }

        }

    }

  • 相关阅读:
    2016改变与突破的一年
    web安全测试&渗透测试之sql注入~~
    后台服务端接口验证项目实例~~
    Web自动化框架之五一套完整demo的点点滴滴(excel功能案例参数化+业务功能分层设计+mysql数据存储封装+截图+日志+测试报告+对接缺陷管理系统+自动编译部署环境+自动验证false、error案例)
    web自动化框架之四测试报告的搭建
    web自动化框架之三获取数据库值与界面值比较~~
    Web自动化框架搭建之二基于数据驱动应用简单实例~~
    web自动化框架之一介绍与环境搭建(Selenium+Eclipse+Python)
    事件响应
    威胁分析
  • 原文地址:https://www.cnblogs.com/231254971a/p/8191640.html
Copyright © 2011-2022 走看看