この問題を解決する機能を、Oracleの拡張機能で用意してくれています。
この機能を使うと、入力パラメータを「?」で定義して位置で紐付けるのではなく、変数名で紐付ける事ができるようになります。
実際に使ってみると、こんな感じのコードになる。個人的には、JDBCのAPIにこの機能ほしいと思ってしまいます。
// 入力パラメータは、":" + 変数名として定義する。
// prepareStatementの戻りを、OraclePreparedStatementにキャストする。
// Oracleの拡張機能を使うのでキャストしてあげないといけない。
OraclePreparedStatement statement = (OraclePreparedStatement) connection.prepareStatement( 
        insert into test (c1, c2, c3) values (:c1, :c2, :c3)"); 
try { 
    // setStringを使用するのではなく、Oracle拡張機能のsetStringAtNameを使う。 
    // 第一引数には、位置ではなく変数名(SQL文で定義した変数名(:を除いた物))を設定する。 
    statement.setStringAtName("c1", "1"); 
    statement.setStringAtName("c2", "あ"); 
    // 数値型の場合には、setIntAtNameを使用する。
    statement.setIntAtName("c3", 12345); 
    statement.executeUpdate(); 
} finally { 
    statement.close(); 
}※setメソッドは、java.sql.PreparedStatementに用意されているsetXXXに対応するsetXXXAtNameがあります。IDEを使えば保管できるので何を使えばいいかはまず迷うことはないと思います。
