springBoot集成Mybatis分页插件

几十分钟钱写了一篇集成Druid实现数据源加载,这次根据上一次的帖子再发一贴我目前在使用的Mybatis分页插件,小伙伴们对此插件应该不陌生,但是每个人用的时候也许不尽相同,希望此贴对诸位能有帮助吧。。。好了上代码

同样先在maven中pom.xml中加入jar依赖关系,当时com.github.pagehelper这个包在阿里的nexus中搜了几次没找到,后来在国外的一个网站找了一个版本,莫名其妙的就好了如下版本:

<!-- mybatis的分页插件pagehelper -->
  <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.4</version>

</dependency>

同时在config包中新建MybatisConfig  java Bean 代码如下:

package com.zwq.config;
import com.github.pagehelper.PageInterceptor;
import com.zwq.dataSource.DynamicDataSource;


import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;


import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;


/**
 * @author zhouwq
 * <p>
 * Mybatis 配置文件,加入了分页器,分页器的使用:
 * <p>
 * com.github.pagehelper.PageHelper.startPage(1, 10);
 * List<User> list = mapper.queryUsers();
 * com.github.pagehelper.PageInfo<User> pagelist=new com.github.pagehelper.PageInfo<User>(list);
 * pageList 封装了分页列表以及其他分页相关的所有信息
 * <p>
 * mpper.quryXXX()
 */




@Configuration
@EnableTransactionManagement
@AutoConfigureAfter({DataSource_0.class})
public class MybatisConfig {
@Bean(name="dynamicDataSource")
public DataSource dynamicDataSource(@Qualifier("dataSource")DataSource dataSource){
DynamicDataSource dynamicDataSource = new DynamicDataSource();
Map<Object, Object> targetDataSources =new HashMap<Object,Object>();
targetDataSources.put("dataSource", dataSource);
dynamicDataSource.setTargetDataSources(targetDataSources);
dynamicDataSource.setDefaultTargetDataSource(dataSource);
return dynamicDataSource;
}


@Bean(name="sqlSessionFactoryBean")
public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dynamicDataSource") DataSource dataSource){
SqlSessionFactoryBean bean=new SqlSessionFactoryBean();
bean.setDataSource(dataSource);

//设置分页插件
PageInterceptor pageInterceptor = new PageInterceptor();
Properties properties=new Properties();
properties.setProperty("reasonable", "true");
pageInterceptor.setProperties(properties);


        //添加插件
        bean.setPlugins(new Interceptor[]{pageInterceptor});


org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
bean.setConfiguration(configuration);
try {
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}


@Bean(name = "transactionManager")
    public DataSourceTransactionManager testTransactionManager3(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) {
        return new DataSourceTransactionManager(dynamicDataSource);
    }


@Bean
    public MapperScannerConfigurer mapperScannerConfigurer() {
        MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
        mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactoryBean");
        mapperScannerConfigurer.setBasePackage("com.tianrun.platformAPP.core.mapper");
        return mapperScannerConfigurer;
    }
}


其中在此MybatisConfig  Bean中用到了我自己封装的一个java Bean  DynamicDataSource,此Bean代码如下:


package com.zwq.dataSource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import com.zwq.student.utils.SafeString;
import org.apache.log4j.Logger;
public class DynamicDataSource extends AbstractRoutingDataSource{



private static Logger logger = Logger.getLogger(DynamicDataSource.class);
public static final ThreadLocal<String> TARGET_DATA_SOURCE = new ThreadLocal<String>();


private final String DEFAULT_DATA_SOURCE = "dataSource";


@Override
protected Object determineCurrentLookupKey() {
String targetDataSource = TARGET_DATA_SOURCE.get();
if (SafeString.safeString(targetDataSource).equals("")) {
targetDataSource = DEFAULT_DATA_SOURCE; // 默认数据源为指标监控数据源
TARGET_DATA_SOURCE.set(targetDataSource);
}
logger.debug("当前线程数据源----------------:{}" + targetDataSource);
return targetDataSource;
}


public static void setTargetDataSource(String target){

TARGET_DATA_SOURCE.set(target);

}

public static String setTargetDataSource(){
return TARGET_DATA_SOURCE.get();
}
}


在DynamicDataSource 这个Bean中用到了我自己封装的一个 Util类就是SafeString 此Bean代码如下:

package com.zwq.student.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.commons.lang.StringUtils;


/**
 * 字符串处理类
 * 
 * @author qxr
 *
 */
public class SafeString {


private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
private static final SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


/**
* 将对象转换为字符串,切去掉前后空格

* @param obj
* @return
*/
public static String safeString(Object obj) {
// 如果参数为空 返回空字符串
if (obj == null)
return "";


// 如果是时间类型,则格式化为时间
if (obj instanceof Date)
return safeDateTime((Date) obj);


try {
return obj.toString().trim();
} catch (Exception e) {
return "";
}


}


/**
* 将日期类型格式化为时间字符串

* @param d
* @return
*/
public static String safeDateTime(Date d) {


if (d == null)
return "";


try {
return dateTimeFormat.format(d);
} catch (Exception e) {
return "";
}


}


/**
* 将日期类型格式化为日期字符串

* @param d
* @return
*/
public static String safeDate(Date d) {


if (d == null)
return "";


try {
return dateFormat.format(d);
} catch (Exception e) {
return "";
}
}


/**
* 将字符串解析为日期类型

* @param str
* @return
*/
public static Date parseDate(String str) {
Date d = null;
try {
d = dateTimeFormat.parse(str);
} catch (ParseException e) {
try {
d = dateFormat.parse(str);
} catch (Exception e2) {
d = null;
}
}
return d;
}


/**
* 将参数值转换为sql in 的参数值形式(主要用于 "select * from a where clumn in(。。。。。)" )

* @param parmas
* @param regex
* @param isnumber
* @return
*/
public static String safeSqlInParmas(String parmas, String regex, boolean isnumber) {


//传入参数不为空的情况下,解析出分隔符之间的参数,根据分隔符拼接
if (!safeString(parmas).equals("")) { 
StringBuilder ret = new StringBuilder();
String[] splits = new String[0];
try {
splits = SafeString.safeString(parmas).split(regex);
} catch (Exception e) {


}


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


//如果分隔符之间的参数为空,且明确说明是数字时,忽略
if(safeString(splits[i]).length()<=0&&isnumber) continue;

//如果不是数串加上单引号
if (isnumber) {
ret.append(splits[i]).append(regex);
} else {
ret.append("'").append(splits[i]).append("'").append(regex);
}


}


if (ret.length() > 0) {
ret.deleteCharAt(ret.length() - 1);
}
return ret.toString();


} else if (!isnumber){  //如果是字符类型,对于空参数,返回 ''   这样    select * from table where column a in ('')  不至于报错
return "''";
}else{
throw new RuntimeException("传入参数:"+parmas+" (为空字符串,或空对象) 无法解析出安全的 sql in 参数 ");  //如果是数字类型,报错
}


}




/**
* 将参数值转换为sql in 的参数值形式

* @param params
* @return
*/
public static String safeSqlInParmas(String params) {
return safeSqlInParmas(params, ",", false);
}


/**
* 将字符串转换为int 类型,报错或是空,都返回0

* @param str
* @return
*/
public static int safeInt(String str) {
if (str == null) {
return 0;
} else {
try {
return Integer.parseInt(str);
} catch (Exception e) {
return 0;
}
}


}


/**
* 将字符串转换为double 类型,报错或是空,都返回0

* @param str
* @return
*/
public static double safeDouble(String str) {
if (str == null) {
return 0.0;
} else {
try {
return Double.parseDouble(str);
} catch (Exception e) {
return 0.0;
}
}


}


/**
* unicode转中文

* @param str
* @return
* @author yutao
* @date 2017年1月24日上午10:33:25
*/
public static String unicodeToString(String str) {
Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
Matcher matcher = pattern.matcher(str);
char ch;
while (matcher.find()) {
ch = (char) Integer.parseInt(matcher.group(2), 16);
str = str.replace(matcher.group(1), ch + "");
}
return str;
}


/*public static String string2Unicode(String string) {


if (StringUtils.isBlank(string))
return null;
StringBuffer unicode = new StringBuffer();


for (int i = 0; i < string.length(); i++) {
// 取出每一个字符
char c = string.charAt(i);
// 转换为unicode
unicode.append("\\u" + Integer.toHexString(c));
}


return unicode.toString();
}*/

}


至此基本配置完了,下边就是分页类了该类可以直接拿去用如下:


package com.zwq.util;
import static com.zwq.constant.SystemConstant.*;
/**
 * 
 * @author zwq
 *
 */
public  class Cond {


/**
* 页码
*/
private Integer pageNum = SPLIT_PAGE_NUM;

/**
* 页条数
*/
private Integer pageSize = SPLIT_PAGE_SIZE;

/**
* 全文搜索条件字段
*/
private String  contentSearchText;


private String[] contentSerchColumns;
private Integer userid;
private Integer wttype;



public Integer getWttype() {
return wttype;
}


public void setWttype(Integer wttype) {
this.wttype = wttype;
}


public String getContentSearchText() {
return contentSearchText;
}


public void setContentSearchText(String contentSearchText) {
this.contentSearchText = contentSearchText;
}


/**
* 是否分页
*/
private boolean splitPage = false;




public boolean isSplitPage() {
return splitPage;
}


public void setSplitPage(boolean isSplitPage) {
this.splitPage = isSplitPage;
}


public Integer getPageNum() {
if (pageNum == null) {


pageNum = SPLIT_PAGE_NUM;
} else if (pageNum < 0) {


pageNum = SPLIT_PAGE_NUM;
}
return pageNum;
}


public void setPageNum(Integer pageNum) {
this.pageNum = pageNum;
}


public Integer getPageSize() {
if (pageSize == null) {
pageSize = SPLIT_PAGE_SIZE;
} else if (pageSize < 0) {
pageSize = SPLIT_PAGE_SIZE;
}
return pageSize;
}


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





public String[] getContentSerchColumns() {
return contentSerchColumns;
}


public void setContentSerchColumns(String[] contentSerchColumns) {
this.contentSerchColumns = contentSerchColumns;
}


/**
* 获取全文搜索的Sql
* @return
*/
public String getContentSearchSQL(){
StringBuilder sb=new StringBuilder();
String[] contentSearchCloumns = getContentSerchColumns();

sb.append(" and (1<>1");
if(contentSearchCloumns!=null){
for(String column:contentSearchCloumns){
sb.append(" or "+column+" like '%"+contentSearchText+"%' \n");
}
}
sb.append(" )");

return sb.toString();
}


public Integer getUserid() {
return userid;
}


public void setUserid(Integer userid) {
this.userid = userid;
}
}

以上Cond类是我当前用的分页类,诸位有需要可以直接拿去用,在此分页类中用到了自己提取封装的一个系统常量类SystemConstant 类代码如下:


package com.zwq.constant;


import java.util.ResourceBundle;


public class SystemConstant {


private static ResourceBundle bundle = ResourceBundle.getBundle("schema");


public static String DB_SCHEMA = "dbo.";
public static String DB_SCHEMA_CONFIG;
public static String DB_SCHEMA_CENTER;
public static String DB_SCHEMA_SPHM;
// public static String DB_SCHEMA2 = bundle.getString("dbname2");


public static String LAN_SUFFIX = "CN";
public static String LAN_SUFFIX_CN = "CN";
public static String LAN_SUFFIX_EN = "EN";
public static final String HEALTH_TYPE_ALARM = "A";
public static final String HEALTH_TYPE_FAULT = "F";
public static final String HEALTH_TYPE_CMS = "C";
public static final String DATA_TYPE_ALARM = "0";
public static final String DATA_TYPE_CMS = "2";
public static final String DATA_TYPE_FAULT = "1";


public static int SPLIT_PAGE_NUM = 1;
public static int SPLIT_PAGE_SIZE = 10;


static {
DB_SCHEMA_CONFIG = bundle.getString("db_schema_config");
DB_SCHEMA_CENTER = bundle.getString("db_schema_center");
DB_SCHEMA_SPHM = bundle.getString("db_schema_sphm");
}
}


到这儿基本上配置还有需要用到的一个分页类什么的都完了,接下来就是实际使用了代码如下:

直接在Controller中使用



@PostMapping("/getWtInfo")
public ResponseEntity getWtInfo(@RequestBody WtMatrixCond cond) {

ResponseEntity response = new ResponseEntity();
cond.setSplitPage(true);
// 是否需要分页
if (cond.isSplitPage()) {
PageHelper.startPage(cond.getPageNum(), cond.getPageSize());
}


List<TbDevPowerFiveDTO> tbDevPowerFiveList = wtMatrixServiceImp.getDevPowerFive(cond);


// 是否需要分页
if (cond.isSplitPage()) {
PageInfo<TbDevPowerFiveDTO> pageInfo = new PageInfo<TbDevPowerFiveDTO>(tbDevPowerFiveList);
response.setData(pageInfo);
} else {
response.setData(tbDevPowerFiveList);
}


response.setState(1);
response.setMessage("查询成功");
logger.info("返回数据打印====="+JSONObject.fromObject(response).toString());
return response;
}


WtMatrixCond  此java Bean 继承了Cond 分页Bean 可以在WtMatrixCond 类中直接使用Cond分页类中的属性

至此算是完结了,乱七八糟的很多,可能看着很乱,也可能不如其他大牛写的那么简洁明了,但是这算是我目前使用的所有的代码了,全都一股脑的贴出来了,希望对诸位能有所帮助吧。。。至此感谢。



猜你喜欢

转载自blog.csdn.net/Lenovozwq/article/details/80829853