Procházet zdrojové kódy

有 resultMap 下 selectBody 的逻辑调整

miemie před 5 roky
rodič
revize
30cb7dceef

+ 1 - 1
build.gradle

@@ -178,7 +178,7 @@ subprojects {
         dependsOn("cleanTest", "generatePomFileForMavenJavaPublication")
         useJUnitPlatform()
         exclude("**/generator/**")
-        exclude("**/mysql/**")
+//        exclude("**/mysql/**")
         exclude("**/phoenix/**")
     }
 

+ 3 - 3
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/injector/AbstractMethod.java

@@ -136,10 +136,10 @@ public abstract class AbstractMethod implements Constants {
      * @return sql 脚本
      */
     protected String sqlSelectColumns(TableInfo table, boolean queryWrapper) {
-        /* 假设存在 resultMap 映射返回 */
+        /* 假设存在用户自定义的 resultMap 映射返回 */
         String selectColumns = ASTERISK;
-        if (table.getResultMap() == null || (table.getResultMap() != null && table.isInitResultMap())) {
-            /* 普通查询 */
+        if (table.getResultMap() == null || table.isAutoInitResultMap()) {
+            /* 未设置 resultMap 或者 resultMap 是自动构建的,视为属于mp的规则范围内 */
             selectColumns = table.getAllSqlSelect();
         }
         if (!queryWrapper) {

+ 8 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableFieldInfo.java

@@ -199,7 +199,9 @@ public class TableFieldInfo implements Constants {
 
         this.column = column;
         this.sqlSelect = column;
-        if (TableInfoHelper.checkRelated(tableInfo.isUnderCamel(), this.property, this.column)) {
+        if (tableInfo.getResultMap() == null && !tableInfo.isAutoInitResultMap() &&
+            TableInfoHelper.checkRelated(tableInfo.isUnderCamel(), this.property, this.column)) {
+            /* 未设置 resultMap 也未开启自动构建 resultMap, 字段规则又不符合 mybatis 的自动封装规则 */
             String propertyFormat = dbConfig.getPropertyFormat();
             String asProperty = this.property;
             if (StringUtils.isNotBlank(propertyFormat)) {
@@ -244,7 +246,7 @@ public class TableFieldInfo implements Constants {
         this.whereStrategy = dbConfig.getSelectStrategy();
         this.initLogicDelete(dbConfig, field);
 
-        String column = field.getName();
+        String column = this.property;
         if (tableInfo.isUnderCamel()) {
             /* 开启字段下划线申明 */
             column = StringUtils.camelToUnderline(column);
@@ -260,9 +262,10 @@ public class TableFieldInfo implements Constants {
         }
 
         this.column = column;
-        if (!TableInfoHelper.checkRelated(tableInfo.isUnderCamel(), this.property, this.column)) {
-            this.sqlSelect = column;
-        } else {
+        this.sqlSelect = column;
+        if (tableInfo.getResultMap() == null && !tableInfo.isAutoInitResultMap() &&
+            TableInfoHelper.checkRelated(tableInfo.isUnderCamel(), this.property, this.column)) {
+            /* 未设置 resultMap 也未开启自动构建 resultMap, 字段规则又不符合 mybatis 的自动封装规则 */
             String propertyFormat = dbConfig.getPropertyFormat();
             String asProperty = this.property;
             if (StringUtils.isNotBlank(propertyFormat)) {

+ 3 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfo.java

@@ -69,10 +69,6 @@ public class TableInfo implements Constants {
      * 是否是需要自动生成的 resultMap
      */
     private boolean autoInitResultMap;
-    /**
-     * 是否是自动生成的 resultMap
-     */
-    private boolean initResultMap;
     /**
      * 主键是否有存在字段名与属性名关联
      * <p>true: 表示要进行 as</p>
@@ -114,6 +110,8 @@ public class TableInfo implements Constants {
     private boolean logicDelete;
     /**
      * 是否开启下划线转驼峰
+     * <p>
+     * 未注解指定字段名的情况下,用于自动从 property 推算 column 的命名
      */
     private boolean underCamel;
     /**
@@ -204,7 +202,7 @@ public class TableInfo implements Constants {
         }
         if (havePK()) {
             sqlSelect = keyColumn;
-            if (keyRelated) {
+            if (resultMap == null && keyRelated) {
                 sqlSelect += (" AS " + keyProperty);
             }
         } else {

+ 4 - 7
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/metadata/TableInfoHelper.java

@@ -255,7 +255,7 @@ public class TableInfoHelper {
         boolean isReadPK = false;
         // 是否存在 @TableId 注解
         boolean existTableId = isExistTableId(list);
-    
+
         List<TableFieldInfo> fieldList = new ArrayList<>(list.size());
         for (Field field : list) {
             if (excludeProperty.contains(field.getName())) {
@@ -416,9 +416,9 @@ public class TableInfoHelper {
     }
 
     /**
-     * <p>
      * 判定 related 的值
-     * </p>
+     * <p>
+     * 为 true 表示不符合规则
      *
      * @param underCamel 驼峰命名
      * @param property   属性名
@@ -426,10 +426,7 @@ public class TableInfoHelper {
      * @return related
      */
     public static boolean checkRelated(boolean underCamel, String property, String column) {
-        if (StringUtils.isNotColumnName(column)) {
-            // 首尾有转义符,手动在注解里设置了转义符,去除掉转义符
-            column = column.substring(1, column.length() - 1);
-        }
+        column = StringUtils.getTargetColumn(column);
         String propertyUpper = property.toUpperCase(Locale.ENGLISH);
         String columnUpper = column.toUpperCase(Locale.ENGLISH);
         if (underCamel) {

+ 9 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -143,4 +143,13 @@ class MysqlTestDataMapperTest {
         map2.put("`order`", 5);
         assertEquals(fail, mysqlMapper.deleteByMap(map2));
     }
+
+    @Test
+    void a05_select() {
+        long id = 4L;
+        List<ResultMapEntity> entitys = resultMapEntityMapper.selectBatchIds(Collections.singletonList(id));
+        assertThat(entitys).isNotEmpty();
+        assertThat(entitys.size()).isEqualTo(1);
+        assertThat(entitys.get(0).getColumn4()).isNotNull();
+    }
 }

+ 1 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/entity/ResultMapEntity.java

@@ -41,6 +41,7 @@ public class ResultMapEntity {
     private String column1;
     private String column2;
     private String column3;
+    @TableField("column_1234")
     private String column4;
     @TableField(typeHandler = ListTypeHandler.class)
     private List<String> list;

+ 1 - 1
mybatis-plus/src/test/resources/mapper/ResultMapEntityMapper.xml

@@ -11,7 +11,7 @@
 
     <resultMap id="resultChildren1" type="com.baomidou.mybatisplus.test.mysql.entity.ResultMapEntity"
                extends="baseResult">
-        <result column="column4" property="column4"/>
+        <result column="column_1234" property="column4"/>
         <result column="list" property="list" typeHandler="com.baomidou.mybatisplus.test.mysql.type.ListTypeHandler"/>
         <result column="map" property="map" typeHandler="com.baomidou.mybatisplus.test.mysql.type.MapTypeHandler"/>
         <result column="map" property="mapp" typeHandler="com.baomidou.mybatisplus.test.mysql.type.JsonTypeHandler"/>

+ 8 - 8
mybatis-plus/src/test/resources/mysql/test_data.ddl.sql

@@ -41,14 +41,14 @@ CREATE TABLE mysql_data
 
 CREATE TABLE result_map_entity
 (
-    id      BIGINT primary key,
-    column1 varchar(200) default '1',
-    column2 varchar(200) default '2',
-    column3 varchar(200) default '3',
-    column4 varchar(200) default '4',
-    list    varchar(200),
-    map     varchar(200),
-    mapp    varchar(200)
+    id          BIGINT primary key,
+    column1     varchar(200) default '1',
+    column2     varchar(200) default '2',
+    column3     varchar(200) default '3',
+    column_1234 varchar(200) default '4',
+    list        varchar(200),
+    map         varchar(200),
+    mapp        varchar(200)
 ) ENGINE = innodb
   DEFAULT CHARSET = utf8;