几十分钟钱写了一篇集成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分页类中的属性
至此算是完结了,乱七八糟的很多,可能看着很乱,也可能不如其他大牛写的那么简洁明了,但是这算是我目前使用的所有的代码了,全都一股脑的贴出来了,希望对诸位能有所帮助吧。。。至此感谢。