JSPでDB

JSPからMySQLのDB利用する方法です。


日本語を扱うためにすべてUTF-8で統一しておきます。
DBもそうですが、ソースコードutf-8(BOMは付けない)ヘッダーにもUTF-8の記述とjava.sql.*の記述をします。

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8" import="java.sql.*,java.text.*,java.io.*,java.net.*"%>

今回はセキュリティの高いprepareStatementを利用してみます。

<%
request.setCharacterEncoding("utf-8");
Connection conn = null;
CallableStatement cs = null;
PreparedStatement stmt = null;
ResultSet rs = null;
String url = "jdbc:mysql://localhost/dbName?characterEncoding=UTF-8";
String dbUser = "dbUser";
String dbPass = "dbPass";
try{

Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(url, dbUser, dbPass);

String sql="insert into table (col1, col2, col3) values (?,?,?)";
stmt = conn.prepareStatement(sql);
stmt.setInteger(1,val1);
stmt.setString(2,val2);
stmt.setString(3,val3);
int cnt = stmt.executeUpdate();

stmt.close();

}catch(Exception e){
//exception
}finally{
if(stmt!=null){stmt.close();}
if(conn!=null){conn.close();}
}
%>

formなどで入力された値をそのままDBにinsertする場合、
「;delete table」などが入力されているとデータが削除されてしまったりする恐れがあります。
このような危険な値を無効にする為にprepareStatementがあります。
SQL文で危険回避したい値の部分は?にします。
そしてstmt.setInteger(1,val1);の部分で
int型で1つめの?に変数val1を指定しています。
このようにすると安全にinsertできます。