Quellcode durchsuchen

新增 wrapper 支持 typeHandler 查询支持

hubin vor 2 Jahren
Ursprung
Commit
92ebd4aa0e

+ 28 - 1
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/AbstractWrapper.java

@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.core.toolkit.*;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.SqlUtils;
 import com.baomidou.mybatisplus.core.toolkit.sql.StringEscape;
+import org.apache.ibatis.type.TypeHandler;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -433,8 +434,34 @@ public abstract class AbstractWrapper<T, R, Children extends AbstractWrapper<T,
      * @param val        条件值
      */
     protected Children addCondition(boolean condition, R column, SqlKeyword sqlKeyword, Object val) {
+        return this.addMappingCondition(condition, null, column, sqlKeyword, val);
+    }
+
+    /**
+     * 添加映射查询条件
+     *
+     * @param condition  是否执行
+     * @param mapping    映射条件,例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler"
+     * @param column     属性
+     * @param sqlKeyword SQL 关键词
+     * @param val        条件值
+     */
+    public Children addMappingCondition(boolean condition, String mapping, R column, SqlKeyword sqlKeyword, Object val) {
         return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(column), sqlKeyword,
-            () -> formatParam(null, val)));
+            () -> formatParam(mapping, val)));
+    }
+
+    /**
+     * 添加 TypeHandler 映射查询条件
+     *
+     * @param condition        是否执行
+     * @param typeHandlerClass Mybatis TypeHandler 具体实现类
+     * @param column           属性
+     * @param sqlKeyword       SQL 关键词
+     * @param val              条件值
+     */
+    public Children addTypeHandlerCondition(boolean condition, Class<? extends TypeHandler> typeHandlerClass, R column, SqlKeyword sqlKeyword, Object val) {
+        return this.addMappingCondition(condition, "typeHandler=" + typeHandlerClass.getCanonicalName(), column, sqlKeyword, val);
     }
 
     /**

+ 9 - 2
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/LambdaQueryWrapperTest.java

@@ -11,18 +11,25 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.Data;
 import org.apache.ibatis.builder.MapperBuilderAssistant;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
 /**
+ * LambdaQueryWrapper 测试
+ *
  * @author miemie
  * @since 2021-01-27
  */
 class LambdaQueryWrapperTest extends BaseWrapperTest {
 
-    @Test
-    void testLambdaOrderBySqlSegment() {
+    @BeforeAll
+    static void initTableInfo() {
         TableInfo tableInfo = TableInfoHelper.initTableInfo(new MapperBuilderAssistant(new MybatisConfiguration(), ""), Table.class);
         Assertions.assertEquals("xxx", tableInfo.getTableName());
+    }
+
+    @Test
+    void testLambdaOrderBySqlSegment() {
         LambdaQueryWrapper lqw = Wrappers.<Table>lambdaQuery().orderByDesc(Table::getId);
         Assertions.assertEquals(lqw.getSqlSegment(), " ORDER BY `id` DESC");
         lqw.clear();

+ 13 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2UserTest.java

@@ -51,6 +51,8 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 
+import static com.baomidou.mybatisplus.core.enums.SqlKeyword.EQ;
+
 /**
  * Mybatis Plus H2 Junit Test
  * JDK 8 run test:
@@ -128,6 +130,17 @@ class H2UserTest extends BaseTest {
         Assertions.assertNotNull(h2User);
     }
 
+
+    @Test
+    @Order(7)
+    void testLambdaTypeHandler() {
+        // 演示 json 格式 Wrapper TypeHandler 查询
+        H2User h2User = userService.getOne(Wrappers.<H2User>lambdaQuery()
+                .addTypeHandlerCondition(true, H2userNameJsonTypeHandler.class, H2User::getName,
+                    EQ, "{\"id\":101,\"name\":\"Tomcat\"}"));
+        Assertions.assertNotNull(h2User);
+    }
+
     @Test
     @Order(10)
     void testEntityWrapperSelectSql() {

+ 45 - 0
mybatis-plus/src/test/java/com/baomidou/mybatisplus/test/h2/H2userNameJsonTypeHandler.java

@@ -0,0 +1,45 @@
+package com.baomidou.mybatisplus.test.h2;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.test.h2.entity.H2User;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+/**
+ * 只做演示其它方法未实现
+ */
+@Slf4j
+@MappedTypes({Object.class})
+@MappedJdbcTypes(JdbcType.VARCHAR)
+public class H2userNameJsonTypeHandler extends BaseTypeHandler<String> {
+
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, String json, JdbcType jdbcType) throws SQLException {
+        H2User h2User = JSON.parseObject(json, H2User.class);
+        ps.setString(i, h2User.getName());
+    }
+
+    @Override
+    public String getNullableResult(ResultSet resultSet, String s) throws SQLException {
+        return null;
+    }
+
+    @Override
+    public String getNullableResult(ResultSet resultSet, int i) throws SQLException {
+        return null;
+    }
+
+    @Override
+    public String getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
+        return null;
+    }
+}
+