Spring JdbcTemplateマルチパラメータクエリー、likeファジイクエリーの処理方法

2182 ワード

最近springのjdbctemplateクエリーを使用して、SpringのIoCコンテナにJdbcTemplateのbeanを構成し、DataSourceを注入してから、JdbcTemplateをカスタムDAOに注入します.
        本題に入ると、原生のjdbcでsql接合問題が存在し、接合すると自然にsql注入ホールの問題が発生する.我々はsql注入ホールを避けるには、前処理の方法にほかならない.sql注入ホールの根本的な原因は直接接合パラメータであるため、プロジェクト中のsqlはsql接合パラメータを拒否する.
      (一):多パラメータを処理する処理方式
        例を直接見ます.
public List getAllOperator(int toPage, int pageSize,
			String login, String name, String oper_group_id, int state) {
		String sql = "select p.id, p.login,p.password,p.name,p.email,p.tel,g.name,p.create_time,p.state,p.withdraw_time from oper_person_info as p "
				+ "left join oper_group_info as g on p.oper_group_id = g.id   where 1 = 1 ";
		List 

      この例は任意に追加されていますが、ここで言うのはsqlを定義するときにStringBufferを使うのが一番いいということです.これは柔軟です.
      (二):likeのパラメータ要求方式を使用する
public List getAllOperator(int toPage, int pageSize,
            String login, String name, String oper_group_id, int state) {
        String sql = "select p.id, p.login,p.password,p.name,p.email,p.tel,g.name,p.create_time,p.state,p.withdraw_time from oper_person_info as p "
                + "left join oper_group_info as g on p.oper_group_id = g.id   where 1 = 1 ";
        List  queryList=new  ArrayList();
        if (!name.equals("")) {
                       sql += " and p.name like ? ";
            queryList.add("%" + name + "%");
        }
        if (!oper_group_id.equals("")) {
            sql += " and p.oper_group_id = ? ";
            queryList.add(oper_group_id);
        }
        if (state == 1 || state == 0) {
            sql += " and p.state = ? ";
            queryList.add(state);
        }
        
        return super.getJdbcTemplate().query(sql, queryList.toArray(),
                new OperatorSimpleMapper());
    }

この場所のlikeは多くの方法でテストされています
sql+=“and p.name=?”;queryList.add("%"+ name + "%") ;これではだめです.また、自分の考えのsql+=「and p.name='%?%」;queryList.add(name")、このように処理して、直接認識しませんか?'、エスケープされたはずです.テストの上の方法は実行可能です.あなたたちを助けてほしいです!