本文为大家分享和参考MySQL预编译功能,具体内容如下
1、预编译的好处
平时使用的是JDBC的PreparedStatement接口,但有预编译功能。 什么是预编译功能? 有什么好处呢?
客户端将SQL语句发送到服务器后,服务器必须始终验证SQL语句的语法格式是否正确,将SQL语句编译为可执行函数,然后执行该语句。 验证和编译语法可能比执行SQL语句所需的时间更长。
您必须多次执行insert语句,但每次插入的值不同,MySQL服务器也必须每次检查和编译SQL语句的语法格式,这太费时间了。 预编译功能是高效的,因为它只对SQL语句执行一次语法校验和编译。
2、MySQL执行预编译
使用MySQL进行预编译可以分为以下三个步骤:
preparemyfunfrom ' select * fromt _ bookwherebid=?' 执行预编译语句,例如
设定变量。 例如,set @str='b1 '
执行语句。 例如,execute myfun using @str
如果需要再次运行myfun,则不需要编译第一步,即语句。
设定变量。 例如,set @str='b2 '
执行语句。 例如,execute myfun using @str
通过查看MySQL日志,可以查看运行的进程。
3、使用Statement执行预编译
使用Statement执行预编译是执行上述SQL语句一次。 connection con=JDBC utils.getconnection (;
statement stmt=con.create statement (;
stmt.execute update (preparemyfunfrom ' select * fromt _ bookwherebid=?' ';
stmt.execute update (' set @ str=' B1 ' );
resultset RS=stmt.execute query (executemyfunusing @ str );
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
stmt.execute update (' set @ str=' B2 ' );
RS=stmt.execute query (executemyfunusing @ str );
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
rs.close (;
stmt.close (;
con.close (;
4、useServerPrepStmts参数
缺省情况下,不能使用PreparedStatement执行预编译。 在url中输入useServerPrepStmts=true参数(MySQL Server
4.1之前的版本不支持预编译,但Connector/J在5.0.5或更高版本中缺省情况下不启用预编译功能。) .
例如,JDBC : MySQL ://localhost :3306/test? useServerPrepStmts=true
这将确保mysql驱动程序只需将SQL语句发送到服务器进行预编译,然后在执行(executeQuery ) )时将参数发送到服务器。 connection con=JDBC utils.getconnection (;
string SQL=' select * fromt _ bookwherebid=?' ;
preparedstatementpstmt=con.preparestatement (SQL;
ptmt.setstring(1,' b1 ';
ResultSetrs=pstmt.executeQuery (;
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
ptmt.setstring(1,' b2 ';
rs=pstmt.executeQuery (;
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
rs.close (;
pstmt.close (;
con.close (;
5、cachePrepStmts参数
如果使用不同的PreparedStatement对象执行同一SQL语句,仍然会发生两次编译的现象。 这是因为编译的函数key未缓存,因此将被编译两次。 如果要缓存编译后函数的key,请将cachePrepStmts参数设置为true。 例如:
JDBC : MySQL ://localhost :3306/test? useserverprepstmts=truecacheprepstmts=trueconnectioncon=JDBC utils.getconnection (;
string SQL=' select * fromt _ bookwherebid=?' ;
preparedstatementpstmt=con.preparestatement (SQL;
ptmt.setstring(1,' b1 ';
ResultSetrs=pstmt.executeQuery (;
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
ptmt=con.preparestatement(SQL;
ptmt.setstring(1,' b2 ';
rs=pstmt.executeQuery (;
wile(RS.next ) ) }
system.out.print (RS.getstring (1),);
system.out.print (RS.getstring (2),);
system.out.print (RS.getstring (3),);
system.out.println (RS.getstring (4) );
}
rs.close (;
pstmt.close (;
con.close (;
6、开批
MySQL批处理也必须使用参数打开。 rewriteBatchedStatements=true