diff --git a/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java index 6b4ba3565bdbc2001b6a49a3f5c71fd5f58b61b2..44b1e575ac1f40f39a605c3daddaefd00fe467ad 100644 --- a/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java +++ b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java @@ -1,9 +1,11 @@ package com.baomidou.mybatisplus.extension.toolkit; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.LambdaUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import org.apache.ibatis.session.SqlSession; import java.util.*; import java.util.function.*; @@ -40,7 +42,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map keyMap(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { - return list2Map(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, Function.identity(), peeks); + return list2Map(selectList(getType(sFunction), wrapper), sFunction, Function.identity(), peeks); } /** @@ -56,7 +58,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map keyMap(LambdaQueryWrapper wrapper, SFunction sFunction, boolean isParallel, Consumer... peeks) { - return list2Map(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, Function.identity(), isParallel, peeks); + return list2Map(selectList(getType(sFunction), wrapper), sFunction, Function.identity(), isParallel, peeks); } /** @@ -64,7 +66,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map map(LambdaQueryWrapper wrapper, SFunction keyFunc, SFunction valueFunc, Consumer... peeks) { - return list2Map(SqlHelper.getMapper(getType(keyFunc)).selectList(wrapper), keyFunc, valueFunc, peeks); + return list2Map(selectList(getType(keyFunc), wrapper), keyFunc, valueFunc, peeks); } /** @@ -82,7 +84,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map map(LambdaQueryWrapper wrapper, SFunction keyFunc, SFunction valueFunc, boolean isParallel, Consumer... peeks) { - return list2Map(SqlHelper.getMapper(getType(keyFunc)).selectList(wrapper), keyFunc, valueFunc, isParallel, peeks); + return list2Map(selectList(getType(keyFunc), wrapper), keyFunc, valueFunc, isParallel, peeks); } /** @@ -90,7 +92,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map> group(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { - return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); + return listGroupBy(selectList(getType(sFunction), wrapper), sFunction, peeks); } /** @@ -98,7 +100,7 @@ public class SimpleQuery { */ @SafeVarargs public static Map> group(LambdaQueryWrapper wrapper, SFunction sFunction, boolean isParallel, Consumer... peeks) { - return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, isParallel, peeks); + return listGroupBy(selectList(getType(sFunction), wrapper), sFunction, isParallel, peeks); } /** @@ -106,7 +108,7 @@ public class SimpleQuery { */ @SafeVarargs public static > M group(LambdaQueryWrapper wrapper, SFunction sFunction, Collector downstream, Consumer... peeks) { - return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, downstream, false, peeks); + return listGroupBy(selectList(getType(sFunction), wrapper), sFunction, downstream, false, peeks); } /** @@ -126,7 +128,7 @@ public class SimpleQuery { */ @SafeVarargs public static > M group(LambdaQueryWrapper wrapper, SFunction sFunction, Collector downstream, boolean isParallel, Consumer... peeks) { - return listGroupBy(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, downstream, isParallel, peeks); + return listGroupBy(selectList(getType(sFunction), wrapper), sFunction, downstream, isParallel, peeks); } /** @@ -134,7 +136,7 @@ public class SimpleQuery { */ @SafeVarargs public static List list(LambdaQueryWrapper wrapper, SFunction sFunction, Consumer... peeks) { - return list2List(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, peeks); + return list2List(selectList(getType(sFunction), wrapper), sFunction, peeks); } /** @@ -149,7 +151,7 @@ public class SimpleQuery { */ @SafeVarargs public static List list(LambdaQueryWrapper wrapper, SFunction sFunction, boolean isParallel, Consumer... peeks) { - return list2List(SqlHelper.getMapper(getType(sFunction)).selectList(wrapper), sFunction, isParallel, peeks); + return list2List(selectList(getType(sFunction), wrapper), sFunction, isParallel, peeks); } /** @@ -304,5 +306,24 @@ public class SimpleQuery { return Stream.of(peeks).reduce(StreamSupport.stream(list.spliterator(), isParallel), Stream::peek, Stream::concat); } + /** + * 通过entityClass查询列表,并关闭sqlSession + * + * @param entityClass 表对应实体 + * @param wrapper 条件构造器 + * @param 实体类型 + * @return 查询列表结果 + */ + private static List selectList(Class entityClass, LambdaQueryWrapper wrapper) { + SqlSession sqlSession = SqlHelper.sqlSession(entityClass); + List result; + try { + BaseMapper userMapper = SqlHelper.getMapper(entityClass, sqlSession); + result = userMapper.selectList(wrapper); + } finally { + sqlSession.close(); + } + return result; + } } diff --git a/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java index b143b7b7ab654b7c9849f69498d7810655b434a8..20a8be8055264c7ec503f3b8eefb9ae07fd68df0 100644 --- a/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java +++ b/mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlHelper.java @@ -266,13 +266,15 @@ public final class SqlHelper { /** - * 获取Mapper + * 通过entityClass获取Mapper * * @param entityClass 实体 * @param 实体类型 * @return Mapper + * @deprecated 使用后未释放连接 {@link SqlHelper#getMapper(Class, SqlSession)} */ @SuppressWarnings("unchecked") + @Deprecated public static BaseMapper getMapper(Class entityClass) { Optional.ofNullable(entityClass).orElseThrow(() -> ExceptionUtils.mpe("entityClass can't be null!")); TableInfo tableInfo = Optional.ofNullable(TableInfoHelper.getTableInfo(entityClass)).orElseThrow(() -> ExceptionUtils.mpe("Can not find TableInfo from Class: \"%s\".", entityClass.getName())); @@ -289,4 +291,35 @@ public final class SqlHelper { return mapper; } + /** + * 通过entityClass获取Mapper,记得要释放连接 + * 例: {@code + * SqlSession sqlSession = SqlHelper.sqlSession(entityClass); + * try{ + * BaseMapper userMapper = getMapper(User.class, sqlSession); + * }finally{ + * sqlSession.close(); + * } + * } + * + * @param entityClass 实体 + * @param 实体类型 + * @return Mapper + */ + @SuppressWarnings("unchecked") + public static BaseMapper getMapper(Class entityClass, SqlSession sqlSession) { + Optional.ofNullable(entityClass).orElseThrow(() -> ExceptionUtils.mpe("entityClass can't be null!")); + TableInfo tableInfo = Optional.ofNullable(TableInfoHelper.getTableInfo(entityClass)).orElseThrow(() -> ExceptionUtils.mpe("Can not find TableInfo from Class: \"%s\".", entityClass.getName())); + String namespace = tableInfo.getCurrentNamespace(); + + Configuration configuration = tableInfo.getConfiguration(); + BaseMapper mapper; + try { + mapper = (BaseMapper) configuration.getMapper(Class.forName(namespace), sqlSession); + } catch (ClassNotFoundException e) { + throw ExceptionUtils.mpe(e); + } + return mapper; + } + }