Procházet zdrojové kódy

处理了SimpleQuery查询后未释放连接的问题

VampireAchao před 3 roky
rodič
revize
c0e62ebe6c

+ 31 - 10
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SimpleQuery.java

@@ -1,9 +1,11 @@
 package com.baomidou.mybatisplus.extension.toolkit;
 package com.baomidou.mybatisplus.extension.toolkit;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 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.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import org.apache.ibatis.session.SqlSession;
 
 
 import java.util.*;
 import java.util.*;
 import java.util.function.*;
 import java.util.function.*;
@@ -40,7 +42,7 @@ public class SimpleQuery {
      */
      */
     @SafeVarargs
     @SafeVarargs
     public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
     public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... 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
     @SafeVarargs
     public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... peeks) {
     public static <E, A> Map<A, E> keyMap(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... 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
     @SafeVarargs
     public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, Consumer<E>... peeks) {
     public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, Consumer<E>... 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
     @SafeVarargs
     public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, boolean isParallel, Consumer<E>... peeks) {
     public static <E, A, P> Map<A, P> map(LambdaQueryWrapper<E> wrapper, SFunction<E, A> keyFunc, SFunction<E, P> valueFunc, boolean isParallel, Consumer<E>... 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
     @SafeVarargs
     public static <E, A> Map<A, List<E>> group(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
     public static <E, A> Map<A, List<E>> group(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... 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
     @SafeVarargs
     public static <T, K> Map<K, List<T>> group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, boolean isParallel, Consumer<T>... peeks) {
     public static <T, K> Map<K, List<T>> group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, boolean isParallel, Consumer<T>... 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
     @SafeVarargs
     public static <T, K, D, A, M extends Map<K, D>> M group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<? super T, A, D> downstream, Consumer<T>... peeks) {
     public static <T, K, D, A, M extends Map<K, D>> M group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<? super T, A, D> downstream, Consumer<T>... 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
     @SafeVarargs
     public static <T, K, D, A, M extends Map<K, D>> M group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<? super T, A, D> downstream, boolean isParallel, Consumer<T>... peeks) {
     public static <T, K, D, A, M extends Map<K, D>> M group(LambdaQueryWrapper<T> wrapper, SFunction<T, K> sFunction, Collector<? super T, A, D> downstream, boolean isParallel, Consumer<T>... 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
     @SafeVarargs
     public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... peeks) {
     public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, Consumer<E>... 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
     @SafeVarargs
     public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... peeks) {
     public static <E, A> List<A> list(LambdaQueryWrapper<E> wrapper, SFunction<E, A> sFunction, boolean isParallel, Consumer<E>... 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);
         return Stream.of(peeks).reduce(StreamSupport.stream(list.spliterator(), isParallel), Stream::peek, Stream::concat);
     }
     }
 
 
+    /**
+     * 通过entityClass查询列表,并关闭sqlSession
+     *
+     * @param entityClass 表对应实体
+     * @param wrapper     条件构造器
+     * @param <E>         实体类型
+     * @return 查询列表结果
+     */
+    private static <E> List<E> selectList(Class<E> entityClass, LambdaQueryWrapper<E> wrapper) {
+        SqlSession sqlSession = SqlHelper.sqlSession(entityClass);
+        List<E> result;
+        try {
+            BaseMapper<E> userMapper = SqlHelper.getMapper(entityClass, sqlSession);
+            result = userMapper.selectList(wrapper);
+        } finally {
+            sqlSession.close();
+        }
+        return result;
+    }
 
 
 }
 }

+ 34 - 1
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 entityClass 实体
      * @param <T>         实体类型
      * @param <T>         实体类型
      * @return Mapper
      * @return Mapper
+     * @deprecated 使用后未释放连接 {@link SqlHelper#getMapper(Class, SqlSession)}
      */
      */
     @SuppressWarnings("unchecked")
     @SuppressWarnings("unchecked")
+    @Deprecated
     public static <T> BaseMapper<T> getMapper(Class<T> entityClass) {
     public static <T> BaseMapper<T> getMapper(Class<T> entityClass) {
         Optional.ofNullable(entityClass).orElseThrow(() -> ExceptionUtils.mpe("entityClass can't be null!"));
         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()));
         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;
         return mapper;
     }
     }
 
 
+    /**
+     * 通过entityClass获取Mapper,记得要释放连接
+     * 例: {@code
+     * SqlSession sqlSession = SqlHelper.sqlSession(entityClass);
+     * try{
+     * BaseMapper<User> userMapper = getMapper(User.class, sqlSession);
+     * }finally{
+     * sqlSession.close();
+     * }
+     * }
+     *
+     * @param entityClass 实体
+     * @param <T>         实体类型
+     * @return Mapper
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> BaseMapper<T> getMapper(Class<T> 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<T> mapper;
+        try {
+            mapper = (BaseMapper<T>) configuration.getMapper(Class.forName(namespace), sqlSession);
+        } catch (ClassNotFoundException e) {
+            throw ExceptionUtils.mpe(e);
+        }
+        return mapper;
+    }
+
 }
 }