分页查询中的SQL语法错误

时间:2015-08-16 17:23:36

标签: java mysql jdbc

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

我不明白什么是错的。你能检查我的代码并帮我解决问题吗?

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

的Servlet: 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>

2 个答案:

答案 0 :(得分: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作为请求的页码。

答案 1 :(得分:0)

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

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

如果你仔细看,限制选项是“ - 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;
    ...

你在limit子句和offset参数之间缺少一个空格。