我遇到了一些麻烦,可视化我如何使用MySQL数据库,Java servlet以及使用javascript显示结果来完成对大型数据集的分页。
我正在开发一个带有小数据集的个人项目,以尝试学习Java servlets / MySQL / JavaScript。我有一个电影数据库,其中包含MySQL中的一些电影名称和其他属性:
CREATE TABLE `movies` (
`id` int(11) NOT NULL AUTO INCREMENT,
`title` varchar(100) NOT NULL DEFAULT '',
`year` int(4) NOT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
然后我有一个Movie java bean:
// Movie bean
import java.io.Serializable;
public class Movie implements Serializable {
// Instance variables
private Long id;
private String title;
private int year;
public Movie() {}
// Setters
public void setId (long id) { this.id = id; }
public void setTitle (String title) { this.title = title; }
public void setYear (int year) { this.year = year; }
// Getters
public long getId() { return id; }
public String getTitle() { return title; }
public int getYear() { return year; }
}
A MovieDAO
访问数据库并检索所有电影的列表(下面是摘录,假设我已连接到数据库):
public class MovieDAO {
private List<Movie> movies;
private static ResultSet queryMovies(String st) throws SQLException {
ResultSet res = null;
try {
PreparedStatement ps = dbcon.prepareStatement(st);
res = ps.executeQuery();
} catch(SQLException e) {
System.out.println("Error with movieDAO query");
e.printStackTrace();
}
return res;
}
public List<Movie> listMovies() throws SQLException {
movies = new ArrayList<Movie>();
ResultSet res = queryMovies("SELECT * FROM movies");
while(res.next()) {
Movie mov = new Movie();
mov.setId(res.getLong("id"));
mov.setTitle(res.getString("title"));
mov.setYear(res.getInt("year"));
movies.add(mov);
}
return movies;
}
}
最后我的MovieServlet
类只显示作为列表的JSP变量的所有信息:
@WebServlet("/movies")
public class MovieServlet extends HttpServlet {
private MovieDAO movieDAO;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
movieDAO = new MovieDAO();
try {
List<Movie> movies = movieDAO.listMovies();
request.setAttribute("movies", movies); // JSP variable: ${movies}
request.getRequestDispatcher("movies.jsp").forward(request, response);
} catch (SQLException e) {
throw new ServletException("Could not retrieve movies from the database",e);
}
movieDAO.closeMovieDAO();
}
}
对于事物的前端,我有一个通过jsp和javascript填充的表。我最初只有一个像这样生成的页码列表:
function showPageNumber() {
var html = '';
for(i = num_of_pages; i > 0; i--) { html += "<li class='page'><a>" + i + "</a></li>"; }
$('.page').click(function() {
result_min = ($(this).text() - 1) * results_per_page;
result_max = $(this).text() * results_per_page;
show(result_min,result_max);
});
}
function show(min,max) {
var $rows = $('#result_table');
$rows.hide().slice(min, max).show();
}
在id为result_table
的表的每一行中,我有jsp变量。我还有一个sort
函数,所以当用户点击表格的每个标题时,它会按标题排序(即点击id
将按升序id
排序)。这对于几千部电影记录来说效果很好,而且实际上相对较快。
然后我在数据库中插入了大约80,000条记录。令人惊讶的是,加载所有这些数据需要很长时间。排序需要更长时间。
为了解决这个问题,我只想让用户访问next
按钮,前十个页码按钮和一个转到最后一页的last
按钮。我认为限制可能的电影数量有助于更快地显示数据。
我现在的问题是如何对每条记录进行排序并正确显示所有内容?例如,如果用户按id
排序,他们将获得升序id
的列表,如下所示:
1 - movie1 - 1990
2 - movie2 - 1996
3 - movie3 - 1934
如果他们点击相同的标题,订单将会反转:
3 - movie3 - 1934
2 - movie2 - 1996
1 - movie1 - 1990
但是,如果我限制检索的数据量,但我有一个范围为1-80,000的id,我如何重新排序所有数据并以相反的顺序检索id值..而不必调用再次SELECT
?