您的位置 首页 php

「酒窝说:」java程序员,预编译执行计划连接DB防止sql注入

PreparedStatement:用来执行带参数的预编译执行计划

执行计划:

1.任何sql执行过程都是先编译“执行计划” 再执行“执行计划”

2.数据库为了优化性能,在sql相同时,会重用计划 ,因为执行计划编译较慢,所以重用执行计划可以提高数据库性能

3.数据库只在sql语句完全一样是时才会重用相同的执行计划,

如果sql语句中有一个字符不同,都会重新执行不同的执行计划;

PreparedStatement对象的作用:

1.可以重复使用执行计划,提供数据库效率

2.可以防止 sql注入

mysql 数据库(table):

代码实现:
package JDBC;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Prepared Statement ;
import com.mysql.jdbc.Statement;
public class PreparedDemo2 {
 public static void main(String[] args) {
 Connection conn = null;
 try {
 Scanner sc = new Scanner(System.in);
 
 conn = DBtools.getConnection();
// Statement st= (Statement) conn.createStatement();
 System.out.println("输入查询的名字:");
 String n = sc.nextLine(); 
// String sql = "UPDATE demo SET name=? where id=?";
// String sql = "INSERT INTO demo(id,name) values(?,?)";
// String sql = "DELETE from demo where id=?";
 //用户输入含有sql成分的参数,参数在拼接sql的时候sql语句的语义转变
 /**
 * 如何避免
 * 1.拦截用户输入的sql成分
 * 2.固定执行计划,避免改变执行逻辑
 */// String sql ="select * from demo where name = '"+n+"' ";
 String sql ="select * from demo where name = ?";
 java.sql.PreparedStatement ps = conn.prepareStatement(sql);
 ps.setString(1, n);
 ResultSet rs = ps.executeQuery();
 while(rs.next()) {
 int id =rs.getInt("id");
 String name = rs.getString("name");
 System.out.println(id+","+name);
 }
 } catch (SQLException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 }
}
 

文章来源:智云一二三科技

文章标题:「酒窝说:」java程序员,预编译执行计划连接DB防止sql注入

文章地址:https://www.zhihuclub.com/78647.shtml

关于作者: 智云科技

热门文章

网站地图