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