篇十五:mybatis分页实现

分页有两种实现,第一种基于pagehelper,另一种基于自编的dialect

一、基于PageHelper

1、pom.xml配置相关jar包

注意:mybatis-spring版本问题,参考数据库

    <!-- MySQL+Mybatis:mybatis、mybatis-spring、spring-jdbc、druid、mysql-connector-java、pagehelper -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>        
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.0.18</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.4</version>
        </dependency>

2、配置spring-mybatis.xml

  a、配置 pagehelper

  b、配置 mybatis.config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx" 
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                              http://www.springframework.org/schema/beans/spring-beans.xsd
                              http://www.springframework.org/schema/aop 
                              http://www.springframework.org/schema/aop/spring-aop.xsd
                              http://www.springframework.org/schema/tx 
                              http://www.springframework.org/schema/tx/spring-tx.xsd
                              http://www.springframework.org/schema/context 
                              http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 基于Druid数据库链接池的数据源配置 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 基本属性driverClassName、 url、user、password -->
        <property name="driverClassName" value="${jdbc.driver}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 配置初始化大小、最小、最大 -->
        <!-- 通常来说,只需要修改initialSize、minIdle、maxActive -->
        <property name="initialSize" value="2" />
        <property name="minIdle" value="2" />
        <property name="maxActive" value="30" />
        <property name="testWhileIdle" value="false" />

        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="5000" />
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="30000" />
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!-- 解密密码必须要配置的项 -->
        <property name="filters" value="config" />
        <property name="connectionProperties" value="config.decrypt=false" />
    </bean>
    
    <!-- SqlSession模板类实例 -->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" scope="prototype" destroy-method="close">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>
    <!-- 将数据源映射到sqlSessionFactory中 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
        <property name="dataSource" ref="dataSource" />
        <property name="plugins">
            <array>
                   <bean class="com.github.pagehelper.PageHelper">
                       <property name="properties">
                           <value>
                               dialect=hsqldb
                           </value>
                       </property>
                   </bean>
            </array>
        </property>
    </bean>
    
    <!--======= 事务配置 Begin ================= -->
    <!-- 事务管理器(由Spring管理MyBatis的事务) -->
    <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        关联数据源
        <property name="dataSource" ref="dataSource"></property>
    </bean> -->
    
    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> -->
    <!--======= 事务配置 End =================== -->

</beans>

3、BaseDaoImpl中添加分页

  BaseDao

package com.core.dao;

import java.util.List;
import com.core.dao.common.BaseResponse;
import com.core.dao.common.PageData;


/**
 * Dao层公共包
 * @author happy
 *
 */
public interface BaseDao<T> {

    /**
     * 查询单条数据
     * @param id
     * @return
     */
    T selectById(String id);
    
    /**
     * 查询多条数据,不分页
     * @param obj
     * @return
     */
    List<T> selectList(Object obj);
    
    /**
     * 自定义列表查询,不分页
     * @param statement
     * @param obj
     * @return
     */
    List<T> selectList(String statement,Object obj);
    
    /**
     * 查询多条数据,分页
     * @param page
     * @param obj
     * @return
     */
    BaseResponse selectListPage(PageData page,Object obj);
    
    /**
     * 自定义列表查询,分页
     * @param page
     * @param statement
     * @param obj
     * @return
     */
    BaseResponse selectListPage(PageData page,String statement,Object obj);
    
    /**
     * 新增数据
     * @param entity
     * @return :插入成功,返回新增的
     */
    int insert(T entity);
    
    /**
     * 批量插入:数据表的主键id是UUID生成的,自增长的会提示id不为空,报错
     * @param list
     * @return
     */
    int insert(List<T> list);
    
    /**
     * 修改数据
     * @param entity
     * @return
     */
    int update(T entity);
    
    /**
     * 批量修改数据
     * @param list
     * @return
     */
    int update(List<T> list);
    
    /**
     * 单条删除
     * @param id
     * @return
     */
    int delete(String id);
    
    /**
     * 批量删除
     * @param ids
     * @return
     */
    int delete(String[] ids);
}

  BaseDaoImpl

package com.core.dao;

import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import com.core.dao.common.BaseResponse;
import com.core.dao.common.BasicExecuteEnum;
import com.core.dao.common.PageData;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * 公共方法实现类
 * @author shb
 *
 */
public class BaseDaoImpl<T> extends SqlSessionDaoSupport implements BaseDao<T>
{

    @Override
    public T selectById(String id) {
        return getSqlSession().selectOne(getStatement(BasicExecuteEnum.SELECT_BYID.id), id);
    }

    @Override
    public List<T> selectList(Object obj) {
        return getSqlSession().selectList(getStatement(BasicExecuteEnum.SELECT_LIST.id), obj);
    }
    
    @Override
    public List<T> selectList(String statement, Object obj) {
        return getSqlSession().selectList(getStatement(statement), obj);
    }

    @Override
    public BaseResponse selectListPage(PageData page, Object obj) {
        BaseResponse response = new BaseResponse();
        PageHelper.startPage(page.getPage(), page.getNumber(), true);
        List<Object> list =  getSqlSession().selectList(getStatement(BasicExecuteEnum.SELECT_LIST.id), obj);
        response.setObj(list);
        response.setPageInfo(new PageInfo<Object>(list));
        return response;
    }

    @Override
    public BaseResponse selectListPage(PageData page, String statement,
            Object obj) {
        BaseResponse response = new BaseResponse();
        PageHelper.startPage(page.getPage(), page.getNumber(), true);
        List<Object> list =  getSqlSession().selectList(getStatement(statement), obj);
        response.setObj(list);
        response.setPageInfo(new PageInfo<Object>(list));
        return response;
    }
    
    @Override
    public int insert(T entity) {
        return getSqlSession().insert(getStatement(BasicExecuteEnum.INSERT.id), entity);
    }

    @Override
    public int insert(List<T> list) {
        return getSqlSession().insert(getStatement(BasicExecuteEnum.INSERT_BATCH.id), list);
    }

    @Override
    public int update(T entity) {
        return getSqlSession().update(getStatement(BasicExecuteEnum.UPDATE.id), entity);
    }

    @Override
    public int update(List<T> list) {
        int size = 0;
        for(T obj:list){
            int length = getSqlSession().update(getStatement(BasicExecuteEnum.UPDATE.id),obj);
            if(length != 0) size++;
        }
        return size;
    }

    @Override
    public int delete(String id) {
        return getSqlSession().delete(getStatement(BasicExecuteEnum.INSERT.id), id);
    }

    @Override
    public int delete(String[] ids) {
        int size = 0;
        for(String id:ids){
            int length = getSqlSession().delete(getStatement(BasicExecuteEnum.INSERT.id), id);
            if(length != 0 ) size++;
        }
        return size;
    }

    /**
     * 注入SqlSessionTemplate实例(要求Spring中进行SqlSessionTemplate的配置).<br/>
     * 可以调用getSqlSession()完成数据库操作.
     */
//    public SqlSessionTemplate sqlSessionTemplate;

//    @Autowired
//    protected SqlSessionFactory sqlSessionFactory;

//    public SqlSessionTemplate getSessionTemplate() {
//        return getSqlSession();
//    }

    @Autowired
    public void setSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
        super.setSqlSessionTemplate(sqlSessionTemplate);
    }

    public SqlSession getSqlSession() {
        return super.getSqlSession();
    }

//    public SqlSessionFactory getSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
//        return sqlSessionFactory;
//    }
//    
//    @Override
//    public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
//        this.sqlSessionFactory = sqlSessionFactory;
//    }

    /**
     * 获取类的全路径,拼接 sqlId的Mapper的访问路径
     * 公共方法无法获取指定的类全路径,即无法使用namespace的完全限定名
     * @param sqlId
     * @return
     */
    public String getStatement(String sqlId) {

        String name = this.getClass().getName();

        StringBuffer sb = new StringBuffer().append(name).append(".").append(sqlId);

        return sb.toString();
    }
    
}

 

posted @ 2016-11-15 19:42  刘广平  阅读(312)  评论(0编辑  收藏  举报