MyBatisブロッキング機能の実現方法
MyBatisブロッキング機能の実現方法
前言:
まず原理を説明します。元のsqlをブロックし、ページごとに検索したキーワードと属性を加えて、新しいsql文にまとめてmybatisに実行します。
業務コード以外に書くものが多くないので、いくつかのキーを提出します。
1、改ページ対象のPage類。このオブジェクトに現在のページ数(先端給)と総記録数(ブロック内賦値)の2つのパラメータを設定します。彼は改ページsql文用の2つのパラメータを計算してくれます。
4、フロントエンドはバックエンドにどのページのパラメータを表示する必要がありますか?service層を通じて照会パラメータを組み立ててからMyBatisに配布して、改ページデータを調べます。私が定義した改ページDAOインターフェースから戻るデータはリストで、改ページクエリ結果を含んでいます。先端はjquery_が使えます。Paginationプラグインは、ページ別の展示を実現します。具体的には、公式のgithubに行って、どのように設定するかを確認してください。
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。
前言:
まず原理を説明します。元のsqlをブロックし、ページごとに検索したキーワードと属性を加えて、新しいsql文にまとめてmybatisに実行します。
業務コード以外に書くものが多くないので、いくつかのキーを提出します。
1、改ページ対象のPage類。このオブジェクトに現在のページ数(先端給)と総記録数(ブロック内賦値)の2つのパラメータを設定します。彼は改ページsql文用の2つのパラメータを計算してくれます。
/**
*
*/
public class Page {
/**
*
*/
private int totalNumber;
/**
*
*/
private int currentPage;
/**
*
*/
private int totalPage;
/**
*
*/
private int pageNumber = 5;
/**
* limit ,
*/
private int dbIndex;
/**
* limit ,
*/
private int dbNumber;
/**
*
*/
public void count() {
//
int totalPageTemp = this.totalNumber / this.pageNumber;
int plus = (this.totalNumber % this.pageNumber) == 0 ? 0 : 1;
totalPageTemp = totalPageTemp + plus;
if(totalPageTemp <= 0) {
totalPageTemp = 1;
}
this.totalPage = totalPageTemp;
//
// ,
if(this.totalPage < this.currentPage) {
this.currentPage = this.totalPage;
}
// 1 1
if(this.currentPage < 1) {
this.currentPage = 1;
}
// limit
this.dbIndex = (this.currentPage - 1) * this.pageNumber;
this.dbNumber = this.pageNumber;
}
public int getTotalNumber() {
return totalNumber;
}
public void setTotalNumber(int totalNumber) {
this.totalNumber = totalNumber;
this.count();
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
this.count();
}
public int getDbIndex() {
return dbIndex;
}
public void setDbIndex(int dbIndex) {
this.dbIndex = dbIndex;
}
public int getDbNumber() {
return dbNumber;
}
public void setDbNumber(int dbNumber) {
this.dbNumber = dbNumber;
}
}
2、キーブロックの実現
package com.imooc.interceptor;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import java.util.Properties;
import org.apache.ibatis.executor.parameter.ParameterHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.reflection.DefaultReflectorFactory;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import com.imooc.entity.Page;
/**
*
*
* @author Skye
*
*/
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class, Integer.class }) })
public class PageInterceptor implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
MetaObject metaObject = MetaObject.forObject(statementHandler, SystemMetaObject.DEFAULT_OBJECT_FACTORY,
SystemMetaObject.DEFAULT_OBJECT_WRAPPER_FACTORY, new DefaultReflectorFactory());
MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");
// MetaObject id:com.XXX.queryMessageListByPage
String id = mappedStatement.getId();
// mybatis id
if (id.matches(".+ByPage$")) {
//BoundSql sql
BoundSql boundSql = statementHandler.getBoundSql();
Map<String, Object> params = (Map<String, Object>) boundSql.getParameterObject();
Page page = (Page) params.get("page");
String sql = boundSql.getSql();
String countSql = "select count(*)from (" + sql + ")a";
Connection connection = (Connection) invocation.getArgs()[0];
PreparedStatement countStatement = connection.prepareStatement(countSql);
ParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");
parameterHandler.setParameters(countStatement);
ResultSet rs = countStatement.executeQuery();
if (rs.next()) {
// getInt(1)? 1
page.setTotalNumber(rs.getInt(1));
System.out.println(" page :" + page.getTotalNumber());
}
String pageSql = sql + " limit " + page.getDbIndex() + "," + page.getDbNumber();
metaObject.setValue("delegate.boundSql.sql", pageSql);
}
return invocation.proceed();
}
/**
* @param target
*
*/
public Object plugin(Object target) {
// , this ( , )
// , ,
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
// TODO Auto-generated method stub
}
}
3、mybatis-config.xmlに自分で書いたブロックを登録します。
<!-- -->
<plugins>
<plugin interceptor=" ">
</plugin>
</plugins>
Dao層に関するmapper.xmlのsql文は変更しなくてもいいです。4、フロントエンドはバックエンドにどのページのパラメータを表示する必要がありますか?service層を通じて照会パラメータを組み立ててからMyBatisに配布して、改ページデータを調べます。私が定義した改ページDAOインターフェースから戻るデータはリストで、改ページクエリ結果を含んでいます。先端はjquery_が使えます。Paginationプラグインは、ページ別の展示を実現します。具体的には、公式のgithubに行って、どのように設定するかを確認してください。
<!--pagination -->
<%
//
String context = request.getContextPath();
%>
<link href="../css/pagination.css" rel="external nofollow" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="../js/jquery-1.11.3.js"></script>
<script type="text/javascript" src="../js/jquery.pagination.js"></script>
<script type="text/javascript">
//
function handlePaginationClick(new_page_index, pagination_container) {
<!-- stuForm . restful , springmvc @PathVariable 。 2 , , 0 , 1 , 1。 -->
$("#stuForm").attr("action", " url/"+(new_page_index+1));
$("#stuForm").submit();
return false;
}
$(function(){
$("#News-Pagination").pagination(${result.totalRecord}, {
items_per_page:${result.pageSize}, //
current_page:${result.currentPage} - 1, //
num_display_entries:8, //
next_text:" ",
prev_text:" ",
num_edge_entries:2, // ,
callback:handlePaginationClick( , div id), //
load_first_page:false // ( !)
});
});
</script>
<!-- c:forEach -->
<!-- -->
<div id="News-Pagination"></div>
この要約を書く目的は、改ページ機能の全体的な解決策を形成することです。4月17、18日から小さいシステムを書きます。この間習ったことを全部使って、終わったら帰ってきます。この文章の中の正しいところを更新します。疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。