您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
08-JDBC-API详解-PreparedStatement-原理(useServerPrepStmts参数的作用)
发布时间:2024-11-14 19:46:04编辑:雪饮阅读()
-
使用jdbc的PreparedStatement据说是性能更高,但是我觉得吧多增加了一个预处理流程,那么性能应该不会比直接执行快吧。
mysqld里面记录mysql语句到文件
general_log = ON
general_log_file = /www/wwwroot/mysql.log
然后不断监听文件内容tail -f /www/wwwroot/mysql.log
然后要真正使用预编译功能还需要jdbc的url中拼接参数
useServerPrepStmts=true
那么我这里实现一个示例
@Test
public void testPreparedStatement2() throws Exception {
String url="jdbc:mysql://192.168.217.132/demo?useSSL=false&useServerPrepStmts=true";
String username="root";
String password="1448169a3cb137d7";
Connection conn= DriverManager.getConnection(url,username,password);
Statement stmt=conn.createStatement();
String userName="张三";
String userPassword="123";
String userPassword2="' or '1' = '1";
String sql8="select * from user where name = ? and password = ?";
PreparedStatement pstmt=conn.prepareStatement(sql8);
Thread.sleep(10000);
pstmt.setString(1,userName);
pstmt.setString(2,userPassword);
ResultSet rs=pstmt.executeQuery();
if(rs.next()){
System.out.println("登录成功");
}
pstmt.setString(2,userPassword2);
rs=pstmt.executeQuery();
if(rs.next()){
System.out.println("注入登录成功");
}
rs.close();
stmt.close();
conn.close();
}
通过监听日志文件内容
可以发现首先预编译只在真正sql执行前,其次是预编译只执行一次,如果修改了预处理的参数也不会触发重新预编译,还有就是预处理后的sql确实是进行了对敏感字符转义。
关键字词:useServerPrepStmts
相关文章
-
无相关信息