PreparedStatement执行select语句,防止SQL注入 作者:马育民 • 2020-08-12 14:51 • 阅读:10131 # 执行select语句 不带查询条件 ``` String sql="select * from book"; PreparedStatement ps=conn.prepareStatement(sql);//预编译sql ResultSet rs=ps.executeQuery();//执行查询 List list=new ArrayList(); while(rs.next()){ Object[] array=new Object[columnNum]; for(int i=0;i<columnNum;i++){ array[i]=rs.getObject(i+1); } list.add(array); } rs.close(); ps.close(); ``` `PreparedStatement` 与 `Statement` 执行过程基本相同,只有2处不一样 # 防止SQL注入 当有查询条件时,使用 `?` 作为占位符,可以防止 SQL注入 ``` import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; public class PreparedStatement防止SQL注入 { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub String url = "jdbc:mysql://127.0.0.1:3308/scott?useSSL=false"; // 正常的用户名、密码 String username = "lilei"; String password = "123456"; // sql注入 // String username = "' or 1=1 #"; // String password = ""; // 加载驱动 Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, "root", ""); String sql = "SELECT * FROM USER WHERE username=? and password=? "; System.out.println(sql); PreparedStatement ps=conn.prepareStatement(sql);//创建PreparedStatement接口对象时,需要传入sql,预编译sql ps.setObject(1,username); ps.setObject(2,password); ResultSet rs=ps.executeQuery(); if (rs.next()) { String id = rs.getString(1); Object name = rs.getObject(2); Object passowrd = rs.getObject(3); System.out.println("登录成功!"); System.out.println(id + "," + name + "," + passowrd); } else {// 没有查询到此用户、密码,说明登录失败 System.out.println("输入用户名或密码错误,请重新输入!"); } conn.close(); } } ``` 原文出处:/show_1EF63mPrPThS.html