![c597f8aedcafcd39b7be6a56446f4210.png](https://i-blog.csdnimg.cn/blog_migrate/c801e167a5ed79f8a77a5d59305692f1.jpeg)
PreparedStatement:用来执行带参数的预编译执行计划
执行计划:
1.任何sql执行过程都是先编译“执行计划” 再执行“执行计划”
2.数据库为了优化性能,在sql相同时,会重用计划 ,因为执行计划编译较慢,所以重用执行计划可以提高数据库性能
3.数据库只在sql语句完全一样是时才会重用相同的执行计划,
如果sql语句中有一个字符不同,都会重新执行不同的执行计划;
PreparedStatement对象的作用:
1.可以重复使用执行计划,提供数据库效率
2.可以防止sql注入
Mysql数据库(table):
![4912375d3bd8e356dfebbcfe9ab89ddf.png](https://i-blog.csdnimg.cn/blog_migrate/20f7044a843c194032f747524a7372c8.jpeg)
代码实现:package JDBC;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Scanner;import com.mysql.jdbc.Connection;import com.mysql.jdbc.PreparedStatement;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+