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