瀏覽代碼

调整SqlRuuner(方法实现类复用,支持处理单数组).

nieqiurong 1 月之前
父節點
當前提交
49a5f3473f

+ 95 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/assist/ISqlRunner.java

@@ -17,18 +17,41 @@ package com.baomidou.mybatisplus.core.assist;
 
 import com.baomidou.mybatisplus.core.injector.SqlRunnerInjector;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import org.apache.ibatis.parsing.GenericTokenParser;
+import org.apache.ibatis.reflection.MetaObject;
+import org.apache.ibatis.reflection.SystemMetaObject;
+import org.apache.ibatis.type.SimpleTypeRegistry;
 
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 /**
  * SqlRunner执行接口
+ * <p>
+ * 自3.5.12开始,(当传入的参数是单参数时,支持使用Map,Array,List,JavaBean)
+ * <li>当参数为 Map 时可通过{key}进行属性访问
+ * <li>当参数为 JavaBean 时可通过{property}进行属性访问
+ * <li>当参数为 List 时直接访问索引 {0} </li>
+ * <li>当参数为 Array 时直接访问索引 {0} </li>
+ * </p>
  *
- * @author yuxiaobin
+ * @author yuxiaobin, nieqiurong
  * @since 2018/2/7
  */
 public interface ISqlRunner {
 
+    /**
+     * 默认分词处理器
+     *
+     * @since 3.5.12
+     */
+    GenericTokenParser TOKEN_PARSER = new GenericTokenParser("{", "}", content -> "#{" + content + "}");
+
     /**
      * INSERT 语句
      */
@@ -162,4 +185,75 @@ public interface ISqlRunner {
      * @return 分页数据
      */
     <E extends IPage<Map<String, Object>>> E selectPage(E page, String sql, Object... args);
+
+
+    /**
+     * 获取执行语句
+     *
+     * @param sql 原始sql
+     * @return 执行语句
+     * @since 3.5.12
+     */
+    default String parse(String sql) {
+        return TOKEN_PARSER.parse(sql);
+    }
+
+    /**
+     * 获取参数列表
+     *
+     * @param args 参数(单参数时,支持使用Map,List,Array,JavaBean访问)
+     * @return 参数map
+     * @since 3.5.12
+     */
+    @SuppressWarnings("rawtypes")
+    default Map<String, Object> getParams(Object... args) {
+        if (args != null && args.length > 0) {
+            if (args.length == 1) {
+                // 暂定支持 Map,Collection,Array,JavaBean
+                Object arg = args[0];
+                if (arg instanceof Map) {
+                    //noinspection unchecked
+                    return new HashMap<String, Object>((Map) arg);
+                }
+                if (arg instanceof Collection) {
+                    Collection<?> collection = (Collection<?>) arg;
+                    Map<String, Object> params = new HashMap<>(CollectionUtils.newHashMapWithExpectedSize(collection.size()));
+                    Iterator<?> iterator = collection.iterator();
+                    int index = 0;
+                    while (iterator.hasNext()) {
+                        params.put(String.valueOf(index), iterator.next());
+                        index++;
+                    }
+                    return params;
+                }
+                Class<?> cls = arg.getClass();
+                if (cls.isArray()) {
+                    int length = Array.getLength(arg);
+                    Map<String, Object> params = new HashMap<>(CollectionUtils.newHashMapWithExpectedSize(length));
+                    for (int i = 0; i < length; i++) {
+                        params.put(String.valueOf(i), Array.get(arg, i));
+                    }
+                    return params;
+                }
+                if (!(cls.isPrimitive()
+                    || SimpleTypeRegistry.isSimpleType(cls)
+                    || cls.isEnum())
+                ) {
+                    MetaObject metaObject = SystemMetaObject.forObject(arg);
+                    String[] getterNames = metaObject.getGetterNames();
+                    Map<String, Object> params = new HashMap<>(CollectionUtils.newHashMapWithExpectedSize(getterNames.length));
+                    for (String getterName : getterNames) {
+                        params.put(getterName, metaObject.getValue(getterName));
+                    }
+                    return params;
+                }
+            }
+            Map<String, Object> params = CollectionUtils.newHashMapWithExpectedSize(args.length);
+            for (int i = 0; i < args.length; i++) {
+                params.put(String.valueOf(i), args[i]);
+            }
+            return params;
+        }
+        return new HashMap<>();
+    }
 }

+ 19 - 71
mybatis-plus-spring/src/main/java/com/baomidou/mybatisplus/extension/toolkit/SqlRunner.java

@@ -17,22 +17,15 @@ package com.baomidou.mybatisplus.extension.toolkit;
 
 import com.baomidou.mybatisplus.core.assist.ISqlRunner;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.GlobalConfigUtils;
+import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.apache.ibatis.logging.Log;
 import org.apache.ibatis.logging.LogFactory;
-import org.apache.ibatis.parsing.GenericTokenParser;
-import org.apache.ibatis.reflection.MetaObject;
-import org.apache.ibatis.reflection.SystemMetaObject;
 import org.apache.ibatis.session.SqlSession;
 import org.apache.ibatis.session.SqlSessionFactory;
-import org.apache.ibatis.type.SimpleTypeRegistry;
 import org.mybatis.spring.SqlSessionUtils;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -44,6 +37,7 @@ import java.util.Optional;
  * <li>当参数为 Map 时可通过{key}进行属性访问
  * <li>当参数为 JavaBean 时可通过{property}进行属性访问
  * <li>当参数为 List 时直接访问索引 {0} </li>
+ * <li>当参数为 Array 时直接访问索引 {0} </li>
  * </p>
  *
  * @author Caratacus, nieqiurong
@@ -51,19 +45,34 @@ import java.util.Optional;
  */
 public class SqlRunner implements ISqlRunner {
 
+    /**
+     * 日志对象
+     */
     private static final Log LOG = LogFactory.getLog(SqlRunner.class);
 
-    // 单例Query
+    /**
+     * 默认实例 (使用{@link SqlHelper#FACTORY}进行会话操作)
+     */
     public static final SqlRunner DEFAULT = new SqlRunner();
 
     /**
-     * 实体类 (当未指定时,将使用{@link SqlHelper#FACTORY}进行会话操作)
+     * 实体类 (需要被扫描注入的实体对象,当未指定时,将使用{@link SqlHelper#FACTORY}进行会话操作)
+     *
+     * @see com.baomidou.mybatisplus.core.metadata.TableInfoHelper#initTableInfo(MapperBuilderAssistant, Class)
      */
     private Class<?> clazz;
 
+    /**
+     * 默认构造,使用{@link SqlHelper#FACTORY}进行会话操作
+     */
     public SqlRunner() {
     }
 
+    /**
+     * 通过实体类构造
+     *
+     * @param clazz 实体类
+     */
     public SqlRunner(Class<?> clazz) {
         this.clazz = clazz;
     }
@@ -142,67 +151,6 @@ public class SqlRunner implements ISqlRunner {
         return sqlMap;
     }
 
-    /**
-     * 获取执行语句
-     *
-     * @param sql 原始sql
-     * @return 执行语句
-     * @since 3.5.12
-     */
-    private String parse(String sql) {
-        return new GenericTokenParser("{", "}", content -> "#{" + content + "}").parse(sql);
-    }
-
-    /**
-     * 获取参数列表
-     *
-     * @param args 参数(单参数时,支持使用Map,List,JavaBean访问)
-     * @return 参数map
-     * @since 3.5.12
-     */
-    private Map<String, Object> getParams(Object... args) {
-        if (args != null && args.length > 0) {
-            if (args.length == 1) {
-                // 暂定支持 Map,Collection,JavaBean
-                Object arg = args[0];
-                if (arg instanceof Map) {
-                    //noinspection unchecked
-                    return new HashMap<String, Object>((Map) arg);
-                }
-                if (arg instanceof Collection) {
-                    Collection<?> collection = (Collection<?>) arg;
-                    Map<String, Object> params = new HashMap<>(CollectionUtils.newHashMapWithExpectedSize(collection.size()));
-                    Iterator<?> iterator = collection.iterator();
-                    int index = 0;
-                    while (iterator.hasNext()) {
-                        params.put(String.valueOf(index), iterator.next());
-                        index++;
-                    }
-                    return params;
-                }
-                Class<?> cls = arg.getClass();
-                if (!(cls.isPrimitive()
-                    || SimpleTypeRegistry.isSimpleType(cls)
-                    || cls.isArray() || cls.isEnum())
-                ) {
-                    MetaObject metaObject = SystemMetaObject.forObject(arg);
-                    String[] getterNames = metaObject.getGetterNames();
-                    Map<String, Object> params = new HashMap<>(CollectionUtils.newHashMapWithExpectedSize(getterNames.length));
-                    for (String getterName : getterNames) {
-                        params.put(getterName, metaObject.getValue(getterName));
-                    }
-                    return params;
-                }
-            }
-            Map<String, Object> params = CollectionUtils.newHashMapWithExpectedSize(args.length);
-            for (int i = 0; i < args.length; i++) {
-                params.put(String.valueOf(i), args[i]);
-            }
-            return params;
-        }
-        return new HashMap<>();
-    }
-
     /**
      * 获取sqlMap参数
      *

+ 21 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/SqlRunnerTest.java

@@ -18,6 +18,7 @@ import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -102,6 +103,22 @@ class SqlRunnerTest {
     void testByMap() {
         var map = Map.of("name", "test", "age", AgeEnum.TWO, "id", 11000L);
         Assertions.assertTrue(SqlRunner.db().insert("INSERT INTO h2student (id, name, age ) VALUES ( {id}, {name}, {age} )", map));
+        Map<String, Object> resultMap = SqlRunner.db().selectOne("select * from h2student where id = {id}", map);
+        Assertions.assertNotNull(resultMap);
+        Assertions.assertEquals(map.get("name"), resultMap.get("NAME"));
+        Assertions.assertEquals(AgeEnum.TWO.getValue(), resultMap.get("AGE"));
+        Assertions.assertEquals(map.get("id"), resultMap.get("ID"));
+        map = new HashMap<>();
+        map.put("name","test");
+        map.put("age", AgeEnum.TWO);
+        map.put("id", 11100L);
+        map.put("size", "测试size");
+        Assertions.assertTrue(SqlRunner.db().insert("INSERT INTO h2student (id, name, age ) VALUES ( {id}, {size}, {age} )", map));
+        resultMap = SqlRunner.db().selectOne("select * from h2student where id = {id}", map);
+        Assertions.assertNotNull(resultMap);
+        Assertions.assertEquals(map.get("size"), resultMap.get("NAME"));
+        Assertions.assertEquals(AgeEnum.TWO.getValue(), resultMap.get("AGE"));
+        Assertions.assertEquals(map.get("id"), resultMap.get("ID"));
     }
 
     @Test
@@ -146,6 +163,10 @@ class SqlRunnerTest {
         Assertions.assertNotNull(resultMap);
         Assertions.assertEquals("测试学生", resultMap.get("NAME"));
         Assertions.assertEquals(AgeEnum.THREE.getValue(), resultMap.get("AGE"));
+        resultMap = SqlRunner.db().selectOne("select * from h2student where id = {0}", new long[]{11003L});
+        Assertions.assertNotNull(resultMap);
+        Assertions.assertEquals("测试学生", resultMap.get("NAME"));
+        Assertions.assertEquals(AgeEnum.THREE.getValue(), resultMap.get("AGE"));
         Assertions.assertEquals(11003L, resultMap.get("ID"));
     }