mybatis分页插件

package com.immouo.moyou.core.interceptor;

import java.sql.Connection;
import java.util.Properties;

import org.apache.ibatis.executor.statement.RoutingStatementHandler;
import org.apache.ibatis.executor.statement.StatementHandler;
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;

/**
 * @ClassName: MySqlDataInterceptor
 * @Description: 分页拦截器
 * @author zkd
 *
 */
@Intercepts({ @Signature(method = "prepare", type = StatementHandler.class, args = { Connection.class }) })
public class MySqlDataInterceptor implements Interceptor {
    /**
     * 拦截后要执行的方法
     */
    public Object intercept(Invocation invocation) throws Throwable {
        RoutingStatementHandler handler = (RoutingStatementHandler) invocation.getTarget();
        StatementHandler delegate = (StatementHandler) ReflectUtil.getFieldValue(handler, "delegate");
        BoundSql boundSql = delegate.getBoundSql();
        Object obj = boundSql.getParameterObject();
        if (obj instanceof PageBean) {
            PageBean page = (PageBean) obj;
            String sql = boundSql.getSql();
            String pageSql = this.getPageSql(page, sql);
            ReflectUtil.setFieldValue(boundSql, "sql", pageSql);
        }
        return invocation.proceed();
    }

    /**
     * 拦截器对应的封装原始对象的方法
     */
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    /**
     * 设置注册拦截器时设定的属性
     */
    public void setProperties(Properties properties) {
    }

    /**
     * 根据page对象获取对应的分页查询Sql语句,这里只做了两种数据库类型,Mysql和Oracle 其它的数据库都 没有进行分页
     *
     * @param page
     *            分页对象
     * @param sql
     *            原sql语句
     * @return
     */
    private String getPageSql(PageBean page, String sql) {
        StringBuffer sqlBuffer = new StringBuffer(sql);
        return getMysqlPageSql(page, sqlBuffer);
    }

    /**
     * 获取Mysql数据库的分页查询语句
     * 
     * @param page
     *            分页对象
     * @param sqlBuffer
     *            包含原sql语句的StringBuffer对象
     * @return Mysql数据库分页语句
     */
    private String getMysqlPageSql(PageBean page, StringBuffer sqlBuffer) {
        // 计算第一条记录的位置,Mysql中记录的位置是从0开始的。
        int offset = (page.getPageNumber() - 1) * page.getPageSize();
        sqlBuffer.append(" LIMIT ").append(offset).append(",").append(page.getPageSize());
        return sqlBuffer.toString();
    }
package com.immouo.moyou.core.interceptor;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.type.Alias;
import org.springframework.util.ObjectUtils;

/**
 * @ClassName: PageBean
 * @author Administrator
 *
 */
@Alias(value = "PageBean")
public class PageBean {
    /** 当前页 */
    private int pageNumber = 20;
    private int pageSize = 1;
    /** 当前页显示记录条数 */
    @SuppressWarnings("rawtypes")
    private List rows;

    private int total;

    private Map<String, Object> conditions = new HashMap<>();

    public int getPageNumber() {
        return pageNumber;
    }

    public void setPageNumber(int pageNumber) {
        this.pageNumber = pageNumber;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    @SuppressWarnings("rawtypes")
    public List getRows() {
        return rows;
    }

    @SuppressWarnings("rawtypes")
    public void setRows(List rows) {
        this.rows = rows;
    }

    public int getTotal() {
        return total;
    }

    public void setTotal(int total) {
        this.total = total;
    }

    public Map<String, Object> getConditions() {
        return conditions;
    }

    public void setConditions(Map<String, Object> conditions) {
        this.conditions = conditions;
    }

    public void addConditions(String key, Object value) {
        if (ObjectUtils.isEmpty(conditions)) {
            this.conditions = new HashMap<String, Object>();
        }
        if (!ObjectUtils.isEmpty(value)) {

            this.conditions.put(key, value);
        }
    }

    @Override
    public String toString() {
        return "PageBean [pageNumber:" + pageNumber + ", pageSize:" + pageSize + ", rows:" + rows + ", total:" + total
                + ", conditions:" + conditions + "]";
    }

}

service调用:

    @Override
    public List<Newest> queryCreateCircle(CircleData circleData) {

        PageBean pageBean = new PageBean();
        pageBean.setPageNumber(circleData.getPageNumber());
        pageBean.setPageSize(circleData.getPageSize());
        Map<String, Object> map = new HashMap<>();
        map.put("userId", circleData.getUserId());
        pageBean.setConditions(map);

        List<Newest> result = newestMapper.queryCreateCircle(pageBean);

XML:

    <select id="queryCreateCircle" resultMap="BaseResultMap" parameterType="PageBean">
        SELECT  
            c.id,
            c.avatar,
            c.circle_name,
            c.circle_introduction,
            c.member_total,
            c.topic_total
        FROM
            t_circle c
        WHERE
            c.creator_id=#{conditions.userId} ***<----注意:分页一定要加conditions***
    </select>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值