package com.test.util;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import javax.xml.bind.PropertyException;
import org.apache.ibatis.executor.ErrorContext;
import org.apache.ibatis.executor.ExecutorException;
import org.apache.ibatis.executor.statement.BaseStatementHandler;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.mapping.ParameterMode;
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.MetaObject;
import org.apache.ibatis.reflection.property.PropertyTokenizer;
import org.apache.ibatis.scripting.xmltags.ForEachSqlNode;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.apache.log4j.Logger;
import org.springframework.util.StringUtils;
import com.test.entity.Page;
/**
*
* 类名称:分页插件
* 类描述:
* @author zte
* 作者单位:
* 联系方式:
* 修改时间:2016年2月1日
* @version 1.0
*/
@Intercepts({@Signature(type=StatementHandler.class,method="prepare",args={Connection.class})})
public class PagePlugin implements Interceptor {
private static String dialect = ""; //数据库方言
private static String pageSqlId = ""; //mapper.xml中需要拦截的ID(正则匹配)
private static final Logger logger = Logger.getLogger(PagePlugin.class);
public Object intercept(Invocation ivk) throws Throwable {
if(ivk.getTarget() instanceof RoutingStatementHandler){
RoutingStatementHandler statementHandler = (RoutingStatementHandler)ivk.getTarget();
BaseStatementHandler delegate = (BaseStatementHandler) ReflectHelper.getValueByFieldName(statementHandler, "delegate");
MappedStatement mappedStatement = (MappedStatement) ReflectHelper.getValueByFieldName(delegate, "mappedStatement");
if(mappedStatement.getId().matches(pageSqlId)){ //拦截需要分页的SQL
BoundSql boundSql = delegate.getBoundSql();
Object parameterObject = boundSql.getParameterObject();//分页SQL<select>中parameterType属性对应的实体参数,即Mapper接口中执行分页方法的参数,该参数不得为空
if(parameterObject==null){
throw new NullPointerException("parameterObject尚未实例化!");
}else{
Connection connection = (Connection) ivk.getArgs()[0];
String sql = boundSql.getSql();
//String countSql = "select count(0) from (" + sql+ ") as tmp_count"; //记录统计
String fhsql = sql;
String countSql = "select count(0) from (" + fhsql+ ") tmp_count"; //记录统计 == oracle 加 as 报错(SQL command not properly ended)
PreparedStatement countStmt = connection.prepareStatement(countSql);
BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(),countSql,boundSql.getParameterMappings(),parameterObject);
setParameters(countStmt,mappedStatement,countBS,parameterObject);
ResultSet rs = countStmt.executeQuery();
int count = 0;
if (rs.next()) {
count = rs.getInt(1);
}
rs.close();
countStmt.close();
Page page = null;
if(parameterObject instanceof Page){ //参数就是Page实体
page = (Page) parameterObject;
page.setEntityOrField(true);
page.setTotalResult(count);
}else{ //参数为某个实体,该实体拥有Page属性
Field pageField = ReflectHelper.getFieldByFieldName(parameterObject,"page");
if(pageField!=null){
page = (Page) ReflectHelper.getValueByFieldName(parameterObject,"page");
if(page==null)
page = new Page();
page.setEntityOrField(false);
page.setTotalResult(count);
ReflectHelper.setValueByFieldName(parameterObject,"page", page); //通过反射,对实体对象设置分页对象
}else{
throw new NoSuchFieldException(parameterObject.getClass().getName()+"不存在 page 属性!");
}
}
String pageSql = generatePageSql(sql,page);
ReflectHelper.setValueByFieldName(boundSql, "sql", pageSql); //将分页sql语句反射回BoundSql.
}
}
}
return ivk.proceed();
}
/**
* 对SQL参数(?)设值,参考org.apache.ibatis.executor.parameter.DefaultParameterHandler
* @param ps
* @param mappedStatement
* @param boundSql
* @param parameterObject
* @throws SQLException
*/
@SuppressWarnings({"rawtypes", "unchecked"})
private void setParameters(PreparedStatement ps,MappedStatement mappedStatement,BoundSql boundSql,Object parameterObject) throws SQLException {
ErrorContext.instance().activity("setting parameters").object(mappedStatement.getParameterMap().getId());
List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();
if (parameterMappings != null) {
Configuration configuration = mappedStatement.getConfiguration();
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
MetaObject metaObject = parameterObject == null ? null: configuration.newMetaObject(parameterObject);
for (int i = 0; i < parameterMappings.size(); i++) {
ParameterMapping parameterMapping = parameterMappings.get(i);
if (parameterMapping.getMode() != ParameterMode.OUT) {
Object value;
String propertyName = parameterMapping.getProperty();
PropertyTokenizer prop = new PropertyTokenizer(propertyName);
if (parameterObject == null) {
value = null;
} else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {
value = parameterObject;
} else if (boundSql.hasAdditionalParameter(propertyName)) {
value = boundSql.getAdditionalParameter(propertyName);
} else if (propertyName.startsWith(ForEachSqlNode.ITEM_PREFIX)&& boundSql.hasAdditionalParameter(prop.getName())) {
value = boundSql.getAdditionalParameter(prop.getName());
if (value != null) {
value = configuration.newMetaObject(value).getValue(propertyName.substring(prop.getName().length()));
}
} else {
value = metaObject == null ? null : metaObject.getValue(propertyName);
}
TypeHandler typeHandler = parameterMapping.getTypeHandler();
if (typeHandler == null) {
没有合适的资源?快使用搜索试试~ 我知道了~
springmvc+mybatis+分页整合
共129个文件
jar:29个
class:24个
xml:20个
需积分: 10 8 下载量 200 浏览量
2017-10-12
17:36:04
上传
评论 2
收藏 29.78MB ZIP 举报
温馨提示
eclipse下的maven工程,整合了springmvc框架和mybatis框架以及通用的分页
资源推荐
资源详情
资源评论
收起资源包目录
springmvc+mybatis+分页整合 (129个子文件)
PagePlugin.class 10KB
Page.class 8KB
TestController.class 6KB
TestController.class 4KB
DaoSupport.class 4KB
DaoSupport.class 4KB
PageData.class 4KB
LoginFilter.class 4KB
LoginFilter.class 4KB
SymmetricEncoder.class 3KB
SymmetricEncoder.class 3KB
uploadController.class 3KB
uploadController.class 3KB
ReflectHelper.class 2KB
EncryptPropertyPlaceholderConfigurer.class 2KB
EncryptPropertyPlaceholderConfigurer.class 2KB
UserServiceImpl.class 2KB
UserServiceImpl.class 1KB
FileMeta.class 1KB
FileMeta.class 1KB
DAO.class 468B
DAO.class 468B
UserService.class 454B
UserService.class 380B
.classpath 1KB
org.eclipse.wst.common.component 653B
org.eclipse.wst.jsdt.ui.superType.container 49B
H-ui.css 158KB
H-ui.css 158KB
jquery.fileupload.css 685B
jquery.fileupload.css 685B
loading.gif 4KB
loading.gif 4KB
progressbar.gif 3KB
progressbar.gif 3KB
ojdbc6.jar 2.01MB
ojdbc6.jar 2.01MB
aspectjweaver-1.8.3.jar 1.78MB
druid-1.0.9.jar 1.76MB
jackson-databind-2.5.0.jar 1.08MB
spring-context-4.1.2.RELEASE.jar 1003KB
spring-core-4.1.2.RELEASE.jar 982KB
spring-webmvc-4.1.2.RELEASE.jar 762KB
spring-web-4.1.2.RELEASE.jar 695KB
spring-beans-4.1.2.RELEASE.jar 690KB
mybatis-3.2.1.jar 685KB
spring-test-4.1.2.RELEASE.jar 491KB
log4j-1.2.17.jar 478KB
spring-jdbc-4.1.2.RELEASE.jar 417KB
jstl-1.2.jar 405KB
spring-aop-4.1.2.RELEASE.jar 351KB
jackson-jr-all-2.5.0.jar 296KB
spring-expression-4.1.2.RELEASE.jar 253KB
spring-tx-4.1.2.RELEASE.jar 246KB
jackson-core-2.5.0.jar 224KB
spring-context-support-4.1.2.RELEASE.jar 174KB
commons-io-2.2.jar 170KB
javax.servlet-api-3.0.1.jar 83KB
commons-fileupload-1.3.1.jar 67KB
commons-logging-1.1.3.jar 61KB
spring-aspects-4.1.2.RELEASE.jar 55KB
mybatis-spring-1.2.0.jar 48KB
jackson-annotations-2.5.0.jar 39KB
aopalliance-1.0.jar 4KB
PagePlugin.java 10KB
Page.java 10KB
TestController.java 5KB
SymmetricEncoder.java 5KB
DaoSupport.java 4KB
LoginFilter.java 4KB
PageData.java 3KB
ReflectHelper.java 2KB
uploadController.java 2KB
DAO.java 1KB
EncryptPropertyPlaceholderConfigurer.java 1KB
UserServiceImpl.java 1KB
FileMeta.java 928B
UserService.java 331B
jquery.min.js 94KB
jquery.min.js 94KB
jquery.fileupload.js 62KB
jquery.fileupload.js 62KB
jquery.ui.widget.js 16KB
jquery.ui.widget.js 16KB
jquery.iframe-transport.js 10KB
jquery.iframe-transport.js 10KB
.jsdtscope 575B
goupload.jsp 3KB
goupload.jsp 3KB
upload.jsp 2KB
upload.jsp 2KB
listUser.jsp 1KB
login.jsp 702B
login.jsp 702B
index.jsp 666B
index.jsp 666B
MANIFEST.MF 114B
org.eclipse.wst.jsdt.ui.superType.name 6B
org.eclipse.jdt.core.prefs 736B
org.eclipse.core.resources.prefs 338B
共 129 条
- 1
- 2
资源评论
yufeng005
- 粉丝: 94
- 资源: 18
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功