miemie пре 6 година
родитељ
комит
8029527a67

+ 14 - 7
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/IService.java

@@ -15,20 +15,22 @@
  */
 package com.baomidou.mybatisplus.extension.service;
 
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiPredicate;
-import java.util.function.Function;
-
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.baomidou.mybatisplus.extension.service.additional.query.QueryChainWrapper;
 import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
 
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiPredicate;
+import java.util.function.Function;
+
 /**
  * <p>
  * 顶级 Service
@@ -389,6 +391,11 @@ public interface IService<T> {
         return pageMaps(page, Wrappers.emptyWrapper());
     }
 
+    BaseMapper<T> getBaseMapper();
+
+    default QueryChainWrapper<T> query() {
+        return new QueryChainWrapper<>(getBaseMapper());
+    }
 
     default InnerLambdaQuery<T> lambdaQuery() {
         return new InnerLambdaQuery<>(this);

+ 127 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/ChainWrapper.java

@@ -0,0 +1,127 @@
+package com.baomidou.mybatisplus.extension.service.additional;
+
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.interfaces.Compare;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+
+import java.util.Map;
+import java.util.function.BiPredicate;
+
+/**
+ * , Func<This, R>, Join<This>, Nested<This>
+ *
+ * @author miemie
+ * @since 2018-12-19
+ */
+@SuppressWarnings({"serial", "unchecked"})
+public abstract class ChainWrapper<T, R, This extends ChainWrapper<T, R, This>> extends Wrapper<T>
+    implements Compare<This, R> {
+    protected final This typedThis = (This) this;
+
+    protected abstract AbstractWrapper getWrapper();
+
+    @Override
+    public T getEntity() {
+        return (T) getWrapper().getEntity();
+    }
+
+    @Override
+    public MergeSegments getExpression() {
+        return getWrapper().getExpression();
+    }
+
+    @Override
+    public String getCustomSqlSegment() {
+        return getWrapper().getCustomSqlSegment();
+    }
+
+    @Override
+    public <V> This allEq(boolean condition, Map<R, V> params, boolean null2IsNull) {
+        getWrapper().allEq(condition, params, null2IsNull);
+        return typedThis;
+    }
+
+    @Override
+    public <V> This allEq(boolean condition, BiPredicate<R, V> filter, Map<R, V> params, boolean null2IsNull) {
+        getWrapper().allEq(condition, filter, params, null2IsNull);
+        return typedThis;
+    }
+
+    @Override
+    public This eq(boolean condition, R column, Object val) {
+        getWrapper().eq(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This ne(boolean condition, R column, Object val) {
+        getWrapper().ne(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This gt(boolean condition, R column, Object val) {
+        getWrapper().gt(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This ge(boolean condition, R column, Object val) {
+        getWrapper().ge(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This lt(boolean condition, R column, Object val) {
+        getWrapper().lt(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This le(boolean condition, R column, Object val) {
+        getWrapper().le(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This between(boolean condition, R column, Object val1, Object val2) {
+        getWrapper().between(condition, column, val1, val2);
+        return typedThis;
+    }
+
+    @Override
+    public This notBetween(boolean condition, R column, Object val1, Object val2) {
+        getWrapper().notBetween(condition, column, val1, val2);
+        return typedThis;
+    }
+
+    @Override
+    public This like(boolean condition, R column, Object val) {
+        getWrapper().like(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This notLike(boolean condition, R column, Object val) {
+        getWrapper().notLike(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This likeLeft(boolean condition, R column, Object val) {
+        getWrapper().likeLeft(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public This likeRight(boolean condition, R column, Object val) {
+        getWrapper().likeRight(condition, column, val);
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSegment() {
+        return getWrapper().getSqlSegment();
+    }
+}

+ 77 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/QueryChainWrapper.java

@@ -0,0 +1,77 @@
+package com.baomidou.mybatisplus.extension.service.additional.query;
+
+import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.Query;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.extension.service.additional.ChainWrapper;
+
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+@SuppressWarnings("serial")
+public class QueryChainWrapper<T> extends ChainWrapper<T, String, QueryChainWrapper<T>>
+    implements Querys<T>, Query<QueryChainWrapper<T>, T, String> {
+
+    private QueryWrapper<T> queryWrapper;
+    private BaseMapper<T> baseMapper;
+
+    public QueryChainWrapper(BaseMapper<T> baseMapper) {
+        this.baseMapper = baseMapper;
+        queryWrapper = new QueryWrapper<>();
+    }
+
+    @Override
+    protected AbstractWrapper getWrapper() {
+        return queryWrapper;
+    }
+
+    @Override
+    public List<T> list() {
+        return baseMapper.selectList(queryWrapper);
+    }
+
+    @Override
+    public T one() {
+        return baseMapper.selectOne(queryWrapper);
+    }
+
+    @Override
+    public Integer count() {
+        return baseMapper.selectCount(queryWrapper);
+    }
+
+    @Override
+    public IPage<T> page(IPage<T> page) {
+        return baseMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public QueryChainWrapper<T> select(String... columns) {
+        queryWrapper.select(columns);
+        return typedThis;
+    }
+
+    @Override
+    public QueryChainWrapper<T> select(Predicate<TableFieldInfo> predicate) {
+        queryWrapper.select(predicate);
+        return typedThis;
+    }
+
+    @Override
+    public QueryChainWrapper<T> select(Class<T> entityClass, Predicate<TableFieldInfo> predicate) {
+        queryWrapper.select(entityClass, predicate);
+        return typedThis;
+    }
+
+    @Override
+    public String getSqlSelect() {
+        return queryWrapper.getSqlSelect();
+    }
+}

+ 20 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/additional/query/Querys.java

@@ -0,0 +1,20 @@
+package com.baomidou.mybatisplus.extension.service.additional.query;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.List;
+
+/**
+ * @author miemie
+ * @since 2018-12-19
+ */
+public interface Querys<T> {
+
+    List<T> list();
+
+    T one();
+
+    Integer count();
+
+    IPage<T> page(IPage<T> page);
+}

+ 5 - 0
mybatis-plus-extension/src/main/java/com/baomidou/mybatisplus/extension/service/impl/ServiceImpl.java

@@ -51,6 +51,11 @@ public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
     @Autowired
     protected M baseMapper;
 
+    @Override
+    public M getBaseMapper() {
+        return baseMapper;
+    }
+
     /**
      * <p>
      * 判断数据库操作是否成功

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

@@ -1,12 +1,11 @@
 package com.baomidou.mybatisplus.test.h2;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.test.h2.entity.enums.AgeEnum;
+import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
+import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
 import org.junit.Assert;
 import org.junit.FixMethodOrder;
 import org.junit.Test;
@@ -16,12 +15,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.test.context.ContextConfiguration;
 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
-import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
-import com.baomidou.mybatisplus.test.h2.entity.enums.AgeEnum;
-import com.baomidou.mybatisplus.test.h2.entity.persistent.H2User;
-import com.baomidou.mybatisplus.test.h2.service.IH2UserService;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -293,4 +292,10 @@ public class H2UserTest extends BaseTest {
             .isNull(H2User::getPrice)
             .list();
     }
+
+    @Test
+    public void testServiceChainQuery() {
+        H2User tomcat = userService.query().eq("name", "Tomcat").one();
+        Assert.assertNotNull("tomcat should not be null", tomcat);
+    }
 }