Java jsp中分页公告板的sql

Java jsp中分页公告板的sql,java,sql,oracle,jsp,oracle11g,Java,Sql,Oracle,Jsp,Oracle11g,我试图做一个布告栏,在应用分页功能之前,它能很好地显示帖子 但在我应用了分页功能后,它只显示一篇文章,分页功能可以很好地显示页面 所以我认为这是一个sql问题。 当我尝试显示count时,它显示1。就连我都试过了 sql = "select * from mvc_board "; 这是我的sql String sql = "SELECT ROWNUM, bId, bName, bTitle, bContent," + "bDate, bHit, bGroup,

我试图做一个布告栏,在应用分页功能之前,它能很好地显示帖子

但在我应用了分页功能后,它只显示一篇文章,分页功能可以很好地显示页面

所以我认为这是一个sql问题。 当我尝试显示count时,它显示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;
参考文献

这是刀

  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;
   }

在您给我们的示例中,分页是通过
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 ? ";
在执行查询之前绑定
startRow
endRow

preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,startRow);
preparedStatement.setInt(2,endRow);
resultSet = preparedStatement.executeQuery();
中的
更改为

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

最后将
if(resultSet.next()){
改回
while
循环,以获得多行结果。

getBoardList()方法中的主要问题是使用
if(resultSet.next())
而不是
while(resultSet.next())
在迭代结果集时;这导致代码只返回一个DTO

还有其他的事情要考虑。例如,从java 7开始,最好使用代替传统的代码>尝试最后< /COD> JDBC资源处理。 需要注意的一件重要事情是,从UI中注入像

keyField
这样的字段名是一种非常糟糕的做法,因为这会使查询容易受到攻击。 如果不能使用静态WHERE条件,则至少应该创建一个允许字段名的静态白名单来清理输入

最后,Oracle 11g中的分页查询通常使用使用的内联视图完成。请注意,行编号从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;
}
public List getBoardList(int startRow、int endRow、String关键字字段、String关键字){
List dtos=new ArrayList();
//模板中的%s将被替换为
//存在关键字时的WHERE条件
最终字符串sqlTemplate=“选择rn、bId、bName、bTitle,”
+“b内容,b日期,bHit,b组,b步骤,绑定”
+“从(”
+选择b.*(按b组描述、b步骤asc排序)上的行号()
+“来自mvc_板b%s”
+ "    ) "
+“你在哪里?和?”
+“rn命令”;
布尔条件=false;
字符串sql=null;
如果(关键字!=null&&!关键字.equals(“”&&!关键字.equals(“null”)){
sql=String.format(sqlTemplate,
其中“+keyField.trim()+”类似“%”| |?| |“%”;
其中条件=真;
}否则{
sql=String.format(sqlTemplate,“”);
}
System.out.println(sql);
try(Connection=dataSource.getConnection();
PreparedStatement PreparedStatement=connection.prepareStatement(sql)){
int参数索引=1;
如果(条件){
preparedStatement.setString(parameterIndex++,关键字);
}
setInt(parameterIndex++,startRow);
preparedStatement.setInt(parameterIndex,endRow);
try(ResultSet ResultSet=preparedStatement.executeQuery()){
整数计数=0;
while(resultSet.next()){
int ROWNUM=resultSet.getInt(“rn”);
int bId=resultSet.getInt(“bId”);
String bName=resultSet.getString(“bName”);
字符串bTitle=resultSet.getString(“bTitle”);
String bContent=resultSet.getString(“bContent”);
时间戳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)(行号、出价、bName、bTitle、,
b组分、b组分、b组分、b组分、b组分、b组分);
计数++;
}
系统输出打印项次(计数);
}
}捕获(SQLE异常){
System.out.println(e+“=>getBoardList失败”);
}
返回DTO;
}

您使用的是哪个Oracle版本?@MickMnemonic 11g!请共享
getTotalRecord()的代码
@mickmemonic我添加了!谢谢!顺便问一下,你怎么知道mvc板有不止一行?用那种sql我无法理解。因为我不知道你的名字,作者,作者,答案,答案。所以现在我使用字符串sql=“SELECT rownm,bId,bName,bTitle,bContent,”+“bDate,bHit,bGroup,bStep,bIndent”+“from(按bgroupdesc,bStep asc从mvc_板顺序选择*)”;我也试着只做%s
部分(请参见
if(关键字!=null…
)中的块)。
 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;
}