sql для пейджинговой доски объявлений в jsp - PullRequest
0 голосов
/ 16 октября 2018

Я пытаюсь сделать доску объявлений, и до применения функции подкачки он хорошо показывал сообщения.

но после того, как я применил функцию пейджинга, он показывает только один пост, а функция пейджинга хорошо показывает страницы.

так что я думаю, что это проблема SQL.когда я пытаюсь показать количество, он показывает 1. даже я пытался с этим показывает 1.

sql = "select * from mvc_board ";

это мой sql

 String sql = "SELECT ROWNUM, bId, bName, bTitle, bContent," +
               "bDate, bHit, bGroup, bStep, bIndent " +
               "from(select * from mvc_board order by bGroup DESC , bStep asc)";

я пытался сделать мой из этого sql.но не мог понять.

sql = "select *, (select u_name from user where idx = writer_fk) writer, (select idx from answer where idx = answer_fk) answer from board order by idx desc limit "+startRow+", "+endRow;

исх.http://queserasera.tistory.com/14

это DAO

  public ArrayList<BDto> getBoardList(int startRow, int endRow, String keyField, String keyWord) {
        ArrayList<BDto> dtos = new ArrayList<BDto>();
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        String sql = "SELECT ROWNUM, bId, bName, bTitle, bContent," +
               "bDate, bHit, bGroup, bStep, bIndent " +
               "from(select * from mvc_board order by bGroup DESC , bStep asc)";
       System.out.println(sql);
         try{
            if(keyWord != null && !keyWord.equals("") && !keyWord.equals("null")) {
                sql += " WHERE " + keyField.trim() +" LIKE '%"+keyWord.trim()+"%'";
            }


           connection =  dataSource.getConnection();

           //특정행부터  레코드를 가져오기 위해서 옵션 설정
           preparedStatement = connection.prepareStatement(sql);
            resultSet = preparedStatement.executeQuery();

           while(resultSet.next()){

             int count=0;

                int ROWNUM = resultSet.getInt("ROWNUM");
                int bId = resultSet.getInt("bId");
                String bName = resultSet.getString("bName");
                String bTitle = resultSet.getString("bTitle");
                String bContent = resultSet.getString("bContent");
                Timestamp bDate = resultSet.getTimestamp("bDate");
                int bHit = resultSet.getInt("bHit");
                int bGroup = resultSet.getInt("bGroup");
                int bStep = resultSet.getInt("bStep");
                int bIndent = resultSet.getInt("bIndent");

                BDto dto = new BDto(ROWNUM, bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent);
                dtos.add(dto);

                  count++;
                  System.out.println(count);
             //while문끝

           }//if문끝


        }catch (Exception e) {
           System.out.println(e+"=> getBoardList fail");
       }finally {
            try {
                if(resultSet != null) resultSet.close();
                if(preparedStatement != null) preparedStatement.close();
                if(connection != null) connection.close();
            } catch (Exception e2) {
                // TODO: handle exception
                e2.printStackTrace();
            }
        }

       return dtos;
   }

============= добавлен sql на sql developer ===================================

select rn, bId, bName, bTitle, bContent, bDate, bHit, bGroup, bStep, bIndent 
from ( select b.*, row_number() over (order by bGroup DESC, bStep asc) rn
from mvc_board b %s ) 
where rn between 1 and 10
order by rn;

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Основной проблемой в вашем методе getBoardList() было использование if (resultSet.next()) вместо while (resultSet.next()) при итерации набора результатов;это привело к тому, что код возвращал только один DTO.

Есть и другие вещи, которые вы должны учитывать.Например, начиная с Java 7, для обработки ресурсов JDBC предпочтительнее использовать оператор try-with resources вместо традиционного try-finally.

Важно отметить, что поле вводаТакие имена, как keyField в пользовательском интерфейсе, являются очень плохой практикой, поскольку они делают запрос уязвимым для SQL-инъекции .По крайней мере, вы должны создать статический белый список разрешенных имен полей для очистки входных данных, если вы не можете использовать статические условия WHERE.

Наконец, пейджинговые запросы в Oracle 11g традиционно выполняются со встроенным представлением, использующим row_number аналитическая функция .Обратите внимание, что нумерация строк начинается с 1. Начиная с Oracle 12c, можно использовать ограничивающее строку условие , и встроенное представление больше не требуется.

Пример реализации, учитывающий вышеизложенноеТочки могут выглядеть следующим образом:

 public List<BDto> getBoardList(int startRow, int endRow, String keyField, String keyWord) {

    List<BDto> dtos = new ArrayList<BDto>();

    // the %s in the template will be replaced with a 
    // WHERE condition when a keyword is present
    final String sqlTemplate = "select rn, bId, bName, bTitle, "
            + "bContent, bDate, bHit, bGroup, bStep, bIndent "
            + "from ( "
            + "     select b.*, row_number() over (order by bGroup DESC, bStep asc) rn" 
            + "    from mvc_board b %s "
            + "    ) "
            + "    where rn between ? and ? "
            + "order by rn";

    boolean whereCondition = false;

    String sql = null;

    if (keyWord != null && !keyWord.equals("") && !keyWord.equals("null")) {
        sql = String.format(sqlTemplate, 
                   " WHERE " + keyField.trim() + " LIKE '%' || ? || '%'");
        whereCondition = true;
    } else {
        sql = String.format(sqlTemplate, "");
    }

    System.out.println(sql);

    try (Connection connection = dataSource.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql)) {

        int parameterIndex = 1;

        if (whereCondition) {
            preparedStatement.setString(parameterIndex++, keyWord);
        }
        preparedStatement.setInt(parameterIndex++, startRow);
        preparedStatement.setInt(parameterIndex, endRow);

        try (ResultSet resultSet = preparedStatement.executeQuery()) {

            int count = 0;

            while (resultSet.next()) {

                int ROWNUM = resultSet.getInt("rn");
                int bId = resultSet.getInt("bId");
                String bName = resultSet.getString("bName");
                String bTitle = resultSet.getString("bTitle");
                String bContent = resultSet.getString("bContent");
                Timestamp bDate = resultSet.getTimestamp("bDate");
                int bHit = resultSet.getInt("bHit");
                int bGroup = resultSet.getInt("bGroup");
                int bStep = resultSet.getInt("bStep");
                int bIndent = resultSet.getInt("bIndent");

                dtos.add(new BDto(ROWNUM, bId, bName, bTitle, 
                        bContent, bDate, bHit, bGroup, bStep, bIndent));

                count++;
            }
            System.out.println(count);
        }

    } catch (SQLException e) {
        System.out.println(e + "=> getBoardList fail");
    }

    return dtos;
}
0 голосов
/ 16 октября 2018

В приведенном вами примере добавление подкачки добавляется предложением limit, но ORACLE имеет собственный синтаксис для них.Попробуйте:

 String sql = "SELECT rown, bId, bName, bTitle, bContent," +
              "bDate, bHit, bGroup, bStep, bIndent " +
              "from(select rownum rown, mvc_board.* from mvc_board order by bGroup DESC , bStep asc) " +
              "WHERE rown between ? and ? ";

Bind startRow и endRow перед выполнением запроса:

preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,startRow);
preparedStatement.setInt(2,endRow);
resultSet = preparedStatement.executeQuery();

Измените WHERE на AND:

sql +=" and " + keyField.trim()+" LIKE '%"+keyWord.trim()+"%'" ;

И, наконец, измените if(resultSet.next()){ обратно на цикл while, чтобы получить в результате более одной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...