瀏覽代碼

Json转换器空值处理.

https://github.com/baomidou/mybatis-plus/issues/2143
聂秋秋 5 年之前
父節點
當前提交
5ba0919bc6

+ 9 - 9
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/AbstractJsonTypeHandler.java

@@ -29,31 +29,31 @@ import java.sql.SQLException;
  * @since 2019-11-28
  */
 public abstract class AbstractJsonTypeHandler<T> extends BaseTypeHandler<T> {
-
+    
     @Override
     public void setNonNullParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException {
         ps.setString(i, toJson(parameter));
     }
-
+    
     @Override
     public T getNullableResult(ResultSet rs, String columnName) throws SQLException {
         final String json = rs.getString(columnName);
-        return StringUtils.isBlank(json) && rs.wasNull() ? null : parse(json);
+        return StringUtils.isBlank(json) ? null : parse(json);
     }
-
+    
     @Override
     public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
         final String json = rs.getString(columnIndex);
-        return StringUtils.isBlank(json) && rs.wasNull() ? null : parse(json);
+        return StringUtils.isBlank(json) ? null : parse(json);
     }
-
+    
     @Override
     public T getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
         final String json = cs.getString(columnIndex);
-        return StringUtils.isBlank(json) && cs.wasNull() ? null : parse(json);
+        return StringUtils.isBlank(json) ? null : parse(json);
     }
-
+    
     protected abstract T parse(String json);
-
+    
     protected abstract String toJson(T obj);
 }

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/FastjsonTypeHandler.java

@@ -33,9 +33,9 @@ import org.apache.ibatis.type.MappedTypes;
 @MappedTypes({Object.class})
 @MappedJdbcTypes(JdbcType.VARCHAR)
 public class FastjsonTypeHandler extends AbstractJsonTypeHandler<Object> {
-    private Class<Object> type;
+    private Class<?> type;
 
-    public FastjsonTypeHandler(Class<Object> type) {
+    public FastjsonTypeHandler(Class<?> type) {
         if (log.isTraceEnabled()) {
             log.trace("FastjsonTypeHandler(" + type + ")");
         }

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/GsonTypeHandler.java

@@ -33,9 +33,9 @@ import org.apache.ibatis.type.MappedTypes;
 @MappedJdbcTypes(JdbcType.VARCHAR)
 public class GsonTypeHandler extends AbstractJsonTypeHandler<Object> {
     private static Gson gson = new Gson();
-    private Class<Object> type;
+    private Class<?> type;
 
-    public GsonTypeHandler(Class<Object> type) {
+    public GsonTypeHandler(Class<?> type) {
         if (log.isTraceEnabled()) {
             log.trace("GsonTypeHandler(" + type + ")");
         }

+ 2 - 2
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/handlers/JacksonTypeHandler.java

@@ -36,9 +36,9 @@ import java.io.IOException;
 @MappedJdbcTypes(JdbcType.VARCHAR)
 public class JacksonTypeHandler extends AbstractJsonTypeHandler<Object> {
     private static ObjectMapper objectMapper = new ObjectMapper();
-    private Class<Object> type;
+    private Class<?> type;
 
-    public JacksonTypeHandler(Class<Object> type) {
+    public JacksonTypeHandler(Class<?> type) {
         if (log.isTraceEnabled()) {
             log.trace("JacksonTypeHandler(" + type + ")");
         }

+ 81 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/handlers/FastJsonTypeHandlerTest.java

@@ -0,0 +1,81 @@
+package com.baomidou.mybatisplus.extension.handlers;
+
+import com.baomidou.mybatisplus.extension.model.UserBean;
+import org.apache.ibatis.type.JdbcType;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author nieqiurong 2020/2/28.
+ */
+@ExtendWith(MockitoExtension.class)
+public class FastJsonTypeHandlerTest extends BaseTypeHandlerTest {
+    
+    private static final FastjsonTypeHandler FASTJSON_TYPE_HANDLER = new FastjsonTypeHandler(UserBean.class);
+    
+    @Test
+    @Override
+    public void setParameter() throws Exception {
+        FASTJSON_TYPE_HANDLER.setParameter(preparedStatement, 1, null, JdbcType.VARCHAR);
+        verify(preparedStatement).setNull(1, JdbcType.VARCHAR.TYPE_CODE);
+        FASTJSON_TYPE_HANDLER.setParameter(preparedStatement, 2, "", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(2, "\"\"");
+        FASTJSON_TYPE_HANDLER.setParameter(preparedStatement, 3, "{}", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(3, "\"{}\"");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnName() throws Exception {
+        UserBean bean;
+        when(resultSet.getString("column")).thenReturn(null);
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, "column");
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnIndex() throws Exception {
+        UserBean bean;
+        when(resultSet.getString(1)).thenReturn(null);
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(2)).thenReturn("");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, 2);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromCallableStatement() throws Exception {
+        UserBean bean;
+        lenient().when(callableStatement.getString(1)).thenReturn(null);
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(2)).thenReturn("");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(callableStatement, 2);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) FASTJSON_TYPE_HANDLER.getResult(callableStatement, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+}

+ 81 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/handlers/GsonTypeHandlerTest.java

@@ -0,0 +1,81 @@
+package com.baomidou.mybatisplus.extension.handlers;
+
+import com.baomidou.mybatisplus.extension.model.UserBean;
+import org.apache.ibatis.type.JdbcType;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author nieqiurong 2020/2/28.
+ */
+@ExtendWith(MockitoExtension.class)
+public class GsonTypeHandlerTest extends BaseTypeHandlerTest {
+    
+    private static final GsonTypeHandler GSON_TYPE_HANDLER = new GsonTypeHandler(UserBean.class);
+    
+    @Test
+    @Override
+    public void setParameter() throws Exception {
+        GSON_TYPE_HANDLER.setParameter(preparedStatement, 1, null, JdbcType.VARCHAR);
+        verify(preparedStatement).setNull(1, JdbcType.VARCHAR.TYPE_CODE);
+        GSON_TYPE_HANDLER.setParameter(preparedStatement, 2, "", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(2, "\"\"");
+        GSON_TYPE_HANDLER.setParameter(preparedStatement, 3, "{}", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(3, "\"{}\"");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnName() throws Exception {
+        UserBean bean;
+        when(resultSet.getString("column")).thenReturn(null);
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, "column");
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnIndex() throws Exception {
+        UserBean bean;
+        when(resultSet.getString(1)).thenReturn(null);
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(2)).thenReturn("");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, 2);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromCallableStatement() throws Exception {
+        UserBean bean;
+        lenient().when(callableStatement.getString(1)).thenReturn(null);
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(2)).thenReturn("");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(callableStatement, 2);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) GSON_TYPE_HANDLER.getResult(callableStatement, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+}

+ 82 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/handlers/JacksonTypeHandlerTest.java

@@ -0,0 +1,82 @@
+package com.baomidou.mybatisplus.extension.handlers;
+
+import com.baomidou.mybatisplus.extension.model.UserBean;
+import org.apache.ibatis.type.JdbcType;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+/**
+ * @author nieqiurong 2020/2/28.
+ */
+@ExtendWith(MockitoExtension.class)
+public class JacksonTypeHandlerTest extends BaseTypeHandlerTest {
+    
+    private static final JacksonTypeHandler JACKSON_TYPE_HANDLER = new JacksonTypeHandler(UserBean.class);
+    
+    @Test
+    @Override
+    public void setParameter() throws Exception {
+        JACKSON_TYPE_HANDLER.setParameter(preparedStatement, 1, null, JdbcType.VARCHAR);
+        verify(preparedStatement).setNull(1, JdbcType.VARCHAR.TYPE_CODE);
+        JACKSON_TYPE_HANDLER.setParameter(preparedStatement, 2, "", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(2, "\"\"");
+        JACKSON_TYPE_HANDLER.setParameter(preparedStatement, 3, "{}", JdbcType.VARCHAR);
+        verify(preparedStatement).setString(3, "\"{}\"");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnName() throws Exception {
+        UserBean bean;
+        when(resultSet.getString("column")).thenReturn(null);
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, "column");
+        Assertions.assertNull(bean);
+        when(resultSet.getString("column")).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, "column");
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromResultSetByColumnIndex() throws Exception {
+        UserBean bean;
+        when(resultSet.getString(1)).thenReturn(null);
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(2)).thenReturn("");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, 2);
+        Assertions.assertNull(bean);
+        when(resultSet.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+    @Test
+    @Override
+    public void getResultFromCallableStatement() throws Exception {
+        UserBean bean;
+        lenient().when(callableStatement.getString(1)).thenReturn(null);
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(resultSet, 1);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(2)).thenReturn("");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(callableStatement, 2);
+        Assertions.assertNull(bean);
+        when(callableStatement.getString(3)).thenReturn("{\"id\":123,\"name\":\"测试\"}");
+        bean = (UserBean) JACKSON_TYPE_HANDLER.getResult(callableStatement, 3);
+        assertEquals(bean.getId(), 123L);
+        assertEquals(bean.getName(), "测试");
+    }
+    
+}

+ 21 - 0
mybatis-plus-extension/src/test/java/com/baomidou/mybatisplus/extension/model/UserBean.java

@@ -0,0 +1,21 @@
+package com.baomidou.mybatisplus.extension.model;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author nieqiurong 2020/2/28.
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserBean implements Serializable {
+    
+    private Long id;
+    
+    private String name;
+    
+}