-
java中怎么修改方法的返回值0
mybatis MappedStatement类中有个方法getBoundSql()返回对象是BoundSql ,怎么用我自己的BoundSql对象来替换这个方法的返回?public BoundSql getBoundSql(Object parameterObject) { BoundSql boundSql = sqlSource.getBoundSql(parameterObject); List<ParameterMapping> parameterMappings = boundSql.getParameterMappings(); if (parameterMappings == null || parameterMappings.size() <= 0) { boundSql = new BoundSql(configuration, boundSql.getSql(), parameterMap.getParameterMappings(), parameterObject); } // check for nested result maps in parameter mappings (issue #30) for (ParameterMapping pm : boundSql.getParameterMappings()) { String rmId = pm.getResultMapId(); if (rmId != null) { ResultMap rm = configuration.getResultMap(rmId); if (rm != null) { hasNestedResultMaps |= rm.hasNestedResultMaps(); } } } return boundSql; }
2014年5月23日 21:40
3个答案 按时间排序 按投票排序
-
采纳的答案
要实现修改返回值为类需求,一般要和原来的类实现相同的接口,这个时候在自己的类内部持有原来的类,用“装饰者”或者“代理”这一类的模式,实现自己的功能。
2014年5月24日 10:06
-
package com.ztesoft.common.mybatis.plugin;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
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.MetaObject;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import org.apache.ibatis.reflection.factory.ObjectFactory;
import org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory;
import org.apache.ibatis.reflection.wrapper.ObjectWrapperFactory;
import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
import org.apache.ibatis.session.RowBounds;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ztesoft.common.mybatis.Dialect;
import com.ztesoft.dto.Page;
@Intercepts({ @Signature(type = StatementHandler.class, method = "prepare", args = { Connection.class }) })
public class PageInterceptor implements Interceptor {
// 日志对象
protected static Logger logger = LoggerFactory
.getLogger(PageInterceptor.class);
private static final ObjectFactory DEFAULT_OBJECT_FACTORY = new DefaultObjectFactory();
private static final ObjectWrapperFactory DEFAULT_OBJECT_WRAPPER_FACTORY = new DefaultObjectWrapperFactory();
private String dialect=null;
/*
* (non-Javadoc)
*
* @see
* org.apache.ibatis.plugin.Interceptor#intercept(org.apache.ibatis.plugin
* .Invocation)
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation
.getTarget();
MetaObject metaStatementHandler = MetaObject
.forObject(statementHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
RowBounds rowBounds = (RowBounds) metaStatementHandler
.getValue("delegate.rowBounds");
Connection connection = (Connection) invocation.getArgs()[0];
if (rowBounds == null || rowBounds == RowBounds.DEFAULT) {
// DefaultParameterHandler defaultParameterHandler = (DefaultParameterHandler) metaStatementHandler
// .getValue("delegate.parameterHandler");
// Object parameterObject = defaultParameterHandler.getParameterObject();
// if(parameterObject instanceof Page){
// Page<?> page=(Page<?>)parameterObject;
// //设置查询总条数的sql
// setTotalSql(boundSql,metaStatementHandler,page);
// // 重设分页参数里的总页数等
// setPageParameter(boundSql.getSql(), connection, mappedStatement, boundSql, page);
// return invocation.proceed();
// }else{
return invocation.proceed();
// }
}else{
Page<?> page=(Page<?>)rowBounds;
// Object sidx = parameterMap.get("_sidx");
// Object sord = parameterMap.get("_sord");
// String originalSql = (String) metaStatementHandler
// .getValue("delegate.boundSql.sql");
// if (sidx != null && sord != null) {
// originalSql = originalSql + " order by " + sidx + " " + sord;
// }
//设置查询总条数的sql
setTotalSql(boundSql.getSql(), connection, mappedStatement, boundSql, page);
// 重设分页参数里的总页数等
setPageParameter(boundSql,metaStatementHandler,page);
return invocation.proceed();
}
}
/**
* 设置分页查询语句
* @param boundSql
* @param metaStatementHandler
* @param page
* @throws InstantiationException
* @throws IllegalAccessException
* @throws ClassNotFoundException
*/
public void setPageParameter(BoundSql boundSql,MetaObject metaStatementHandler,Page<?> page) throws InstantiationException, IllegalAccessException, ClassNotFoundException{
Dialect dialect=(Dialect) Class.forName(this.dialect).newInstance();
metaStatementHandler.setValue("delegate.boundSql.sql", dialect
.getLimitString(boundSql.getSql(), page.getStart(),
page.getLimit()));
metaStatementHandler.setValue("delegate.rowBounds.offset",
RowBounds.NO_ROW_OFFSET);
metaStatementHandler.setValue("delegate.rowBounds.limit",
RowBounds.NO_ROW_LIMIT);
if (logger.isDebugEnabled()) {
logger.debug("生成分页SQL : " + boundSql.getSql());
}
}
/*
* (non-Javadoc)
*
* @see org.apache.ibatis.plugin.Interceptor#plugin(java.lang.Object)
*/
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
/**
* 从数据库里查询总的记录数并计算总页数,回写进分页参数<code>PageParameter</code>,这样调用者就可用通过 分页参数
* <code>PageParameter</code>获得相关信息。
*
* @param sql
* @param connection
* @param mappedStatement
* @param boundSql
* @param page
*/
private void setTotalSql(String sql, Connection connection, MappedStatement mappedStatement,
BoundSql boundSql, Page<?> page) {
// 记录总记录数
String countSql = "select count(0) total from (" + sql + ")";
PreparedStatement countStmt = null;
ResultSet rs = null;
try {
countStmt = connection.prepareStatement(countSql);
BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(), countSql,
boundSql.getParameterMappings(), boundSql.getParameterObject());
setParameters(countStmt, mappedStatement, countBS, boundSql.getParameterObject());
rs = countStmt.executeQuery();
int totalCount = 0;
if (rs.next()) {
totalCount = rs.getInt(1);
}
page.setTotalCount(totalCount);
// int totalPage = totalCount / page.getPageSize() + ((totalCount % page.getPageSize() == 0) ? 0 : 1);
// page.setTotalPage(totalPage);
} catch (SQLException e) {
logger.error("Ignore this exception", e);
} finally {
try {
rs.close();
} catch (SQLException e) {
logger.error("Ignore this exception", e);
}
try {
countStmt.close();
} catch (SQLException e) {
logger.error("Ignore this exception", e);
}
}
}
/**
* 对SQL参数(?)设值
*
* @param ps
* @param mappedStatement
* @param boundSql
* @param parameterObject
* @throws SQLException
*/
private void setParameters(PreparedStatement ps, MappedStatement mappedStatement, BoundSql boundSql,
Object parameterObject) throws SQLException {
ParameterHandler parameterHandler = new DefaultParameterHandler(mappedStatement, parameterObject, boundSql);
parameterHandler.setParameters(ps);
}
/*
* (non-Javadoc)
*
* @see
* org.apache.ibatis.plugin.Interceptor#setProperties(java.util.Properties)
*/
/**
* 设置注册拦截器时设定的属性
*/
public void setProperties(Properties properties) {
this.dialect = properties.getProperty("dialect");
}
}2014年5月23日 21:50
-
StatementHandler statementHandler = (StatementHandler) invocation
.getTarget();
MetaObject metaStatementHandler = MetaObject
.forObject(statementHandler, DEFAULT_OBJECT_FACTORY, DEFAULT_OBJECT_WRAPPER_FACTORY);
MappedStatement mappedStatement = (MappedStatement) metaStatementHandler.getValue("delegate.mappedStatement");
BoundSql boundSql = (BoundSql) metaStatementHandler.getValue("delegate.boundSql");
BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(), boundSql ,
boundSql.getParameterMappings(), boundSql.getParameterObject());2014年5月23日 21:48
相关推荐
在Java编程语言中,方法是实现特定功能的代码块,可以被其他代码调用。方法分为不同的类型,根据参数和返回值的有无,主要分为无参无返回值、无参带返回值以及无返回值但有输出。下面将详细讨论这些方法的使用及其...
如果需要在WebView中启用JavaScript调用Android代码的功能,还要在addJavascriptInterface()方法中声明一个Java类的实例,并为其指定一个可以在JavaScript中访问的接口名字。 在Java代码中定义一个内部类,用于接收...
在Java编程语言中,形参(形式参数)和返回值是方法的重要组成部分,它们定义了方法的行为和交互方式。在这个“java 形参和返回值练习”中,我们可以通过分析提供的文件来深入理解这两个概念。 首先,让我们看下`...
数组作为方法返回值类型 学习目标 1 理解方法返回值类型是数组 引用类型的方法签名; 2 理解并学会数组作为方法返 回值类型的方法编写; 3 理解并熟知数组作为返回值 类型的方法调用。 方法的返回值类型 方法的...
在本文中,我们将深入探讨Java中无参带返回值方法的使用,以及它们在实际编程中的应用。 首先,让我们了解方法的定义。在Java中,方法声明由返回类型、方法名、一对圆括号和方法体组成。对于无参带返回值的方法,...
本篇将深入探讨Java中带参数和返回值的方法,以及如何在实际开发中有效利用它们。 一、方法的定义与调用 1. 定义方法:方法由一个方法头和方法体组成。方法头包括方法名、返回类型(如果有的话)和参数列表。例如...
如果需要返回值,则方法体中至少要有一个"return 表达式;" 语句。 图a中的代码没有逻辑错误,但编译不能通过,因为java编译器认为可能没有return语句。 注意 public static int sign(int n) { if (n > 0) return 1...
Java中的“缺少返回值”错误是指在编译期间,当方法的返回类型不是void时,编译器无法在所有可能的执行路径上找到return语句,导致编译失败的情况。这类错误的成因主要涉及方法的返回类型声明、代码中控制流语句的...
本篇文章将详细讲解Java中带参无返回值方法的使用,帮助开发者更好地理解和运用这一核心概念。 1. 方法定义: 在Java中,一个无返回值的方法会被声明为`void`类型。这样的方法没有`return`语句,其主要目的是执行一...
方法(1)-无返回值的方法定义 方法-无返回值的方法定义 清楚方法定义的两个组成部分 理解并正确确定方法的头部 会正确编写无返回值方法的方法体 方法定义 修饰符 返回值类型 方法名(参数列表){ …… …… } 方法...
java调用存储过程,支持获取return值,output返回值,以及查询的表数据,表数据允许有多个查询结果集
子类重写父类的方法时,返回值类型必须相同或者子类方法的返回值类型是父类方法返回值类型的子类。在这里,`short`不是`int`的子类,因此这是错误的。 ##### 2. 抽象方法是否可以是静态的 题目描述: 判断下列语句...
NULL 博文链接:https://icgemu.iteye.com/blog/467848
在深入探讨SpringMVC中方法返回值的具体类型及其使用之前,我们先来简要回顾一下SpringMVC框架的基本概念以及它在整个Java开发过程中的重要性。 #### SpringMVC简介 SpringMVC是Spring框架的一部分,专门用于构建...
在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。Java主要采用值传递的方式。 ##### ...
方法的返回值类型如何定义
在本案例中,"java返回值封装.zip" 提供了一套基于RESTful规范的接口返回值封装方案,旨在简化Java后端开发中的接口设计工作,提高与APP或其他客户端的对接效率。 REST(Representational State Transfer,表述性...
Java方法签名中不包含返回值类型的原因和原理 Java方法签名是Java编程语言中的一种重要概念,它由方法名称和参数列表两部分组成。那么,为什么Java方法签名中不包含返回值类型呢?在本文中,我们将通过两个示例代码...
3. **接收Java返回值** Java服务处理完请求后,会返回一个响应。在Flex中,我们可以监听HTTPService的`result`事件来获取这个响应。在MXML中,可以这样设置: ```xml <mx:HTTPService id="javaService" result=...
完成上述所有步骤后,您只需在编写Java方法时输入`/**`并按`Tab`键,即可自动生成包含方法描述、参数列表以及返回值的完整注释。如果方法没有参数或返回值,则对应的注释部分会被自动省略,从而确保注释内容的简洁性...