PreparedStatementとStatementの違い

1855 ワード

1、PreparedStatementはプリコンパイルされており、バッチ処理に対して効率を大幅に向上させることができ、JDBCストレージプロセスも教えることができる.
2、Statementはsql文を実行するたびに、関連データベースはsql文のコンパイルを実行し、PreparedStatementは事前にコンパイルされ、preparedstatementはバッチをサポートする
各データベースは、プリコンパイル文が繰り返し呼び出される可能性があるため、バックDBでの文のコンパイルに最大限のパフォーマンス最適化を提供するために最善を尽くします.
コンパイル後の実行コードがキャッシュされると、次回の呼び出し時に同じプリコンパイル文であればコンパイルする必要はなく、コンパイルされた文にパラメータを直接転送して実行するだけです.
コードで実行されます
3、コードの可読性とメンテナンス性
コード1
Statement state = con.createStatement();
		state.executeUpdate("insert into tab(id,name,address) values('"+id+"','"+name+"','"+address+"')");

コード2
pst = con.prepareStatement("insert into tab(id,name,address) values(?,?,?)");
			pst.setString(1, id);
			pst.setString(2, name);
			pst.setString(3, address);

Statementの代わりにPreparedStatementを使用すると、コードは数行多くなりますが、このようなコードは、読み取りやメンテナンス性にかかわらず、直接使用するよりも
Statementのコードはずっといいです.
4、最も重要なのは安全性です
まずStatementを使用します
ResultSet rs = state.executeQuery("select * from tb_usertable where username='"+u+"'and password='"+p+"'"); 

['or'1'='1]をpasswordとして入力すると、ユーザー名が勝手に、どのような効果があるか見てみましょう.
select * from tb_usertable where name='"+myname+"'and password='1'or'1'='1' 

このように構成されたsql文では,'1'='1'が必ず成立するため,任意の検証によって検証できる.
 
解決策はPreparedStatementを使用できます
pst = con.prepareStatement("select * from tb_usertable where username = ? and password = ?");
			pst.setString(1, username);
			pst.setString(2, password);

このようにコードを修正することで効率性が向上するだけでなく、攻撃の目的も達成できます.