package com.iailab.framework.mybatis.core.util; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.metadata.OrderItem; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.iailab.framework.common.pojo.PageParam; import com.iailab.framework.common.pojo.SortingField; import com.iailab.framework.mybatis.core.enums.DbTypeEnum; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.stream.Collectors; /** * MyBatis 工具类 */ public class MyBatisUtils { private static final String MYSQL_ESCAPE_CHARACTER = "`"; public static <T> Page<T> buildPage(PageParam pageParam) { return buildPage(pageParam, null); } public static <T> Page<T> buildPage(PageParam pageParam, Collection<SortingField> sortingFields) { // 页ç + æ•°é‡ Page<T> page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize()); // 排åºå—段 if (!CollectionUtil.isEmpty(sortingFields)) { page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ? OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField())) .collect(Collectors.toList())); } return page; } /** * å°†æ‹¦æˆªå™¨æ·»åŠ åˆ°é“¾ä¸ * 由于 MybatisPlusInterceptor ä¸æ”¯æŒæ·»åŠ 拦截器,所以åªèƒ½å…¨é‡è®¾ç½® * * @param interceptor 链 * @param inner 拦截器 * @param index ä½ç½® */ public static void addInterceptor(MybatisPlusInterceptor interceptor, InnerInterceptor inner, int index) { List<InnerInterceptor> inners = new ArrayList<>(interceptor.getInterceptors()); inners.add(index, inner); interceptor.setInterceptors(inners); } /** * 获得 Table 对应的表å * <p> * 兼容 MySQL 转义表å `t_xxx` * * @param table 表 * @return 去除转移å—符åŽçš„表å */ public static String getTableName(Table table) { String tableName = table.getName(); if (tableName.startsWith(MYSQL_ESCAPE_CHARACTER) && tableName.endsWith(MYSQL_ESCAPE_CHARACTER)) { tableName = tableName.substring(1, tableName.length() - 1); } return tableName; } /** * 构建 Column 对象 * * @param tableName 表å * @param tableAlias 别å * @param column å—段å * @return Column 对象 */ public static Column buildColumn(String tableName, Alias tableAlias, String column) { if (tableAlias != null) { tableName = tableAlias.getName(); } return new Column(tableName + StringPool.DOT + column); } /** * 跨数æ®åº“çš„ find_in_set 实现 * * @param column å—段å称 * @param value 查询值(ä¸å¸¦å•å¼•å·) * @return sql */ public static String findInSet(String column, Object value) { // 这里ä¸ç”¨SqlConstants.DB_TYPEï¼Œå› ä¸ºå®ƒæ˜¯ä½¿ç”¨ primary æ•°æ®æºçš„ url 推æ–出æ¥çš„类型 DbType dbType = JdbcUtils.getDbType(); return DbTypeEnum.getFindInSetTemplate(dbType) .replace("#{column}", column) .replace("#{value}", StrUtil.toString(value)); } }