【问题标题】:SQL syntax error in pagination query分页查询中的 SQL 语法错误
【发布时间】:2015-11-09 08:30:15
【问题描述】:

我正在尝试在我的 jsp 页面中进行分页。但是我没有从数据库中获取数据。我收到一个错误“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '-10, 5' 附近使用正确的语法”。

我不明白出了什么问题。请您检查我的代码并帮助我解决问题吗?

BooksInfo.java

package com.sreejonee.books;

import java.sql.Date;
import java.sql.Timestamp;

public class BooksInfo {
private int book_id;
private String bookName;
private String filename;
private String writerName;
private String book_details;
private Timestamp date_time;
private int rating;
private int parentscat_id;
private String parentscat_name;
private String thumCoverImag;
private String filePath;


public int getBook_id() {
     return book_id;
}
public void setBook_id(int book_id) {
     this.book_id = book_id;
}
public String getBookName() {
    return bookName;
}
public void setBookName(String bookName) {
    this.bookName = bookName;
}
public String getFilename() {
    return filename;
}
public void setFilename(String filename) {
    this.filename = filename;
}
public String getWriterName() {
    return writerName;
}
public void setWriterName(String writerName) {
    this.writerName = writerName;
}
public String getBook_details() {
    return book_details;
}
public void setBook_details(String book_details) {
    this.book_details = book_details;
}
public Timestamp getDate_time() {
    return date_time;
}
public void setDate_time(Timestamp date_time) {
    this.date_time = date_time;
}
public int getRating() {
    return rating;
}
public void setRating(int rating) {
    this.rating = rating;
}
public int getParentscat_id() {
    return parentscat_id;
}
public void setParentscat_id(int parentscat_id) {
    this.parentscat_id = parentscat_id;
}
public String getParentscat_name() {
    return parentscat_name;
}
public void setParentscat_name(String parentscat_name) {
    this.parentscat_name = parentscat_name;
}
public String getThumCoverImag() {
    return thumCoverImag;
}
public void setThumCoverImag(String thumCoverImag) {
    this.thumCoverImag = thumCoverImag;
}
public String getFilePath() {
    return filePath;
}
public void setFilePath(String filePath) {
    this.filePath = filePath;
}   
}

BooksInfoDAO.java

package com.sreejonee.books;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import com.sreejonee.db.ConnectionFactory;
import com.sreejonee.db.DBConnector;

public class BooksInfoDAO {
 Connection connection;
 Statement stmt;
 private int noOfRecords;
private static Connection getConnection() 
        throws SQLException, 
            ClassNotFoundException 
{
    Connection con = ConnectionFactory.
            getInstance().getConnection();
    System.out.println("connected!");
    return con;
}

public List<BooksInfo> viewAllBooksInfo(int offset, int noOfRecords) {
    String query = "select SQL_CALC_FOUND_ROWS * from library ORDER by date_time DESC limit"+ offset + ", " + noOfRecords;

    List<BooksInfo> bookslist = new ArrayList<BooksInfo>();
    BooksInfo books = null;

    try {
        connection = getConnection();
        stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery(query);
        while (rs.next()) {
            books = new BooksInfo();
            books.setBook_id(rs.getInt("book_id"));
            books.setBook_details(rs.getString("book_details"));
            books.setBookName(rs.getString("bookName"));
            books.setWriterName(rs.getString("writerName"));
            books.setDate_time(rs.getTimestamp("date_time"));
            books.setParentscat_id(rs.getInt("parentscat_id"));
            books.setParentscat_name(rs.getString("parentscat_name"));
            books.setFilename(rs.getString("filename"));
            books.setFilePath(rs.getString("filePath"));
            books.setRating(rs.getInt("rating"));
            books.setThumCoverImag(rs.getString("thumCoverImag"));

            bookslist.add(books);
        }
        rs.close();

        rs = stmt.executeQuery("SELECT FOUND_ROWS()");
        if (rs.next())
            this.noOfRecords = rs.getInt(1);
    } catch (SQLException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        try {
            if (stmt != null) {
                stmt.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
    }
    return bookslist;
}

public int getNoOfRecords() {
    return noOfRecords;
}
}

小服务程序: BooksInfoServlet.java

package com.sreejonee.servlet;

import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sreejonee.books.BooksInfo;
import com.sreejonee.books.BooksInfoDAO;


@WebServlet("/BooksInfoServlet")
public class BooksInfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

/**
 * @see HttpServlet#HttpServlet()
 */
public BooksInfoServlet() {
    super();        
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    int page = 1;
    int recordsPerPage = 5;
    if(request.getParameter("page") != null)
        page = Integer.parseInt(request.getParameter("page"));
    BooksInfoDAO booksInfoDAO = new BooksInfoDAO();
    List<BooksInfo> bookslist = booksInfoDAO.viewAllBooksInfo((page-1)*recordsPerPage, recordsPerPage);
    int noOfRecords = booksInfoDAO.getNoOfRecords();
    int noOfPages = (int) Math.ceil(noOfRecords * 1.0 / recordsPerPage);
    request.setAttribute("booksList", bookslist);
    request.setAttribute("noOfPages", noOfPages);
    request.setAttribute("currentPage", page);
    RequestDispatcher view = request.getRequestDispatcher("user.jsp");
    view.forward(request, response);
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

JSP 页面:

<c:forEach var="books" items="${bookslist}">

<div id="${books.filename}" class="single_midlecontent_component">
    <div class="socialicon_on_post">
        <h4>
            <i class="fa fa-facebook-square"></i>
        </h4>
    </div>
    <div class="title_of_post ">
        <a href="#" class="media-left"> 
            <img class="media-object" src="${books.getFilePath()+File.separator+books.getThumCoverImag()}" alt="...">
        </a>
        <h5 class="media-body ">
            <span><a href="">${books.getBookName()}</a></span>
        </h5>
        <h5 class="media-body ">
            <span>by <a href="">${books.getWriterName()}</a></span>
        </h5>
        <p class="date_time  media-body">${books.getDate_time()}</p>
    </div>
    <div class="body_of_post">
        <p>${books.getBook_details()}</p>
        <img src="" class="img-responsive" alt="Responsive image">
    </div>
    <div class="fb-like" data-href="https://developers.facebook.com/docs/plugins/" data-layout="standard" data-action="like" data-show-faces="true" data-share="true"></div>
    <div class="download_book">
        <form action="DownloadFileServlet" method="post">
            <input type="hidden" name="filename" value="${books.getFilename()}">
            <div>
                <input type="hidden" name="parentscat_name" value="${books.getParentscat_name()}">
            </div>
            <div class="download_button">
                <input class="btn btn-default " type="submit" value="Download">
            </div>
        </form>
    </div>
    <div class="bottom_of_post"></div>
</div>

【问题讨论】:

  • 请提供所需的最少信息。在您的情况下,在我看来,这只是将要执行的最后一条 SQL 语句。否则,人们会试图帮助您节省大量时间阅读不需要的内容,并试图弄清楚他们必须阅读哪些内容,哪些不应该阅读。
  • 只需执行System.out.println(query); 并验证数据库实际获得的任何查询是否正常?

标签: java mysql jdbc


【解决方案1】:

我可以在这里看到两个错误。

第一个:

String query = "select SQL_CALC_FOUND_ROWS * from library ORDER by date_time DESC limit"+ offset + ", " + noOfRecords;

limit 后面少了一个空格——按照你写的方式,它会生成... limit10, 5

第二个:

我认为viewAllBooksInfo() 的调用者给出了错误的offset 参数。根据错误,我假设offset-10,这是非法的,因为MySQL 中limit 子句的参数必须是non-negative

在您更新的问题中,您显示以下代码:

if(request.getParameter("page") != null)
    page = Integer.parseInt(request.getParameter("page"));
BooksInfoDAO booksInfoDAO = new BooksInfoDAO();
List<BooksInfo> bookslist = booksInfoDAO.viewAllBooksInfo((page-1)*recordsPerPage, recordsPerPage);

显然,因为recordsPerPage5,而offset-10page 似乎是-1。您尚未显示调用BooksInfoServlet 的页面的代码,但我猜您已在此处输入-1 作为请求的页码。

【讨论】:

    【解决方案2】:

    在问这个问题之前你应该先看看自己。您应该首先尝试自己消除这些错误。

    如果您查看错误堆栈,它会显示:
    “您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以了解在 '- 附近使用的正确语法10, 5' 在第 1 行"

    如果你仔细看,限制选项是“-10, 5”。 MySQL 中的限制参数应该是非负数。

    BooksInfoDAO.java 代码中:

    public List<BooksInfo> viewAllBooksInfo(int offset, int noOfRecords) {
        String query = "select SQL_CALC_FOUND_ROWS * from library ORDER by date_time DESC limit"+ offset + ", " + noOfRecords;
        ...
    

    您在限制子句和偏移参数之间缺少一个空格。

    【讨论】:

      猜你喜欢
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 2015-01-08
      • 2019-05-10
      • 2021-09-23
      • 1970-01-01
      • 2014-03-16
      相关资源
      最近更新 更多