- 浏览: 3499784 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
大 家都知道,mybatis的自带分页方法只是逻辑分 页,如果数据量很大,内存一定会溢出,不知道为什么开源组织不在里面集成hibernate的物理分页处理方法!在不修改mybatis源代码的情况下, 应该怎么使mybatis支持物理分页呢?参考了网上的一些信息,有了下面的解决方法:以oracle为例子
1.把hibernate下的dialect包全部拷贝到mybatis包的jdbc目录下,如下图所示:
2.定义一个ResultSetHandler Interceptor
package cn.machi.utils;
import java.sql.Statement;
import java.util.Properties;
import org.apache.ibatis.executor.resultset.FastResultSetHandler;
import org.apache.ibatis.executor.resultset.ResultSetHandler;
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.session.RowBounds;
@Intercepts( {@Signature(type
= ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})})
public class DiclectResultSetHandlerInterceptor implements Interceptor
{
public Object intercept(Invocation invocation) throws Throwable
{
FastResultSetHandler resultSet = (FastResultSetHandler)invocation.getTarget();
RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(resultSet,
"rowBounds");
if (rowBounds.getLimit() > 0
&& rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
{
ReflectUtil.setFieldValue(resultSet, "rowBounds", new RowBounds());
}
return invocation.proceed();
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
3.定义一个StatementHandler的Interceptor
package cn.machi.utils;
import java.sql.Connection;
import java.util.Properties;
import org.apache.ibatis.executor.statement.PreparedStatementHandler;
import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.jdbc.dialect.OracleDialect;
import org.apache.ibatis.mapping.BoundSql;
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.session.RowBounds;
@Intercepts( {@Signature(type
= StatementHandler.class, method = "prepare", args = {Connection.class})})
public class DiclectStatementHandlerInterceptor implements Interceptor
{
private static final String DIALECT = "org.apache.ibatis.jdbc.dialect.OracleDialect";
public Object intercept(Invocation invocation) throws Throwable
{
RoutingStatementHandler statement = (RoutingStatementHandler)invocation.getTarget();
PreparedStatementHandler handler = (PreparedStatementHandler)ReflectUtil.getFieldValue(statement,
"delegate");
RowBounds rowBounds = (RowBounds)ReflectUtil.getFieldValue(handler,
"rowBounds");
if (rowBounds.getLimit() > 0
&& rowBounds.getLimit() < RowBounds.NO_ROW_LIMIT)
{
BoundSql boundSql = statement.getBoundSql();
String sql = boundSql.getSql();
OracleDialect dialect = (OracleDialect)Class.forName(DIALECT)
.newInstance();
sql = dialect.getLimitString(sql,
rowBounds.getOffset(),
rowBounds.getLimit());
ReflectUtil.setFieldValue(boundSql, "sql", sql);
}
return invocation.proceed();
}
public Object plugin(Object target)
{
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties)
{
}
}
4.定义工具类ReflectUtil
package cn.machi.utils;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.log4j.Logger;
public class ReflectUtil
{
private static Logger log = Logger.getLogger(ReflectUtil.class);
private static Object operate(Object obj, String fieldName,
Object fieldVal, String type)
{
Object ret = null;
try
{
// 获得对象类型
Class<? extends Object> classType = obj.getClass();
// 获得对象的所有属性
Field fields[] = classType.getDeclaredFields();
for (int i = 0; i < fields.length; i++)
{
Field field = fields[i];
if (field.getName().equals(fieldName))
{
String firstLetter = fieldName.substring(0, 1)
.toUpperCase(); // 获得和属性对应的getXXX()方法的名字
if ("set".equals(type))
{
String setMethodName = "set" + firstLetter
+ fieldName.substring(1); // 获得和属性对应的getXXX()方法
Method setMethod = classType.getMethod(setMethodName,
new Class[] {field.getType()}); // 调用原对象的getXXX()方法
ret = setMethod.invoke(obj, new Object[] {fieldVal});
}
if ("get".equals(type))
{
String getMethodName = "get" + firstLetter
+ fieldName.substring(1); // 获得和属性对应的setXXX()方法的名字
Method getMethod = classType.getMethod(getMethodName,
new Class[] {});
ret = getMethod.invoke(obj, new Object[] {});
}
return ret;
}
}
}
catch (Exception e)
{
log.warn("reflect error:" + fieldName, e);
}
return ret;
}
public static Object getVal(Object obj, String fieldName)
{
return operate(obj, fieldName, null, "get");
}
public static void setVal(Object obj, String fieldName, Object fieldVal)
{
operate(obj, fieldName, fieldVal, "set");
}
private static Method getDeclaredMethod(Object object, String methodName,
Class<?>[] parameterTypes)
{
for (Class<?> superClass = object.getClass(); superClass
!= Object.class; superClass = superClass.getSuperclass())
{
try
{
//superClass.getMethod(methodName, parameterTypes);
return superClass.getDeclaredMethod(methodName, parameterTypes);
}
catch (NoSuchMethodException e)
{
//Method 不在当前类定义, 继续向上转型
}
}
return null;
}
private static void makeAccessible(Field field)
{
if (!Modifier.isPublic(field.getModifiers()))
{
field.setAccessible(true);
}
}
private static Field getDeclaredField(Object object, String filedName)
{
for (Class<?> superClass = object.getClass(); superClass
!= Object.class; superClass = superClass.getSuperclass())
{
try
{
return superClass.getDeclaredField(filedName);
}
catch (NoSuchFieldException e)
{
//Field 不在当前类定义, 继续向上转型
}
}
return null;
}
public static Object invokeMethod(Object object, String methodName,
Class<?>[] parameterTypes, Object[] parameters)
throws InvocationTargetException
{
Method method = getDeclaredMethod(object, methodName, parameterTypes);
if (method == null)
{
throw new IllegalArgumentException("Could not find method ["
+ methodName + "] on target [" + object + "]");
}
method.setAccessible(true);
try
{
return method.invoke(object, parameters);
}
catch (IllegalAccessException e)
{
}
return null;
}
public static void setFieldValue(Object object, String fieldName,
Object value)
{
Field field = getDeclaredField(object, fieldName);
if (field == null)
throw new IllegalArgumentException("Could not find field ["
+ fieldName + "] on target [" + object + "]");
makeAccessible(field);
try
{
field.set(object, value);
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
}
public static Object getFieldValue(Object object, String fieldName)
{
Field field = getDeclaredField(object, fieldName);
if (field == null)
throw new IllegalArgumentException("Could not find field ["
+ fieldName + "] on target [" + object + "]");
makeAccessible(field);
Object result = null;
try
{
result = field.get(object);
}
catch (IllegalAccessException e)
{
e.printStackTrace();
}
return result;
}
}
5.更新mapper configuration文件,添加如下几条,注意plugins在整个configuration文件中的顺序
<plugins>
<plugin interceptor="functionPoint.db.DiclectStatementHandlerInterceptor"/>
<plugin interceptor="functionPoint.db.DiclectResultSetHandlerInterceptor"/>
</plugins>
6.使用方法同mybatis逻辑分页,拦截器会自动拦截执行SQL的地方,加上分页代码:
getSqlSession().selectList(mapId, queryKey,new RowBounds(pageId, pageSize));
好了,大功告成!
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74145在java.lang包中有String.sp ... -
说明SOA监管(SOA Governance)实例(收录备查)
2012-12-19 11:35 1750SOA 已经不是单纯技术问 ... -
Injecting Spring Beans into Java Servlets
2012-11-01 10:21 1934If you are working in a Java ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3757原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23491Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2133FitNesse began its life using ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:17 3881When I try to install the And ... -
Eclipse Indigo - Cannot install Android ADT Plugin
2012-02-29 01:13 1985When I try to install the And ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5516我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2346WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1565Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2119终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1709charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22609Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4881来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2369本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8682一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2901近来由于项目需要做Single Sign On, 研究了一 ... -
使用IntrospectorCleanupListener 解决quartz引起的内存泄漏
2011-04-20 11:59 13357"在服务器运行过程中,Spring不停的运行的计划任 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3700目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ...
相关推荐
MyBatis-Plus 支持所有 Mybatis 原生的特性。 MyBatis-Plus 的特性包括: * 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 * 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接...
在本文中,我们将深入探讨如何在Spring框架中结合MyBatis实现数据库的分页功能。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。而Spring作为流行的Java企业级应用框架,提供了强大的依赖...
mybatis 分页 mybatis-generate Oracle数据库 大家知道mybatis自动生成代码是没有分页功能的 我在网上找了很久 有很多内容 但正真可以使用的少之又少 本人整合了网上的资源 整理了基于Oracle数据库的mybatis插件 ...
3. **支持动态SQL**:在分页查询中,插件能够与Mybatis的动态SQL完美结合,不影响原有的动态条件构建。 4. **性能优化**:通过预编译SQL和使用存储过程等方式,提高分页查询的执行效率,减少不必要的数据传输。 5. *...
在分页查询场景下,MyBatis会被用来执行带有分页条件的SQL查询。 以下是实现分页查询的步骤: 1. **创建JSP页面**:在JSP页面上,创建一个表单来接收用户的分页参数,如当前页和每页记录数。此外,还需展示从...
该插件兼容多种主流数据库,如MySQL、Oracle、SQL Server,并且易于扩展以支持其他数据库。 在MySQL中,物理分页通常使用`LIMIT`和`OFFSET`关键字来实现。然而,`OFFSET`在处理大量数据时可能导致性能下降,因为...
对于Oracle数据库,由于不支持LIMIT和OFFSET,我们需要利用ROWNUM伪列来实现分页。ROWNUM会在查询时为每行数据生成一个唯一的序列号。我们可以结合子查询和这个序列号来获取特定范围的记录。以下是一个示例: ```...
它支持多种数据库,包括MySQL,且与MyBatis集成简单,大大简化了分页操作。 五、TestPage2文件 在给定的压缩包中,可能包含了一个名为TestPage2的测试文件。这个文件可能是用来验证上述分页功能的实现,或者是一个...
在提供的`pagination-demo`压缩包中,可能包含了一个完整的MyBatis分页示例,包括了XML映射文件、Java代码以及如何在前端展示分页导航的示例。通过研究这个示例,可以更直观地理解和掌握MyBatis的分页技巧。
《MyBatis分页详解与实战应用》 在现代Web开发中,数据的分页展示是必不可少的功能,尤其是在处理大量数据时,为了提高用户体验和优化性能,MyBatis提供了强大的分页支持。本文将深入探讨MyBatis的分页原理,并结合...
3. **分页插件**:PageHelper是常用的MyBatis分页插件,它能自动处理物理分页。在项目的pom.xml中引入PageHelper依赖,然后在MyBatis的配置文件中启用插件,并设置相关属性,如dialect(数据库类型)。 4. **Spring...
MyBatis 是一款著名的 Java 持久层框架,它简化了数据库操作,提供了动态 SQL 功能,并且在处理分页查询时也有着强大的支持。本文将深入探讨 MyBatis 的分页源码,理解其背后的实现机制。 首先,我们要明白 MyBatis...
在Service层,我们可以利用MyBatis的分页插件,如PageHelper,自动实现SQL的分页查询。返回结果后,Controller将分页信息和数据传递给视图,如Bootstrap模板,展示分页效果。 权限设置则是为了确保不同用户只能访问...
在本项目中,我们主要...综上所述,这个项目展示了如何在Spring MVC和MyBatis框架下实现一个完整的Web应用,通过PageHelper插件轻松实现分页查询功能。理解并掌握这些知识点,对于开发基于Java的Web应用是非常重要的。
【标题】"mybatis分页插件代码"主要涉及到MyBatis框架中的一种增强功能——分页插件的使用。MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。在处理大数据量时,分页查询是必不可少的优化...
MyBatis 分页插件是针对 MyBatis 框架设计的一款强大的辅助工具,它极大地简化了在数据库查询时的分页操作。在没有分页插件的情况下,开发者需要手动编写分页相关的 SQL 语句,这既繁琐又容易出错。而 PageHelper ...
MyBatis 分页插件是数据库操作中常用的一个工具,它极...总之,MyBatis分页插件是提升开发效率、优化数据库查询的重要工具。通过了解其工作原理和源码,我们可以更好地利用这个插件,为项目提供高效、稳定的分页功能。
在实现MyBatis分页功能时,我们需要添加MyBatis、Spring以及它们的整合包(如mybatis-spring)到项目的依赖列表中。确保版本兼容,这样才能让Spring管理和初始化MyBatis的数据源、SqlSessionFactory、Mapper接口等...