浏览代码

[优化] 添加测试,注释掉`解决update无法正确获取到参数类型问题`的提交代码

miemie 6 年之前
父节点
当前提交
904a707a5b

+ 4 - 5
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/MybatisDefaultParameterHandler.java

@@ -24,7 +24,10 @@ import org.apache.ibatis.mapping.*;
 import org.apache.ibatis.reflection.MetaObject;
 import org.apache.ibatis.scripting.defaults.DefaultParameterHandler;
 import org.apache.ibatis.session.Configuration;
-import org.apache.ibatis.type.*;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.TypeException;
+import org.apache.ibatis.type.TypeHandler;
+import org.apache.ibatis.type.TypeHandlerRegistry;
 
 import java.sql.PreparedStatement;
 import java.sql.SQLException;
@@ -268,10 +271,6 @@ public class MybatisDefaultParameterHandler extends DefaultParameterHandler {
                     }
                     TypeHandler typeHandler = parameterMapping.getTypeHandler();
                     JdbcType jdbcType = parameterMapping.getJdbcType();
-                    if (value != null && typeHandler.getClass() == UnknownTypeHandler.class) {
-                        typeHandler = Optional.ofNullable(typeHandlerRegistry
-                            .getTypeHandler(value.getClass(), jdbcType)).orElse(typeHandler);
-                    }
                     if (value == null && jdbcType == null) {
                         jdbcType = configuration.getJdbcTypeForNull();
                     }

+ 4 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/entity/ResultMapEntity.java

@@ -1,5 +1,6 @@
 package com.baomidou.mybatisplus.test.base.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -22,6 +23,8 @@ public class ResultMapEntity {
     private String column2;
     private String column3;
     private String column4;
+    @TableField(el = "list, typeHandler=com.baomidou.mybatisplus.test.base.type.ListTypeHandler")
     private List<String> list;
-    private Map<String, String> map;
+    @TableField(el = "map, typeHandler=com.baomidou.mybatisplus.test.base.type.MapTypeHandler")
+    private Map<String, Object> map;
 }

+ 36 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/type/ListTypeHandler.java

@@ -1,9 +1,13 @@
 package com.baomidou.mybatisplus.test.base.type;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.ibatis.type.BaseTypeHandler;
 import org.apache.ibatis.type.JdbcType;
 
+import java.io.IOException;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -20,21 +24,52 @@ public class ListTypeHandler extends BaseTypeHandler<List> {
 
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException {
-
+        try {
+            ps.setString(i, objectMapper.writeValueAsString(parameter));
+        } catch (JsonProcessingException e) {
+            ps.setString(i, null);
+        }
     }
 
     @Override
     public List getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String result = rs.getString(columnName);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, new TypeReference<List<String>>() {
+                });
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 
     @Override
     public List getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String result = rs.getString(columnIndex);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, new TypeReference<List<String>>() {
+                });
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 
     @Override
     public List getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String result = cs.getString(columnIndex);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, new TypeReference<List<String>>() {
+                });
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 }

+ 26 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/base/type/MapTypeHandler.java

@@ -1,10 +1,12 @@
 package com.baomidou.mybatisplus.test.base.type;
 
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.ibatis.type.BaseTypeHandler;
 import org.apache.ibatis.type.JdbcType;
 
+import java.io.IOException;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -30,16 +32,40 @@ public class MapTypeHandler extends BaseTypeHandler<Map> {
 
     @Override
     public Map getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        String result = rs.getString(columnName);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, Map.class);
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 
     @Override
     public Map getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        String result = rs.getString(columnIndex);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, Map.class);
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 
     @Override
     public Map getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        String result = cs.getString(columnIndex);
+        if (StringUtils.isNotEmpty(result)) {
+            try {
+                return objectMapper.readValue(result, Map.class);
+            } catch (IOException e) {
+                return null;
+            }
+        }
         return null;
     }
 }

+ 14 - 3
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/MysqlTestDataMapperTest.java

@@ -33,6 +33,9 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 import javax.annotation.Resource;
 import java.util.*;
 
+import static java.util.function.Function.identity;
+import static java.util.stream.Collectors.toMap;
+
 
 /**
  * <p>
@@ -56,6 +59,9 @@ public class MysqlTestDataMapperTest {
     @Resource
     private ResultMapEntityMapper resultMapEntityMapper;
 
+    private final List<String> list = Arrays.asList("1", "2", "3");
+    private final Map<String, Object> map = list.parallelStream().collect(toMap(identity(), identity()));
+
     @BeforeClass
     public static void init() throws Exception {
         MysqlDb.initMysqlData();
@@ -71,7 +77,7 @@ public class MysqlTestDataMapperTest {
                 .setTestEnum(TestEnum.ONE));
             commonLogicMapper.insert(new CommonLogicData().setTestInt(i).setTestStr(str).setId(id));
             mysqlMapper.insert(new MysqlData().setOrder(i).setGroup(i).setId(id).setTestStr(str).setYaHoStr(str));
-            resultMapEntityMapper.insert(new ResultMapEntity().setId(id));
+            resultMapEntityMapper.insert(new ResultMapEntity().setId(id).setList(list).setMap(map));
         }
     }
 
@@ -149,9 +155,11 @@ public class MysqlTestDataMapperTest {
     @Test
     public void c1_updateById() {
         long id = 6L;
-        Assert.assertEquals(1, commonMapper.updateById(new CommonData().setId(id).setTestInt(555).setVersion(0)));
+        Assert.assertEquals(1, commonMapper.updateById(new CommonData().setId(id).setTestInt(555).setVersion(0)
+            .setTestEnum(TestEnum.TWO)));
         Assert.assertEquals(1, commonLogicMapper.updateById(new CommonLogicData().setId(id).setTestInt(555)));
         Assert.assertEquals(1, mysqlMapper.updateById(new MysqlData().setId(id).setOrder(555)));
+        Assert.assertEquals(1, resultMapEntityMapper.updateById(new ResultMapEntity().setId(id).setList(list).setMap(map)));
     }
 
     @Test
@@ -189,7 +197,10 @@ public class MysqlTestDataMapperTest {
         Assert.assertNotNull(commonMapper.selectById(id).getTestEnum());
         Assert.assertNotNull(commonLogicMapper.selectById(id));
         Assert.assertNotNull(mysqlMapper.selectById(id));
-        Assert.assertNotNull(resultMapEntityMapper.selectById(id));
+        ResultMapEntity resultMapEntity = resultMapEntityMapper.selectById(id);
+        Assert.assertNotNull(resultMapEntity);
+        Assert.assertTrue(CollectionUtils.isNotEmpty(resultMapEntity.getMap()));
+        Assert.assertTrue(CollectionUtils.isNotEmpty(resultMapEntity.getList()));
     }
 
     @Test

+ 2 - 1
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/mysql/config/MybatisPlusConfig.java

@@ -50,7 +50,8 @@ public class MybatisPlusConfig {
         /* xml扫描 */
         sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
             .getResources("classpath:/mapper/*.xml"));
-        /* entity扫描,mybatis的Alias功能 */
+        /* 扫描 typeHandler */
+        sqlSessionFactory.setTypeHandlersPackage("com.baomidou.mybatisplus.test.base.type");
         MybatisConfiguration configuration = new MybatisConfiguration();
         configuration.setJdbcTypeForNull(JdbcType.NULL);
         /* 驼峰转下划线 */

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

@@ -5,12 +5,14 @@
     <resultMap id="baseResult" type="com.baomidou.mybatisplus.test.base.entity.ResultMapEntity">
         <id column="id" property="id"/>
         <result column="column1" property="column1"/>
+        <result column="column2" property="column2"/>
+        <result column="column3" property="column3"/>
     </resultMap>
 
     <resultMap id="resultChildren1" type="com.baomidou.mybatisplus.test.base.entity.ResultMapEntity"
                extends="baseResult">
-        <result column="column2" property="column2"/>
-        <result column="column3" property="column3"/>
         <result column="column4" property="column4"/>
+        <result column="list" property="list" typeHandler="com.baomidou.mybatisplus.test.base.type.ListTypeHandler"/>
+        <result column="map" property="map" typeHandler="com.baomidou.mybatisplus.test.base.type.MapTypeHandler"/>
     </resultMap>
 </mapper>

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

@@ -4,14 +4,15 @@ drop table if exists mysql_data;
 drop table if exists result_map_entity;
 
 CREATE TABLE common_data (
-    id        BIGINT primary key,
-    test_int  integer,
-    test_str  varchar(50),
-    c_time    datetime,
-    u_time    datetime,
-    version   integer default 0,
-    test_enum integer,
-    tenant_id bigint
+    id         BIGINT primary key,
+    test_int   integer,
+    test_str   varchar(50),
+    c_time     datetime,
+    u_time     datetime,
+    version    integer default 0,
+    test_enum  integer,
+    test_enum2 integer,
+    tenant_id  bigint
 )ENGINE = innodb
 DEFAULT CHARSET = utf8;
 
@@ -40,6 +41,8 @@ CREATE TABLE result_map_entity (
     column1    varchar(200) default '1',
     column2    varchar(200) default '2',
     column3    varchar(200) default '3',
-    column4    varchar(200) default '4'
+    column4    varchar(200) default '4',
+    list       varchar(200),
+    map        varchar(200)
 )ENGINE = innodb
 DEFAULT CHARSET = utf8;