Java jsp中分页公告板的sql
我试图做一个布告栏,在应用分页功能之前,它能很好地显示帖子 但在我应用了分页功能后,它只显示一篇文章,分页功能可以很好地显示页面 所以我认为这是一个sql问题。 当我尝试显示count时,它显示1。就连我都试过了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 = "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;
}