spring boot + mybatis +pagehelper 添加Dao工具类
上节简单集成了mybatis,但是mybatis只提供了基础的insert、update、selectOne、selectList,但是在实际应用中,我们会有很多的分页场景,可以使用一个开源的插件pagehelper来实现,插件提供了多种数据库分页支持,具体内容:pagehelper API
集成了分页插件后,添加一个daoutils,提供mybatis原生查询+pagehelper的分页查询工具类
代码示例下载:spring-boot-test-3.zip
集成的步骤
- 生成一个maven项目、pom项目引入spring boot、mybatis
生成步骤请看上两章的内容 - 在pom文件中引入pagehelper的的依赖
- 添加pagehelper的分页拦截器
- 添加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