您的位置:首页 > 数据库 > MySQL

mybatis -mysql -分页拦截器

2016-08-31 17:30 483 查看
1 拦截器:jsqlparser-0.9.4.jar

/*

 * The MIT License (MIT)

 *

 * Copyright (c) 2014 abel533@gmail.com

 *

 * Permission is hereby granted, free of charge, to any person obtaining a copy

 * of this software and associated documentation files (the "Software"), to deal

 * in the Software without restriction, including without limitation the rights

 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

 * copies of the Software, and to permit persons to whom the Software is

 * furnished to do so, subject to the following conditions:

 *

 * The above copyright notice and this permission notice shall be included in

 * all copies or substantial portions of the Software.

 *

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

 * THE SOFTWARE.

 */

package com.github.pagehelper;

import org.apache.ibatis.executor.Executor;

import org.apache.ibatis.mapping.MappedStatement;

import org.apache.ibatis.plugin.*;

import org.apache.ibatis.session.ResultHandler;

import org.apache.ibatis.session.RowBounds;

import javax.sql.DataSource;

import java.lang.reflect.Method;

import java.sql.Connection;

import java.sql.SQLException;

import java.util.Map;

import java.util.Properties;

import java.util.concurrent.ConcurrentHashMap;

import java.util.concurrent.locks.ReentrantLock;

/**

 * Mybatis - 通用分页拦截器

 *

 * @author liuzh/abel533/isea533

 * @version 3.3.0

 *          项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
 */

@SuppressWarnings("rawtypes")

@Intercepts(@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class}))

public class PageHelper implements Interceptor {

    //sql工具类

    private SqlUtil sqlUtil;

    //属性参数信息

    private Properties properties;

    //配置对象方式

    private SqlUtilConfig sqlUtilConfig;

    //自动获取dialect,如果没有setProperties或setSqlUtilConfig,也可以正常进行

    private boolean autoDialect = true;

    //运行时自动获取dialect

    private boolean autoRuntimeDialect;

    //多数据源时,获取jdbcurl后是否关闭数据源

    private boolean closeConn = true;

    //缓存

    private Map<String, SqlUtil> urlSqlUtilMap = new ConcurrentHashMap<String, SqlUtil>();

    /**

     * 获取任意查询方法的count总数

     *

     * @param select

     * @return

     */

    public static long count(ISelect select) {

        Page<?> page = startPage(1, -1, true);

        select.doSelect();

        return page.getTotal();

    }

    /**

     * 开始分页

     *

     * @param pageNum  页码

     * @param pageSize 每页显示数量

     */

    public static <E> Page<E> startPage(int pageNum, int pageSize) {

        return startPage(pageNum, pageSize, true);

    }

    /**

     * 开始分页

     *

     * @param pageNum  页码

     * @param pageSize 每页显示数量

     * @param count    是否进行count查询

     */

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count) {

        return startPage(pageNum, pageSize, count, null);

    }

    /**

     * 开始分页

     *

     * @param pageNum  页码

     * @param pageSize 每页显示数量

     * @param orderBy  排序

     */

    public static <E> Page<E> startPage(int pageNum, int pageSize, String orderBy) {

        Page<E> page = startPage(pageNum, pageSize);

        page.setOrderBy(orderBy);

        return page;

    }

    /**

     * 开始分页

     *

     * @param offset 页码

     * @param limit  每页显示数量

     */

    public static <E> Page<E> offsetPage(int offset, int limit) {

        return offsetPage(offset, limit, true);

    }

    /**

     * 开始分页

     *

     * @param offset 页码

     * @param limit  每页显示数量

     * @param count  是否进行count查询

     */

    public static <E> Page<E> offsetPage(int offset, int limit, boolean count) {

        Page<E> page = new Page<E>(new int[]{offset, limit}, count);

        //当已经执行过orderBy的时候

        Page<E> oldPage = SqlUtil.getLocalPage();

        if (oldPage != null && oldPage.isOrderByOnly()) {

            page.setOrderBy(oldPage.getOrderBy());

        }

        SqlUtil.setLocalPage(page);

        return page;

    }

    /**

     * 开始分页

     *

     * @param offset  页码

     * @param limit   每页显示数量

     * @param orderBy 排序

     */

    public static <E> Page<E> offsetPage(int offset, int limit, String orderBy) {

        Page<E> page = offsetPage(offset, limit);

        page.setOrderBy(orderBy);

        return page;

    }

    /**

     * 开始分页

     *

     * @param pageNum    页码

     * @param pageSize   每页显示数量

     * @param count      是否进行count查询

     * @param reasonable 分页合理化,null时用默认配置

     */

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable) {

        return startPage(pageNum, pageSize, count, reasonable, null);

    }

    /**

     * 开始分页

     *

     * @param pageNum      页码

     * @param pageSize     每页显示数量

     * @param count        是否进行count查询

     * @param reasonable   分页合理化,null时用默认配置

     * @param pageSizeZero true且pageSize=0时返回全部结果,false时分页,null时用默认配置

     */

    public static <E> Page<E> startPage(int pageNum, int pageSize, boolean count, Boolean reasonable, Boolean pageSizeZero) {

        Page<E> page = new Page<E>(pageNum, pageSize, count);

        page.setReasonable(reasonable);

        page.setPageSizeZero(pageSizeZero);

        //当已经执行过orderBy的时候

        Page<E> oldPage = SqlUtil.getLocalPage();

        if (oldPage != null && oldPage.isOrderByOnly()) {

            page.setOrderBy(oldPage.getOrderBy());

        }

        SqlUtil.setLocalPage(page);

        return page;

    }

    /**

     * 开始分页

     *

     * @param params

     */

    public static <E> Page<E> startPage(Object params) {

        Page<E> page = SqlUtil.getPageFromObject(params);

        //当已经执行过orderBy的时候

        Page<E> oldPage = SqlUtil.getLocalPage();

        if (oldPage != null && oldPage.isOrderByOnly()) {

            page.setOrderBy(oldPage.getOrderBy());

        }

        SqlUtil.setLocalPage(page);

        return page;

    }

    /**

     * 排序

     *

     * @param orderBy

     */

    public static void orderBy(String orderBy) {

        Page<?> page = SqlUtil.getLocalPage();

        if (page != null) {

            page.setOrderBy(orderBy);

        } else {

            page = new Page();

            page.setOrderBy(orderBy);

            page.setOrderByOnly(true);

            SqlUtil.setLocalPage(page);

        }

    }

    /**

     * 获取orderBy

     *

     * @return

     */

    public static String getOrderBy() {

        Page<?> page = SqlUtil.getLocalPage();

        if (page != null) {

            String orderBy = page.getOrderBy();

            if (StringUtil.isEmpty(orderBy)) {

                return null;

            } else {

                return orderBy;

            }

        }

        return null;

    }

    /**

     * Mybatis拦截器方法

     *

     * @param invocation 拦截器入参

     * @return 返回执行结果

     * @throws Throwable 抛出异常

     */

    public Object intercept(Invocation invocation) throws Throwable {

        if (autoRuntimeDialect) {

            SqlUtil sqlUtil = getSqlUtil(invocation);

            return sqlUtil.processPage(invocation);

        } else {

            if (autoDialect) {

                initSqlUtil(invocation);

            }

            return sqlUtil.processPage(invocation);

        }

    }

    /**

     * 初始化sqlUtil

     *

     * @param invocation

     */

    public synchronized void initSqlUtil(Invocation invocation) {

        if (this.sqlUtil == null) {

            this.sqlUtil = getSqlUtil(invocation);

            if (!autoRuntimeDialect) {

                properties = null;

                sqlUtilConfig = null;

            }

            autoDialect = false;

        }

    }

    /**

     * 获取url

     *

     * @param dataSource

     * @return

     */

    public String getUrl(DataSource dataSource){

        Connection conn = null;

        try {

            conn = dataSource.getConnection();

            return conn.getMetaData().getURL();

        } catch (SQLException e) {

            throw new RuntimeException(e);

        } finally {

            if(conn != null){

                try {

                    if(closeConn){

                        conn.close();

                    }

                } catch (SQLException e) {

                    //ignore

                }

            }

        }

    }

    /**

     * 根据daatsource创建对应的sqlUtil

     *

     * @param invocation

     */

    public SqlUtil getSqlUtil(Invocation invocation) {

        MappedStatement ms = (MappedStatement) invocation.getArgs()[0];

        //改为对dataSource做缓存

        DataSource dataSource = ms.getConfiguration().getEnvironment().getDataSource();

        String url = getUrl(dataSource);

        if (urlSqlUtilMap.containsKey(url)) {

            return urlSqlUtilMap.get(url);

        }

        ReentrantLock lock = new ReentrantLock();

        try {

            lock.lock();

            if (urlSqlUtilMap.containsKey(url)) {

                return urlSqlUtilMap.get(url);

            }

            if (StringUtil.isEmpty(url)) {

                throw new RuntimeException("无法自动获取jdbcUrl,请在分页插件中配置dialect参数!");

            }

            String dialect = Dialect.fromJdbcUrl(url);

            if (dialect == null) {

                throw new RuntimeException("无法自动获取数据库类型,请通过dialect参数指定!");

            }

            SqlUtil sqlUtil = new SqlUtil(dialect);

            if (this.properties != null) {

                sqlUtil.setProperties(properties);

            } else if (this.sqlUtilConfig != null) {

                sqlUtil.setSqlUtilConfig(this.sqlUtilConfig);

            }

            urlSqlUtilMap.put(url, sqlUtil);

            return sqlUtil;

        } finally {

            lock.unlock();

        }

    }

    /**

     * 只拦截Executor

     *

     * @param target

     * @return

     */

    public Object plugin(Object target) {

        if (target instanceof Executor) {

            return Plugin.wrap(target, this);

        } else {

            return target;

        }

    }

    private void checkVersion() {

        //MyBatis3.2.0版本校验

        try {

            Class.forName("org.apache.ibatis.scripting.xmltags.SqlNode");//SqlNode是3.2.0之后新增的类

        } catch (ClassNotFoundException e) {

            throw new RuntimeException("您使用的MyBatis版本太低,MyBatis分页插件PageHelper支持MyBatis3.2.0及以上版本!");

        }

    }

    /**

     * 设置属性值

     *

     * @param p 属性值

     */

    public void setProperties(Properties p) {

        checkVersion();

        //多数据源时,获取jdbcurl后是否关闭数据源

        String closeConn = p.getProperty("closeConn");

        //解决#97

        if(StringUtil.isNotEmpty(closeConn)){

            this.closeConn = Boolean.parseBoolean(closeConn);

        }

        //数据库方言

        String dialect = p.getProperty("dialect");

        String runtimeDialect = p.getProperty("autoRuntimeDialect");

        if (StringUtil.isNotEmpty(runtimeDialect) && runtimeDialect.equalsIgnoreCase("TRUE")) {

            this.autoRuntimeDialect = true;

            this.autoDialect = false;

            this.properties = p;

        } else if (StringUtil.isEmpty(dialect)) {

            autoDialect = true;

            this.properties = p;

        } else {

            autoDialect = false;

            sqlUtil = new SqlUtil(dialect);

            sqlUtil.setProperties(p);

        }

    }

    /**

     * 设置属性值

     *

     * @param config

     */

    public void setSqlUtilConfig(SqlUtilConfig config) {

        checkVersion();

        //多数据源时,获取jdbcurl后是否关闭数据源

        this.closeConn = config.isCloseConn();

        if (config.isAutoRuntimeDialect()) {

            this.autoRuntimeDialect = true;

            this.autoDialect = false;

            this.sqlUtilConfig = config;

        } else if (StringUtil.isEmpty(config.getDialect())) {

            autoDialect = true;

            this.sqlUtilConfig = config;

        } else {

            autoDialect = false;

            sqlUtil = new SqlUtil(config.getDialect());

            sqlUtil.setSqlUtilConfig(config);

        }

    }
}

2 返回对象

/*

 * The MIT License (MIT)

 *

 * Copyright (c) 2014 abel533@gmail.com

 *

 * Permission is hereby granted, free of charge, to any person obtaining a copy

 * of this software and associated documentation files (the "Software"), to deal

 * in the Software without restriction, including without limitation the rights

 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell

 * copies of the Software, and to permit persons to whom the Software is

 * furnished to do so, subject to the following conditions:

 *

 * The above copyright notice and this permission notice shall be included in

 * all copies or substantial portions of the Software.

 *

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,

 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN

 * THE SOFTWARE.

 */

package com.github.pagehelper;

import java.io.Serializable;

import java.util.Collection;

import java.util.List;

/**

 * 对Page<E>结果进行包装

 * <p/>

 * 新增分页的多项属性,主要参考:http://bbs.csdn.net/topics/360010907

 *

 * @author liuzh/abel533/isea533

 * @version 3.3.0

 * @since 3.2.2

 * 项目地址 : http://git.oschina.net/free/Mybatis_PageHelper
 */

@SuppressWarnings({"rawtypes", "unchecked"})

public class PageInfo<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    //当前页

    private int pageNum;

    //每页的数量

    private int pageSize;

    //当前页的数量

    private int size;

    //排序

    private String orderBy;

    //由于startRow和endRow不常用,这里说个具体的用法

    //可以在页面中"显示startRow到endRow 共size条数据"

    //当前页面第一个元素在数据库中的行号

    private int startRow;

    //当前页面最后一个元素在数据库中的行号

    private int endRow;

    //总记录数

    private long total;

    //总页数

    private int pages;

    //结果集

    private List<T> list;

    //第一页

    private int firstPage;

    //前一页

    private int prePage;

    //下一页

    private int nextPage;

    //最后一页

    private int lastPage;

    //是否为第一页

    private boolean isFirstPage = false;

    //是否为最后一页

    private boolean isLastPage = false;

    //是否有前一页

    private boolean hasPreviousPage = false;

    //是否有下一页

    private boolean hasNextPage = false;

    //导航页码数

    private int navigatePages;

    //所有导航页号

    private int[] navigatepageNums;

    public PageInfo() {

    }

    /**

     * 包装Page对象

     *

     * @param list

     */

    public PageInfo(List<T> list) {

        this(list, 8);

    }

    /**

     * 包装Page对象

     *

     * @param list          page结果

     * @param navigatePages 页码数量

     */

    public PageInfo(List<T> list, int navigatePages) {

        if (list instanceof Page) {

            Page page = (Page) list;

            this.pageNum = page.getPageNum();

            this.pageSize = page.getPageSize();

            this.orderBy = page.getOrderBy();

            this.pages = page.getPages();

            this.list = page;

            this.size = page.size();

            this.total = page.getTotal();

            //由于结果是>startRow的,所以实际的需要+1

            if (this.size == 0) {

                this.startRow = 0;

                this.endRow = 0;

            } else {

                this.startRow = page.getStartRow() + 1;

                //计算实际的endRow(最后一页的时候特殊)

                this.endRow = this.startRow - 1 + this.size;

            }

        } else if (list instanceof Collection) {

            this.pageNum = 1;

            this.pageSize = list.size();

            this.pages = 1;

            this.list = list;

            this.size = list.size();

            this.total = list.size();

            this.startRow = 0;

            this.endRow = list.size() > 0 ? list.size() - 1 : 0;

        }

        if (list instanceof Collection) {

            this.navigatePages = navigatePages;

            //计算导航页

            calcNavigatepageNums();

            //计算前后页,第一页,最后一页

            calcPage();

            //判断页面边界

            judgePageBoudary();

        }

    }

    /**

     * 计算导航页

     */

    private void calcNavigatepageNums() {

        //当总页数小于或等于导航页码数时

        if (pages <= navigatePages) {

            navigatepageNums = new int[pages];

            for (int i = 0; i < pages; i++) {

                navigatepageNums[i] = i + 1;

            }

        } else { //当总页数大于导航页码数时

            navigatepageNums = new int[navigatePages];

            int startNum = pageNum - navigatePages / 2;

            int endNum = pageNum + navigatePages / 2;

            if (startNum < 1) {

                startNum = 1;

                //(最前navigatePages页

                for (int i = 0; i < navigatePages; i++) {

                    navigatepageNums[i] = startNum++;

                }

            } else if (endNum > pages) {

                endNum = pages;

                //最后navigatePages页

                for (int i = navigatePages - 1; i >= 0; i--) {

                    navigatepageNums[i] = endNum--;

                }

            } else {

                //所有中间页

                for (int i = 0; i < navigatePages; i++) {

                    navigatepageNums[i] = startNum++;

                }

            }

        }

    }

    /**

     * 计算前后页,第一页,最后一页

     */

    private void calcPage() {

        if (navigatepageNums != null && navigatepageNums.length > 0) {

            firstPage = navigatepageNums[0];

            lastPage = navigatepageNums[navigatepageNums.length - 1];

            if (pageNum > 1) {

                prePage = pageNum - 1;

            }

            if (pageNum < pages) {

                nextPage = pageNum + 1;

            }

        }

    }

    /**

     * 判定页面边界

     */

    private void judgePageBoudary() {

        isFirstPage = pageNum == 1;

        isLastPage = pageNum == pages;

        hasPreviousPage = pageNum > 1;

        hasNextPage = pageNum < pages;

    }

    public int getPageNum() {

        return pageNum;

    }

    public void setPageNum(int pageNum) {

        this.pageNum = pageNum;

    }

    public int getPageSize() {

        return pageSize;

    }

    public void setPageSize(int pageSize) {

        this.pageSize = pageSize;

    }

    public int getSize() {

        return size;

    }

    public void setSize(int size) {

        this.size = size;

    }

    public String getOrderBy() {

        return orderBy;

    }

    public void setOrderBy(String orderBy) {

        this.orderBy = orderBy;

    }

    public int getStartRow() {

        return startRow;

    }

    public void setStartRow(int startRow) {

        this.startRow = startRow;

    }

    public int getEndRow() {

        return endRow;

    }

    public void setEndRow(int endRow) {

        this.endRow = endRow;

    }

    public long getTotal() {

        return total;

    }

    public void setTotal(long total) {

        this.total = total;

    }

    public int getPages() {

        return pages;

    }

    public void setPages(int pages) {

        this.pages = pages;

    }

    public List<T> getList() {

        return list;

    }

    public void setList(List<T> list) {

        this.list = list;

    }

    public int getFirstPage() {

        return firstPage;

    }

    public void setFirstPage(int firstPage) {

        this.firstPage = firstPage;

    }

    public int getPrePage() {

        return prePage;

    }

    public void setPrePage(int prePage) {

        this.prePage = prePage;

    }

    public int getNextPage() {

        return nextPage;

    }

    public void setNextPage(int nextPage) {

        this.nextPage = nextPage;

    }

    public int getLastPage() {

        return lastPage;

    }

    public void setLastPage(int lastPage) {

        this.lastPage = lastPage;

    }

    public boolean isIsFirstPage() {

        return isFirstPage;

    }

    public void setIsFirstPage(boolean isFirstPage) {

        this.isFirstPage = isFirstPage;

    }

    public boolean isIsLastPage() {

        return isLastPage;

    }

    public void setIsLastPage(boolean isLastPage) {

        this.isLastPage = isLastPage;

    }

    public boolean isHasPreviousPage() {

        return hasPreviousPage;

    }

    public void setHasPreviousPage(boolean hasPreviousPage) {

        this.hasPreviousPage = hasPreviousPage;

    }

    public boolean isHasNextPage() {

        return hasNextPage;

    }

    public void setHasNextPage(boolean hasNextPage) {

        this.hasNextPage = hasNextPage;

    }

    public int getNavigatePages() {

        return navigatePages;

    }

    public void setNavigatePages(int navigatePages) {

        this.navigatePages = navigatePages;

    }

    public int[] getNavigatepageNums() {

        return navigatepageNums;

    }

    public void setNavigatepageNums(int[] navigatepageNums) {

        this.navigatepageNums = navigatepageNums;

    }

    @Override

    public String toString() {

        final StringBuffer sb = new StringBuffer("PageInfo{");

        sb.append("pageNum=").append(pageNum);

        sb.append(", pageSize=").append(pageSize);

        sb.append(", size=").append(size);

        sb.append(", startRow=").append(startRow);

        sb.append(", endRow=").append(endRow);

        sb.append(", total=").append(total);

        sb.append(", pages=").append(pages);

        sb.append(", list=").append(list);

        sb.append(", firstPage=").append(firstPage);

        sb.append(", prePage=").append(prePage);

        sb.append(", nextPage=").append(nextPage);

        sb.append(", lastPage=").append(lastPage);

        sb.append(", isFirstPage=").append(isFirstPage);

        sb.append(", isLastPage=").append(isLastPage);

        sb.append(", hasPreviousPage=").append(hasPreviousPage);

        sb.append(", hasNextPage=").append(hasNextPage);

        sb.append(", navigatePages=").append(navigatePages);

        sb.append(", navigatepageNums=");

        if (navigatepageNums == null) sb.append("null");

        else {

            sb.append('[');

            for (int i = 0; i < navigatepageNums.length; ++i)

                sb.append(i == 0 ? "" : ", ").append(navigatepageNums[i]);

            sb.append(']');

        }

        sb.append('}');

        return sb.toString();

    }

}

3 mybatis -xml 文件配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans 

xmlns="http://www.springframework.org/schema/beans" 

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 

xmlns:tx="http://www.springframework.org/schema/tx" 

xmlns:aop="http://www.springframework.org/schema/aop" 

xsi:schemaLocation="
http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd http://www.springframework.org/schema/tx  http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
<jee:jndi-lookup id="dataSource" resource-ref="true" jndi-name="jdbc/fb2b" />

    <!-- JNDI方式配置数据源 -->

    <!-- <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="${jndiName}"></property> </bean> -->

    <!-- ========================================配置数据源========================================= -->

    <!-- 配置数据源,使用的是alibaba的Druid(德鲁伊)数据源 -->

<!--     <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">

        <property name="url" value="${jdbc_url}" />

        <property name="username" value="${jdbc_username}" />

        <property name="password" value="${jdbc_password}" />

        初始化连接大小

        <property name="initialSize" value="0" />

        连接池最大使用连接数量

        <property name="maxActive" value="20" />

        连接池最大空闲

        <property name="maxIdle" value="20" />

        连接池最小空闲

        <property name="minIdle" value="0" />

        获取连接最大等待时间

        <property name="maxWait" value="60000" />

        

        <property name="poolPreparedStatements" value="true" /> 

        <property name="maxPoolPreparedStatementPerConnectionSize" value="33" /> 

       

        <property name="validationQuery" value="${validationQuery}" />

        <property name="testOnBorrow" value="false" />

        <property name="testOnReturn" value="false" />

        <property name="testWhileIdle" value="true" />

        配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒

        <property name="timeBetweenEvictionRunsMillis" value="60000" />

        配置一个连接在池中最小生存的时间,单位是毫秒

        <property name="minEvictableIdleTimeMillis" value="25200000" />

        打开removeAbandoned功能

        <property name="removeAbandoned" value="true" />

        1800秒,也就是30分钟

        <property name="removeAbandonedTimeout" value="1800" />

        关闭abanded连接时输出错误日志

        <property name="logAbandoned" value="true" />

        监控数据库

        <property name="filters" value="stat" />

        <property name="filters" value="mergeStat" />

    </bean> -->

    

    <!-- ========================================分隔线========================================= -->

    

    <!-- ========================================针对myBatis的配置项============================== -->

    <!-- 配置sqlSessionFactory -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

        <!-- 实例化sqlSessionFactory时需要使用上述配置好的数据源以及SQL映射文件 -->

        <property name="dataSource" ref="dataSource" />

        <!-- 自动扫描cn/softmr/account/mapping/目录下的所有SQL映射的xml文件, 省掉Configuration.xml里的手工配置

        value="classpath:cn/softmr/account/mapping/*.xml"指的是classpath(类路径)下cn.softmr.account.mapping包中的所有xml文件

        UserMapper.xml位于cn.softmr.account.mapping包下,这样UserMapper.xml就可以被自动扫描

         -->

        <property name="mapperLocations" value="classpath:cn/softmr/*/*/mapping/*.xml" />

        <property name="plugins">
   <array>
     <bean class="com.github.pagehelper.PageHelper">
       <property name="properties">
         <value>
           dialect=mysql
         </value>
       </property>
     </bean>
   </array>
 </property>

    </bean>

    <!-- 配置扫描器 -->

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

        <!-- 扫描cn.softmr.account.dao这个包以及它的子包下的所有映射接口类 -->

        <property name="basePackage" value="cn.softmr.*.*.dao" />

        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />

    </bean>

    

    <!-- ========================================分隔线========================================= -->

    <!-- 配置Spring的事务管理器 -->

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

        <property name="dataSource" ref="dataSource" />

    </bean>

    <!-- 注解方式配置事物 -->

    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->

    <!-- 拦截器方式配置事物 -->

    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">

        <tx:attributes>

            <tx:method name="add*" propagation="REQUIRED" />

            <tx:method name="append*" propagation="REQUIRED" />

            <tx:method name="insert*" propagation="REQUIRED" />

            <tx:method name="save*" propagation="REQUIRED" />

            <tx:method name="update*" propagation="REQUIRED" />

            <tx:method name="modify*" propagation="REQUIRED" />

            <tx:method name="edit*" propagation="REQUIRED" />

            <tx:method name="delete*" propagation="REQUIRED" />

            <tx:method name="remove*" propagation="REQUIRED" />

            <tx:method name="repair" propagation="REQUIRED" />

            <tx:method name="delAndRepair" propagation="REQUIRED" />

            <tx:method name="get*" propagation="SUPPORTS" />

            <tx:method name="find*" propagation="SUPPORTS" />

            <tx:method name="load*" propagation="SUPPORTS" />

            <tx:method name="search*" propagation="SUPPORTS" />

            <tx:method name="datagrid*" propagation="SUPPORTS" />

            <tx:method name="*" propagation="REQUIRED" />

        </tx:attributes>

    </tx:advice>

    <aop:config>

        <aop:pointcut id="transactionPointcut" expression="execution(* cn.softmr.*.*.service..*Impl.*(..))" />

        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice" />

    </aop:config>

    <!-- 配置druid监控spring jdbc -->

    <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">

    </bean>

    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">

        <property name="patterns">

            <list>

                <value>cn.softmr.*.service.*</value>

            </list>

        </property>

    </bean>

    <aop:config>

        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut" />

    </aop:config>

</beans>

4 service 

@Override
public PageInfo<ProdPropMeta> searchProdPropMetaPage(
ProdPropMetaExample example, int pageno, int pagesize) {
// TODO Auto-generated method stub
PageHelper.startPage(pageno,pagesize);
List<ProdPropMeta> list = prodPropMetaMapper.selectByExample(example);
return  new PageInfo<ProdPropMeta>(list);
}

5 controler

/**

     * 查询分页

     * @param ProdPropMeta

     * @param pageno

     * @param pagesize

     * @return

     */

    @RequestMapping(value = "/searchProdPropMetaPage")

    @ResponseBody

    public  PageInfo<ProdPropMeta> searchProdPropMetaPage(@RequestParam("propName") String propName,

    @RequestParam("pageno") int pageno,@RequestParam("pagesize") int pagesize) {

    ProdPropMetaExample prodPropMetaExample=new ProdPropMetaExample();

    if(!StringUtils.isBlank(propName)){

    prodPropMetaExample.createCriteria().andProdPropNameLike(propName+"%");

    }

    prodPropMetaExample.setOrderByClause(" PROD_PROP_ID DESC ");

    PageInfo<ProdPropMeta> list = prodPropMetaService.searchProdPropMetaPage(prodPropMetaExample,pageno,pagesize);

    return list;

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis -mysql