Selaa lähdekoodia

Merge branch '3.0' into 3.0

胡洋 3 vuotta sitten
vanhempi
commit
f9c9a3ba0f
22 muutettua tiedostoa jossa 291 lisäystä ja 20 poistoa
  1. 1 1
      mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/IdType.java
  2. 9 7
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisParameterHandler.java
  3. 2 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java
  4. 1 1
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/SelectBatchByIds.java
  5. 2 2
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java
  6. 14 0
      mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java
  7. 23 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/incrementer/DmKeyGenerator.java
  8. 17 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/incrementer/FirebirdKeyGenerator.java
  9. 2 2
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDeleteBatchByIds.java
  10. 12 3
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java
  11. 3 1
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java
  12. 19 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/FirebirdDialect.java
  13. 3 0
      mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/JdbcUtils.java
  14. 7 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/BaseDbTest.java
  15. 1 1
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/logicdel/EntityMapper.java
  16. 17 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/A.java
  17. 14 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/AMapper.java
  18. 14 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/B.java
  19. 10 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/BMapper.java
  20. 100 0
      mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/PluginSomeTest.java
  21. 14 0
      mybatis-plus/src/test/resources/com/baomidou/mybatisplus/test/puginsome/AMapper.xml
  22. 6 0
      mybatis-plus/src/test/resources/com/baomidou/mybatisplus/test/puginsome/BMapper.xml

+ 1 - 1
mybatis-plus-annotation/src/main/java/com/baomidou/mybatisplus/annotation/IdType.java

@@ -40,7 +40,7 @@ public enum IdType {
      */
     INPUT(2),
 
-    /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */
+    /* 以下2种类型、只有当插入对象ID 为空,才自动填充。 */
     /**
      * 分配ID (主键类型为number或string),
      * 默认实现类 {@link com.baomidou.mybatisplus.core.incrementer.DefaultIdentifierGenerator}(雪花算法)

+ 9 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisParameterHandler.java

@@ -96,6 +96,7 @@ public class MybatisParameterHandler implements ParameterHandler {
             TableInfo tableInfo = null;
             Object entity = parameter;
             if (parameter instanceof Map) {
+                // 处理单参数使用注解标记的时候,尝试提取et来获取实体参数
                 Map<?, ?> map = (Map<?, ?>) parameter;
                 if (map.containsKey(Constants.ENTITY)) {
                     Object et = map.get(Constants.ENTITY);
@@ -188,15 +189,16 @@ public class MybatisParameterHandler implements ParameterHandler {
             parameters = (Collection) parameterObject;
         } else if (parameterObject instanceof Map) {
             Map parameterMap = (Map) parameterObject;
+            // 尝试提取参数进行填充,如果是多参数时,在使用注解时,请注意使用collection,list,array进行声明
             if (parameterMap.containsKey("collection")) {
                 parameters = (Collection) parameterMap.get("collection");
-            } if (parameterMap.containsKey(Constants.COLLECTION)) {
-                // 兼容逻辑删除对象填充
-                parameters = (Collection) parameterMap.get(Constants.COLLECTION);
-            } else if (parameterMap.containsKey("list")) {
-                parameters = (List) parameterMap.get("list");
-            } else if (parameterMap.containsKey("array")) {
-                parameters = Arrays.asList((Object[]) parameterMap.get("array"));
+            } else if (parameterMap.containsKey(Constants.COLL)) {
+                // 兼容逻辑删除对象填充,这里的集合字段后面重构的时候应该和原生保持一致,使用collection
+                parameters = (Collection) parameterMap.get(Constants.COLL);
+            } else if (parameterMap.containsKey(Constants.LIST)) {
+                parameters = (List) parameterMap.get(Constants.LIST);
+            } else if (parameterMap.containsKey(Constants.ARRAY)) {
+                parameters = Arrays.asList((Object[]) parameterMap.get(Constants.ARRAY));
             }
         }
         return parameters;

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/DeleteBatchByIds.java

@@ -56,7 +56,7 @@ public class DeleteBatchByIds extends AbstractMethod {
                 SqlScriptUtils.convertForeach(
                     SqlScriptUtils.convertChoose("@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(item.getClass())",
                         "#{item}", "#{item." + tableInfo.getKeyProperty() + "}"),
-                    COLLECTION, null, "item", COMMA));
+                    COLL, null, "item", COMMA));
             SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, Object.class);
             return this.addDeleteMappedStatement(mapperClass, getMethod(sqlMethod), sqlSource);
         }
@@ -72,7 +72,7 @@ public class DeleteBatchByIds extends AbstractMethod {
             sqlLogicSet(tableInfo), tableInfo.getKeyColumn(), SqlScriptUtils.convertForeach(
                 SqlScriptUtils.convertChoose("@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(item.getClass())",
                     "#{item}", "#{item." + tableInfo.getKeyProperty() + "}"),
-                COLLECTION, null, "item", COMMA),
+                COLL, null, "item", COMMA),
             tableInfo.getLogicDeleteSql(true, true));
     }
 }

+ 1 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/methods/SelectBatchByIds.java

@@ -47,7 +47,7 @@ public class SelectBatchByIds extends AbstractMethod {
         SqlMethod sqlMethod = SqlMethod.SELECT_BATCH_BY_IDS;
         SqlSource sqlSource = languageDriver.createSqlSource(configuration, String.format(sqlMethod.getSql(),
                 sqlSelectColumns(tableInfo, false), tableInfo.getTableName(), tableInfo.getKeyColumn(),
-                SqlScriptUtils.convertForeach("#{item}", COLLECTION, null, "item", COMMA),
+                SqlScriptUtils.convertForeach("#{item}", COLL, null, "item", COMMA),
                 tableInfo.getLogicDeleteSql(true, true)), Object.class);
         return addSelectMappedStatementForTable(mapperClass, getMethod(sqlMethod), sqlSource, tableInfo);
     }

+ 2 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/mapper/BaseMapper.java

@@ -125,7 +125,7 @@ public interface BaseMapper<T> extends Mapper<T> {
      *
      * @param idList 主键ID列表或实体列表(不能为 null 以及 empty)
      */
-    int deleteBatchIds(@Param(Constants.COLLECTION) Collection<?> idList);
+    int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);
 
     /**
      * 根据 ID 修改
@@ -154,7 +154,7 @@ public interface BaseMapper<T> extends Mapper<T> {
      *
      * @param idList 主键ID列表(不能为 null 以及 empty)
      */
-    List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
+    List<T> selectBatchIds(@Param(Constants.COLL) Collection<? extends Serializable> idList);
 
     /**
      * 查询(根据 columnMap 条件)

+ 14 - 0
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/toolkit/Constants.java

@@ -126,8 +126,17 @@ public interface Constants extends StringPool, Serializable {
     String COLUMN_MAP_IS_EMPTY = COLUMN_MAP + DOT + "isEmpty";
     /**
      * collection
+     *
+     * @see #COLL
+     * @deprecated 3.5.2 后面修改成collection
      */
+    @Deprecated
     String COLLECTION = "coll";
+
+    /**
+     * @since 3.5.2
+     */
+    String COLL = "coll";
     /**
      * list
      *
@@ -142,6 +151,11 @@ public interface Constants extends StringPool, Serializable {
      * limit
      */
     String LIMIT = "LIMIT";
+
+    /**
+     * @since 3.5.2
+     */
+    String ARRAY = "array";
     /**
      * order by
      */

+ 23 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/incrementer/DmKeyGenerator.java

@@ -0,0 +1,23 @@
+package com.baomidou.mybatisplus.extension.incrementer;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
+
+/**
+ * DM Sequence
+ *
+ * @author cdtjj
+ * @since 2022-04-22
+ */
+public class DmKeyGenerator implements IKeyGenerator {
+
+	@Override
+	public String executeSql(String incrementerName) {
+		return "SELECT " + incrementerName + ".NEXTVAL FROM DUAL";
+	}
+
+	@Override
+	public DbType dbType() {
+		return DbType.DM;
+	}
+}

+ 17 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/incrementer/FirebirdKeyGenerator.java

@@ -0,0 +1,17 @@
+package com.baomidou.mybatisplus.extension.incrementer;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator;
+
+public class FirebirdKeyGenerator implements IKeyGenerator {
+
+    @Override
+    public String executeSql(String incrementerName) {
+        return "SELECT next value for " + incrementerName + " from rdb$database";
+    }
+
+    @Override
+    public DbType dbType() {
+        return DbType.FIREBIRD;
+    }
+}

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/injector/methods/LogicDeleteBatchByIds.java

@@ -52,14 +52,14 @@ public class LogicDeleteBatchByIds extends DeleteBatchByIds {
             .collect(toList());
         if (CollectionUtils.isNotEmpty(fieldInfos)) {
             String sqlScript = fieldInfos.stream()
-                .map(i -> i.getSqlSet(COLLECTION + "[0].")).collect(joining(EMPTY));
+                .map(i -> i.getSqlSet(COLL + "[0].")).collect(joining(EMPTY));
             String sqlSet = "SET " + SqlScriptUtils.convertIf(sqlScript, "!@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(_parameter.getClass())", true)
                 + tableInfo.getLogicDeleteSql(false, false);
             return String.format(sqlMethod.getSql(), tableInfo.getTableName(), sqlSet, tableInfo.getKeyColumn(),
                 SqlScriptUtils.convertForeach(
                     SqlScriptUtils.convertChoose("@org.apache.ibatis.type.SimpleTypeRegistry@isSimpleType(item.getClass())",
                         "#{item}", "#{item." + tableInfo.getKeyProperty() + "}"),
-                    COLLECTION, null, "item", COMMA),
+                    COLL, null, "item", COMMA),
                 tableInfo.getLogicDeleteSql(true, true));
         } else {
             return super.logicDeleteScript(tableInfo, sqlMethod);

+ 12 - 3
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/inner/PaginationInnerInterceptor.java

@@ -331,13 +331,22 @@ public class PaginationInnerInterceptor implements InnerInterceptor {
                         }
                         // 不区分大小写
                         str = str.toLowerCase();
-                        String onExpressionS = join.getOnExpression().toString();
-                        /* 如果 join 里包含 ?(代表有入参) 或者 where 条件里包含使用 join 的表的字段作条件,就不移除 join */
-                        if (onExpressionS.contains(StringPool.QUESTION_MARK) || whereS.contains(str)) {
+
+                        if (whereS.contains(str)) {
+                            /* 如果 where 条件里包含使用 join 的表的字段作条件,就不移除 join */
                             canRemoveJoin = false;
                             break;
                         }
+
+                        for (Expression expression : join.getOnExpressions()) {
+                            if (expression.toString().contains(StringPool.QUESTION_MARK)) {
+                                /* 如果 join 里包含 ?(代表有入参) 就不移除 join */
+                                canRemoveJoin = false;
+                                break;
+                            }
+                        }
                     }
+
                     if (canRemoveJoin) {
                         plainSelect.setJoins(null);
                     }

+ 3 - 1
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/DialectFactory.java

@@ -80,10 +80,12 @@ public class DialectFactory {
                 dialect = new SybaseDialect();
             } else if (dbType == DbType.GBASEDBT) {
                 dialect = new GBasedbtDialect();
-            } else if (dbType == DbType.GBASE_INFORMIX){
+            } else if (dbType == DbType.GBASE_INFORMIX) {
                 dialect = new GBaseInfromixDialect();
             }else if (dbType == DbType.XCloud){
                 dialect = new XCloudDialect();
+            } else if (dbType == DbType.FIREBIRD) {
+                dialect = new FirebirdDialect();
             }
             DIALECT_ENUM_MAP.put(dbType, dialect);
         }

+ 19 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/plugins/pagination/dialects/FirebirdDialect.java

@@ -0,0 +1,19 @@
+package com.baomidou.mybatisplus.extension.plugins.pagination.dialects;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.DialectModel;
+
+/**
+ * Firebird 数据库分页语句组装实现,SQL测试版本为4.0
+ * 备注:The FIRST/SKIP and ROWS clause are non-standard alternatives
+ *
+ * @author cdtjj
+ * @since 2022-04-26
+ */
+public class FirebirdDialect implements IDialect {
+
+    @Override
+    public DialectModel buildPaginationSql(String originalSql, long offset, long limit) {
+        String sql = originalSql + " OFFSET " + FIRST_MARK + " ROWS FETCH NEXT " + SECOND_MARK + " ROWS ONLY";
+        return new DialectModel(sql, offset, limit).setConsumerChain();
+    }
+}

+ 3 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/toolkit/JdbcUtils.java

@@ -125,6 +125,9 @@ public class JdbcUtils {
         } else if (url.contains(":xcloud:")) {
             return DbType.XCloud;
         }else {
+        } else if (url.contains(":firebirdsql:")) {
+            return DbType.FIREBIRD;
+        } else {
             logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not Supported!");
             return DbType.OTHER;
         }

+ 7 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/BaseDbTest.java

@@ -27,6 +27,7 @@ import org.springframework.jdbc.datasource.SimpleDriverDataSource;
 import javax.sql.DataSource;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Collections;
 import java.util.List;
 import java.util.function.Consumer;
 
@@ -83,6 +84,8 @@ public abstract class BaseDbTest<T> extends TypeReference<T> {
             }
         }
         configuration.addMapper(mapper);
+        otherMapper().forEach(configuration::addMapper);
+
         if (CollectionUtils.isNotEmpty(interceptors)) {
             interceptors.forEach(configuration::addInterceptor);
         }
@@ -155,4 +158,8 @@ public abstract class BaseDbTest<T> extends TypeReference<T> {
     protected Consumer<Configuration> consumer() {
         return null;
     }
+
+    protected List<Class<?>> otherMapper() {
+        return Collections.emptyList();
+    }
 }

+ 1 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/logicdel/EntityMapper.java

@@ -16,7 +16,7 @@ public interface EntityMapper extends BaseMapper<Entity> {
     @Select("select * from entity where id = #{id}")
     Entity byId(Long id);
 
-    int testDeleteBatch(@Param(Constants.COLLECTION) List<Entity> entityList);
+    int testDeleteBatch(@Param(Constants.COLL) List<Entity> entityList);
 
 
 }

+ 17 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/A.java

@@ -0,0 +1,17 @@
+package com.baomidou.mybatisplus.test.puginsome;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+/**
+ * @author miemie
+ * @since 2022-05-11
+ */
+@Data
+public class A {
+    private int id;
+    private String name;
+
+    @TableField(exist = false)
+    private B b;
+}

+ 14 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/AMapper.java

@@ -0,0 +1,14 @@
+package com.baomidou.mybatisplus.test.puginsome;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * @author miemie
+ * @since 2022-05-11
+ */
+public interface AMapper extends BaseMapper<A> {
+
+    List<A> list();
+}

+ 14 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/B.java

@@ -0,0 +1,14 @@
+package com.baomidou.mybatisplus.test.puginsome;
+
+import lombok.Data;
+
+/**
+ * @author miemie
+ * @since 2022-05-11
+ */
+@Data
+public class B {
+    private int id;
+    private int aId;
+    private String name;
+}

+ 10 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/BMapper.java

@@ -0,0 +1,10 @@
+package com.baomidou.mybatisplus.test.puginsome;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @author miemie
+ * @since 2022-05-11
+ */
+public interface BMapper extends BaseMapper<B> {
+}

+ 100 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/puginsome/PluginSomeTest.java

@@ -0,0 +1,100 @@
+package com.baomidou.mybatisplus.test.puginsome;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
+import com.baomidou.mybatisplus.test.BaseDbTest;
+import org.apache.ibatis.executor.Executor;
+import org.apache.ibatis.executor.statement.StatementHandler;
+import org.apache.ibatis.mapping.BoundSql;
+import org.apache.ibatis.mapping.MappedStatement;
+import org.apache.ibatis.plugin.Interceptor;
+import org.apache.ibatis.session.ResultHandler;
+import org.apache.ibatis.session.RowBounds;
+import org.junit.jupiter.api.Test;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author miemie
+ * @since 2020-06-24
+ */
+public class PluginSomeTest extends BaseDbTest<AMapper> {
+
+    @Test
+    void test() {
+        doTest(m -> {
+            List<A> a = m.list();
+            a.forEach(System.out::println);
+        });
+    }
+
+    @Override
+    protected List<Interceptor> interceptors() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new InnerInterceptor() {
+            @Override
+            public boolean willDoQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+                System.out.println("willDoQuery");
+                return true;
+            }
+
+            @Override
+            public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
+                System.out.println("beforeQuery");
+            }
+
+            @Override
+            public boolean willDoUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+                System.out.println("willDoUpdate");
+                return true;
+            }
+
+            @Override
+            public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
+                System.out.println("beforeUpdate");
+            }
+
+            @Override
+            public void beforePrepare(StatementHandler sh, Connection connection, Integer transactionTimeout) {
+                System.out.println("beforePrepare");
+            }
+
+            @Override
+            public void beforeGetBoundSql(StatementHandler sh) {
+                System.out.println("beforeGetBoundSql");
+            }
+        });
+        return Collections.singletonList(interceptor);
+    }
+
+    @Override
+    protected List<Class<?>> otherMapper() {
+        return Collections.singletonList(BMapper.class);
+    }
+
+    @Override
+    protected String tableDataSql() {
+        return "insert into a (id,name) values (1,'1'),(2,'2');" +
+            "insert into b (id,a_id,name) values (1,'1','1-1'),(2,'2','2-2')";
+    }
+
+    @Override
+    protected List<String> tableSql() {
+        return Arrays.asList("drop table if exists a",
+            "CREATE TABLE IF NOT EXISTS a (\n" +
+                "id integer NOT NULL,\n" +
+                "name VARCHAR(30) NULL DEFAULT NULL,\n" +
+                "PRIMARY KEY (id)" +
+                ")", "drop table if exists b",
+            "CREATE TABLE IF NOT EXISTS b (\n" +
+                "id integer NOT NULL,\n" +
+                "a_id integer NOT NULL,\n" +
+                "name VARCHAR(30) NULL DEFAULT NULL,\n" +
+                "PRIMARY KEY (id)" +
+                ")");
+    }
+}

+ 14 - 0
mybatis-plus/src/test/resources/com/baomidou/mybatisplus/test/puginsome/AMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.baomidou.mybatisplus.test.puginsome.AMapper">
+
+    <resultMap id="xxp" type="com.baomidou.mybatisplus.test.puginsome.A" autoMapping="true">
+        <association property="b" column="id" javaType="com.baomidou.mybatisplus.test.puginsome.B"
+                     select="com.baomidou.mybatisplus.test.puginsome.BMapper.selectById"/>
+    </resultMap>
+
+    <select id="list" resultMap="xxp">
+        select *
+        from a
+    </select>
+</mapper>

+ 6 - 0
mybatis-plus/src/test/resources/com/baomidou/mybatisplus/test/puginsome/BMapper.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.baomidou.mybatisplus.test.puginsome.BMapper">
+
+
+</mapper>