(三)spring boot + mybatis +pagehelper 添加Dao工具类

spring boot + mybatis +pagehelper 添加Dao工具类


上节简单集成了mybatis,但是mybatis只提供了基础的insert、update、selectOne、selectList,但是在实际应用中,我们会有很多的分页场景,可以使用一个开源的插件pagehelper来实现,插件提供了多种数据库分页支持,具体内容:pagehelper API

集成了分页插件后,添加一个daoutils,提供mybatis原生查询+pagehelper的分页查询工具类

代码示例下载:spring-boot-test-3.zip

集成的步骤

  1. 生成一个maven项目、pom项目引入spring boot、mybatis
    生成步骤请看上两章的内容
  2. 在pom文件中引入pagehelper的的依赖
  3. 添加pagehelper的分页拦截器
  4. 添加DaoUtils.java及一个Map的工具类(MapUtils.java)
从上可以看出本章节,只有三个步骤就可以完成分页插件&Dao工具类引入的操作

完成后的目录结构

这里写图片描述
这里写图片描述

添加pom依赖

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>4.1.0</version>
</dependency>

添加后的pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.dtf</groupId>
    <artifactId>spring-boot-test-3</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-boot-test-3 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.5.3.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.41</version>
            <scope>runtime</scope>
        </dependency>

        <!-- mybatis依赖包 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.0</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>4.1.0</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.4.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>spring-boot-test-3</finalName>
        <plugins>
            <!-- 默认使用jdk1.7 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

添加Mybatis分页拦截器

package com.dtf.core.utils.mybatis;
import java.util.Properties;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.github.pagehelper.PageHelper;

/**
 * Mybatis - 通用分页拦截器
 * @author Administrator
 */
@Configuration
public class MyBatisConfig {

    @Bean
    public PageHelper pageHelper() {
        PageHelper pageHelper = new PageHelper();
        //添加配置,也可以指定文件路径
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }

}

使用分页插件(基础用法)

    //用注解注入mybatis自带的工具类
    @Autowired
    private SqlSessionTemplate sessionTemplate;

    //使用分页
    public List get() {
        //使用这种分页的方式,查询的语句必须跟在这句后边,否则会有线程安全问题
        PageHelper.startPage(1, 2);
        return sessionTemplate.selectList("CustMapper.findCust");
    }

添加dao工具类

package com.dtf.core.utils.mybatis;

import java.util.Map;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Service;

import com.dtf.core.utils.common.MapUtils;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

/**
 * 数据库工具类
 * 继承SqlSessionTemplate,得到此工具类中的原有方法
 * @author
 *
 */
@Service
public class DaoUtils extends SqlSessionTemplate{

    public DaoUtils(SqlSessionFactory sqlSessionFactory) {
        super(sqlSessionFactory);
    }

    public String pageNumStr = "pageNum";
    public String pageSizeStr = "pageSize";

    /***
     * 查询分页信息
     * @param statement sql映射名称.id
     * @param pageNum 当前页
     * @param pageSize 每页条数
     * @return
     */
    public PageInfo selectPage(String statement,int pageNum,int pageSize){
        return this.selectPage(statement, null, pageNum, pageSize);
    }

    /***
     * 查询分页信息
     * @param statement sql映射名称.id
     * @param param 查询条件,param里边必须包含pageNum和pageSize,否则会报错
     * @return
     */
    public PageInfo selectPage(String statement,Map param){
        int pageNum = MapUtils.getInt(param, pageNumStr);
        int pageSize = MapUtils.getInt(param, pageSizeStr);
        if (pageNum == 0 || pageSize == 0) {
            throw new RuntimeException(
                    "param is not for:pageNum="+MapUtils.getString(param, pageNumStr) +
                    ",pageSize="+MapUtils.getString(param, pageSizeStr));
        }
        return this.selectPage(statement, param,pageNum , pageSize);
    }
    /***
     * 查询分页信息基础方法
     * @param statement SQL映射路径.ID
     * @param param 参数
     * @param pageNum 查询第多个页
     * @param pageSize 每页多少条数据
     * @return
     */
    public PageInfo selectPage(final String statement,final Object param,int pageNum,int pageSize){
        return selectPage(statement, param, true, pageNum, pageSize);
    }
    /***
     * 查询分页数据,不查询数据总条数
     * @param statement SQL映射路径.ID
     * @param param 参数
     * @param pageNum 查询第多个页
     * @param pageSize 每页多少条数据
     * @return
     */
    public PageInfo selectPageNoCount(final String statement,final Object param,int pageNum,int pageSize){
        return selectPage(statement, param, false, pageNum, pageSize);
    }

    /***
     * 查询分页数据,不查询数据总条数
     * @param statement SQL映射路径.ID
     * @param param 参数
     * @param pageNum 查询第多个页
     * @param pageSize 每页多少条数据
     * @return
     */
    public PageInfo selectPageNoCount(final String statement,int pageNum,int pageSize){
        return selectPage(statement, null, false, pageNum, pageSize);
    }

    /***
     * 查询分页数据,不查询总条数
     * @param statement sql映射名称.id
     * @param param 查询条件,param里边必须包含pageNum和pageSize,否则会报错
     * @return
     */
    public PageInfo selectPageNoCount(String statement,Map param){
        int pageNum = MapUtils.getInt(param, pageNumStr);
        int pageSize = MapUtils.getInt(param, pageSizeStr);
        if (pageNum == 0 || pageSize == 0) {
            throw new RuntimeException(
                    "param is not for:pageNum="+MapUtils.getString(param, pageNumStr) +
                    ",pageSize="+MapUtils.getString(param, pageSizeStr));
        }
        return selectPageNoCount(statement, param,pageNum , pageSize);
    }
    /***
     * 查询分页信息基础方法
     * @param statement SQL映射路径.ID
     * @param param 参数
     * @param selectCount 是否进行count查询
     * @param pageNum 查询第多个页
     * @param pageSize 每页多少条数据
     * @return
     */
    public PageInfo selectPage(final String statement,final Object param,boolean selectCount,int pageNum,int pageSize){
        final DaoUtils daoUtils = this;
        PageInfo info = PageHelper.startPage(pageNum, pageSize,selectCount).doSelectPageInfo(new ISelect() {
            @Override
            public void doSelect(){
                daoUtils.selectList(statement,param);
            }
        });
        return info;
    }
}

可以看到DaoUtils这个工具类是继承了SqlSessionTemplate,并且添加了注解@Service,哪么就可以直接在业务的Dao类里边直接使用@Autowired将DaoUtils注入,在业务方法中直接调用了DaoUtils的方法,及SqlSessionTemplate的方法了

BO调用工具类方法

package com.dtf.core.bo;

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

import org.mybatis.spring.SqlSessionTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.dtf.core.utils.mybatis.DaoUtils;
import com.github.pagehelper.ISelect;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

@Service
public class CustBo {

    private static final Logger log = LoggerFactory.getLogger(CustBo.class);

    @Autowired
    private SqlSessionTemplate sessionTemplate;

    @Autowired
    private DaoUtils daoUtils;

    /**
     * 直接通过sessionTemplate操作数据库
     * @return
     */
    public List get() {
        PageHelper.startPage(1, 2);
        return sessionTemplate.selectList("CustMapper.findCust");
    }

    /**
     * 直接调用DaoUtils工具类操作数据库实现分页
     * @param param
     * @return
     */
    public PageInfo selectPage(Map param){
        daoUtils.selectPage("CustMapper.findCust", 1,2);
        daoUtils.selectPage("CustMapper.findCust", param, 2, 1);
        daoUtils.selectPageNoCount("CustMapper.findCust",param);
        daoUtils.selectPageNoCount("CustMapper.findCust", param, 2, 1);
        return daoUtils.selectPage("CustMapper.findCust",param);
    }

    public List findCustVo(Map param){
        return daoUtils.selectList("CustMapper.findCustVo",param);
    }
    /***
     * 测试修改库表
     * @param param
     * @return
     */
    public int update(Map param){
        return daoUtils.update("CustMapper.updateCust",param);
    }

    /***
     * 测试事务控制,当修改条数成功后,抛出异常,看会不会回滚
     * @param param
     * @return
     */
    @Transactional
    public int updateError(Map param){
        int c = daoUtils.update("CustMapper.updateCust",param);
        System.out.println("变更条数:"+c);
        if (true) {
            throw new RuntimeException("插入发生错误,回滚!");
        }
        return c;
    }
}

我这里DaoUtils工具类使用了另外一个MapUtil

package com.dtf.core.utils.common;

import java.util.Map;

public class MapUtils {

    /**
     * 从map中获取String字符串,如果不存在数据的情况,会返一个空串""
     * @param map
     * @param key
     * @return
     */
    public static String getString(Map map, String key){
        if (map == null) {
            return "";
        }
        Object val = map.get(key);
        if (val == null || (val+"").trim().equals("")) {
            return "";
        }
        return val+"";
    }

    /**
     * 从map中获取String字符串,如果不存在数据的情况,会返一个defaultValue
     * @param map
     * @param key
     * @param defaultValue
     * @return
     */
    public static String getString(Map map, String key,String defaultValue){
        if (map == null) {
            return defaultValue;
        }

        Object val = map.get(key);
        if (val == null || (val+"").trim().equals("")) {
            return defaultValue;
        }
        return val+"";
    }

    /**
     * 从map中获取int,如果不存在数据的情况,会返一个0
     * @param map
     * @param key
     * @return
     */
    public static int getInt(Map map, String key){
        if (map == null) {
            return 0;
        }

        Object val = map.get(key);
        if (val == null || (val+"").trim().equals("")) {
            return 0;
        }
        int v = 0;
        try {
            v = Integer.valueOf((val+"").trim());
        } catch (Exception e) {
        }
        return v;
    }

    /**
     * 从map中获取int,如果不存在数据的情况,会返一个0
     * @param map
     * @param key
     * @return
     */
    public static int getInt(Map map, String key,int defaultValue){
        if (map == null) {
            return defaultValue;
        }

        Object val = map.get(key);
        if (val == null || (val+"").trim().equals("")) {
            return defaultValue;
        }
        int v = defaultValue;
        try {
            v = Integer.valueOf((val+"").trim());
        } catch (Exception e) {
        }
        return v;
    }
}

代码示例下载:spring-boot-test-3.zip

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值