PreparedStatement
-
作用
-
预编译(性能更高)SQL语句并执行:预防SQL注入问题(将敏感字符进行转义,例如将'变成')
①获取PreparedStatement对象
//SQL语句中的参数值,用?占位符替代 String sql="select *from tb_user where username=?and password=?; //通过Connection对象获取,并传入对应的SQL语句 PreparedStatement pstmt=conn.prepareStatement(sql);
②设置参数值
PrepareStatement对象:setXxx(参数1,参数2):给?赋值 Xxx:数据类型;如setInt(参数1,参数2)
参数:
参数1:?的位置编号,从1开始
参数2:?的值
public void testPreparedStatement()throws Exception{ String url="jdbc:mysql:///db1?useSSL=false"; String username="root"; String password="1234"; Coonection conn=DriverManager.getConnection(url,username,password); //接收用户输入 用户名和密码 String name="zhangsan"; String pwd="qweqw"; String sql="select *from tb_user where username=?and password=?; 获取stmt对象 PreparedStatement pstmt=conn.preparedStatement(); //设置?的值 pstmt.setString(parameterindex:1,name); pstmt.setString(parameterindex:2,pwd); //执行SQL ResultSet rs=pstmt.executeQuery(); //判断登录是否成功 if(rs.next()){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } //释放资源 rs.close(); pstmt.close(); conn.close(); }
③执行SQL
executeUpdate(); 不需要再传递SQL,因为第一步获取对象时已经将SQL传进来了。
-
-
SQL注入
-
SQL注入是通过操作输入来修改事先定义好的SQL语句,用以达到执行代码对服务器进行攻击的方法(例如在密码框输入代码以进入服务器)
-
public void testResultSet()throws Exception{ String url="jdbc:mysql:///db1?useSSL=false"; String username="张三"; String password="123"; Coonection conn=DriverManager.getConnection(url,username,password); //接收用户输入 用户名和密码 String name=""; String pwd=""; String sql="select *from tb_user where username='"+name+"'and password='"+pwd+"'; 获取stmt对象 Statement stmt=conn.createStatement(); //执行SQL ResultSet rs=stmt.executeQuery(sql); //判断登录是否成功 if(rs.next()){ System.out.println("登录成功"); }else{ System.out.println("登录失败"); } //释放资源 rs.close(); stmt.close(); conn.close(); } //演示SQL注入 public void testLogin_Inject() throws Exception{ String url="jdbc:mysql:///db1?useSSL=false"; String username="张三"; String password="'or'1'='1"; //这样之后SQL语句 //select *from tb_user where username='"+name+"'and password='"+pwd+"'; //就变成 //select *from tb_user where username='张三'and password=''or'1'='1'; }
PreparedStatement原理
①PreparedStatement预编译功能开启:将useServerPrepStmts=true加到url的后面
②配置MySQL执行日志(重启mysql服务后生效)
在my.ini文件中添加:
log-output=FILE general-log=1 general_log_file="D:\mysql.log" slow-query-log=1 slow_query_log_file="D:\mysql_slow.log" long_query_time=2
-
在获取PreparedStatement对象时,将SQL语句发送给MySQL服务器进行检查,编译(这些步骤很耗时)
-
执行时就不用再进行这些步骤了,速度更快
-
如果SQL模板一样,则只需要进行一次检查、编译
jar包的启动
在cmd里输入:java -jar然后要启动的jar包