JDBC2

PreparedStatement
  >它是Statement接口的子接口;
  >强大之处:
   1.防止SQL攻击
   2.提高代码的可读性和可维护性
   3.提高效率
   >PreparedStatement的用法
   如何得到PreparedStatement对象!
   *给出SQL模板
   *调用Connection的PreparedStatement prepareStatement(String sql模板)
   *调用pstmt的setXxx系列方法为sql模板中的?赋值
   *调用pstmt的executeUpdate()或executeQuery(),但它的方法没有参数
   >预处理的原理
   服务器的工作:
   *校验sql语句的语法!(比较费时)
   *编译:一个与函数相似的东西!
   *执行:调用函数!
   >PreparedStatement
   *前提:连接的数据库必须支持预处理!几乎没有不支持的现在!
   *每个pstmt都与一个sql模板绑定在一起,先把sql模板给数据库,数据库先进行校验,再进行编译,执行时只是把参数传递过去而已!
   *第二次执行时,就不用再次校验语法,也不用再次编译!直接执行!
   *但是预编译在MySQL4.0之后默认是不开启的,要自己配置参数开启

package cn.jxk.demo3;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

/*
 * PrepareStatement
 * 防SQL攻击
 * */
public class Demo3 {
    /*
     * 登录
     * 使用username和password去查询数据库
     * 若查询出结果集,说明正确!返回true
     * 若查不出结果,说明用户名或密码错误,返回false
     * */
  public boolean login(String username,String password) throws ClassNotFoundException, SQLException{
      /*
       * 一、得到Connection
       * 二、得到Statement
       * 三、得到ResultSet
       * 四、rs.next()返回的是什么,我们就返回什么
       * */
      //准备四大参数
       String driverClassName="com.mysql.jdbc.Driver";
       String url="jdbc:mysql://localhost:3306/mydb3";
       String mysqlUsername="root";
       String mysqlPassword="123";
       //加载驱动类
       Class.forName(driverClassName);
       //得到Connection
       Connection con=DriverManager.getConnection(url, mysqlUsername, mysqlPassword);

       //得到Statement
       Statement stmt=con.createStatement();

       //给出sql语句,调用stmt的executeQuery()方法,得到ResultSet
       String sql="select * from t_user where username='"+username+"' and password='"+password+"'";
       ResultSet rs=stmt.executeQuery(sql);
        System.out.println(sql);
       return rs.next();
     }

     /*
      * SQL攻击
      * */
      @Test
      public void fun1() throws Exception{
          String username="a' or 'a'='a";
          String password="a' or 'a'='a";
          boolean bool=login(username,password);
          System.out.println(bool);
      }

      public boolean login2(String username,String password) throws ClassNotFoundException, SQLException{
          /*
           * 一、得到Connection
           * 二、得到Statement
           * 三、得到ResultSet
           * 四、rs.next()返回的是什么,我们就返回什么
           * */
          //准备四大参数
           String driverClassName="com.mysql.jdbc.Driver";
           String url="jdbc:mysql://localhost:3306/mydb3";
           String mysqlUsername="root";
           String mysqlPassword="123";
           //加载驱动类
           Class.forName(driverClassName);
           //得到Connection
           Connection con=DriverManager.getConnection(url, mysqlUsername, mysqlPassword);
           ///////////////////////////////////////
           /////////////////////////////////////////

           /*
            * 得到PrepareStatement
            * 1.给出sql模板,所有的参数使用?来替代
            * 2.调用Connection方,得到PreparedStatement
            * */
           String sql ="select * from t_user where username=? and password=?";
           PreparedStatement pstmt=con.prepareStatement(sql);

           /*
            * 二、为参数赋值,即为问号赋值 
            * */
           pstmt.setString(1, username);//为第一个问号赋值,值为username
           pstmt.setString(2, password);//为第二个问号赋值,值为password   

           ResultSet rs=pstmt.executeQuery();//调用查询方法,向数据库发送查询语句
           return rs.next();
        }

      @Test
      public void fun2() throws Exception{
          String username="zhangsan";
          String password="123";
          boolean bool=login2(username,password);
          System.out.println(bool);
      }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值