tK Mybatis 通用 Mapper 3.4.6: Example 新增 builder 模式的应用

本文参考:https://www.oschina.net/news/91631/mapper-3-4-6-released

以下代码需要使用JDK1.8环境,因为使用了接口的新特性

maven版本依赖:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <version>3.4.6</version>
</dependency>

spring引用方式:

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.7</version>
</dependency>

工具类:

import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

import java.util.Iterator;
import java.util.Map;

/***
 * 构造查询条件
 */
public interface SQLCondition {

    /***
     * {@code key}属性等于{@code value}的记录
     * @param key
     * @param value
     * @param targetClass
     * @param <T>
     * @return
     */
    default <T> Example.Builder sqlAnd(String key, Object value, Class<T> targetClass)
    {
       return sqlAnd(key,value,targetClass,new String[0]);
    }

    static <T> Example.Builder builder(Class<T> targetClass)
    {
        return Example.builder(targetClass);
    }

    default <T> Example.Builder sqlAnd(String key, Object value, Class<T> targetClass, String ...excludeProperties)
    {
        return builder(targetClass).andWhere(WeekendSqls.custom().andEqualTo(key,value));
    }

    default <T> Example.Builder sqlAnd(Map<String,Object> nameValuePair, Class<T> targetClass)
    {
        WeekendSqls<T> criteria = WeekendSqls.custom();

        for (Iterator<Map.Entry<String, Object>> it = nameValuePair.entrySet().iterator();it.hasNext();) {
            Map.Entry<String, Object> entry = it.next();
            String name = entry.getKey();
            Object value = entry.getValue();
            criteria.andEqualTo(name,value);
        }
        return builder(targetClass).where(criteria);
    }

    default <T> Example.Builder orderBy(String fieldName, Class<T> targetClass)
    {
        return builder(targetClass).orderBy(fieldName);
    }

    default <T> Example.Builder orderBy(Class<T> targetClass,String ...fieldNames)
    {
        return builder(targetClass).orderBy(fieldNames);
    }

    default <T> Example.Builder orderByDesc(String fieldName, Class<T> targetClass)
    {
        return builder(targetClass).orderByDesc(fieldName);
    }

    default <T> Example.Builder orderByDesc(Class<T> targetClass,String fieldNames)
    {
        return builder(targetClass).orderByDesc(fieldNames);
    }

    /***
     * 模糊查询{@code key}属性like {@code value} 尚未测试/未按照构造器模式重构
     * @param key
     * @param value
     * @param targetClass
     * @param <T>
     * @return
     */
    default <T> Example sqlLike(String key, String value, Class<T> targetClass)
    {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andLike(key,value);
        return example;
    }
}

食用方法:

在你的接口继承自这个接口

import com.xxx.web.open.bean.ApiServicePkg;
import com.xxx.web.open.dto.ApiServicePkgDto;

import java.util.List;
import java.util.Map;

public interface ApiServicePkgService extends SQLCondition {
    ApiServicePkg getById(Integer packageId);

    ApiServicePkgDto getDtoById(Integer packageId);

    List<ApiServicePkg> queryList(Map<String,Object> params);

    List<ApiServicePkg> queryList();

    List<ApiServicePkgDto> queryDtoList();
}

实现类

import com.xxx.web.open.bean.ApiServicePkg;
import com.xxx.web.open.dto.ApiServicePkgDto;
import com.xxx.web.open.mapper.ApiServicePkgMapper;
import com.xxx.web.open.service.ApiServicePkgService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Collections;
import java.util.List;
import java.util.Map;

@Service
public class ApiServicePkgServiceImpl implements ApiServicePkgService {


    @Autowired
    ApiServicePkgMapper servicePkgMapper;

    @Override
    public ApiServicePkg getById(Integer packageId) {
        return servicePkgMapper.getById(packageId);
    }

    @Override
    public ApiServicePkgDto getDtoById(Integer packageId) {
        return servicePkgMapper.getDtoById(packageId);
    }

    @Override
    public List<ApiServicePkg> queryList(Map<String, Object> params) {
        //把Map里面的键值对用来构造sql and条件,total字段正序排序
        return servicePkgMapper.selectByExample(sqlAnd(params,ApiServicePkg.class).orderByAsc("total").build());
    }

    @Override
    public List<ApiServicePkg> queryList() {
        //查询enabled=1(true)的行,根据total字段正序排序
        return servicePkgMapper.selectByExample(sqlAnd("enabled",true,ApiServicePkg.class).orderByAsc("total").build());
    }

    @Override
    public List<ApiServicePkgDto> queryDtoList() {
        return servicePkgMapper.queryDtoList(Collections.emptyMap());
    }
}

 2020-2-12更新

新增根据字段名字段between and,大于等于小于、大于等于小于等于、大于小于等于等sql判断功能

重构后如下:

import com.google.common.collect.ImmutableMap;
import org.springframework.util.CollectionUtils;
import tk.mybatis.mapper.entity.Example;
import tk.mybatis.mapper.weekend.WeekendSqls;

import java.util.Collections;
import java.util.Iterator;
import java.util.Map;

/***
 * 构造动态查询条件
 */
public interface DynamicSQLCondition {

    /***
     * 构造一个默认对象
     * @param targetClass
     * @param <T>
     * @return
     */
    static <T> Example.Builder builder(Class<T> targetClass) {
        return Example.builder(targetClass);
    }


    /***
     * @{code key}大于start且小于等于end
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlGreaterThanAndLessThanOrEqualTo(String key, V start, V end, Class<T> targetClass)
    {
        return sqlGreaterThanAndLessThanOrEqualTo(null,key,start,end,targetClass);
    }

    /***
     * @{code key}大于start且小于等于end
     * @param param
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlGreaterThanAndLessThanOrEqualTo(Map<String, Object> param, String key, V start, V end, Class<T> targetClass)
    {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andGreaterThan(key,start);
        criteria.andLessThanOrEqualTo(key,end);
        if(!CollectionUtils.isEmpty(param))
            criteria.andAllEqualTo(param);
        return example;
    }


    /***
     * @{code key}大于等于start且小于end
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlGreaterThanOrEqualToAndLessThan(String key, V start, V end, Class<T> targetClass)
    {
        return sqlGreaterThanOrEqualToAndLessThan(null,key,start,end,targetClass);
    }

    default <T,V> Example sqlGreaterThanOrEqualToAndLessThan(Map<String, Object> param, String key, V start, V end, Class<T> targetClass)
    {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andGreaterThanOrEqualTo(key,start);
        criteria.andLessThan(key,end);
        if(!CollectionUtils.isEmpty(param))
            criteria.andAllEqualTo(param);
        return example;
    }

    /***
     * @{code key}大于等于start且小于end
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlGreaterThanOrEqualToAndLessThanOrEqualTo(String key, V start, V end, Class<T> targetClass)
    {
        return sqlGreaterThanOrEqualToAndLessThanOrEqualTo(null,key,start,end,targetClass);
    }

    default <T,V> Example sqlGreaterThanOrEqualToAndLessThanOrEqualTo(Map<String, Object> param, String key, V start, V end, Class<T> targetClass)
    {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andGreaterThanOrEqualTo(key,start);
        criteria.andLessThanOrEqualTo(key,end);
        if(!CollectionUtils.isEmpty(param))
            criteria.andAllEqualTo(param);
        return example;
    }

    /***
     * @{code key}大于start且小于end
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlBetween(String key, V start, V end, Class<T> targetClass)
    {
        return  sqlBetween(null,key,start,end,targetClass);
    }

    /***
     * @{code key}大于start且小于end
     * @param param
     * @param key
     * @param start
     * @param end
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T,V> Example sqlBetween(Map<String, Object> param, String key, V start, V end, Class<T> targetClass)
    {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andBetween(key, start, end);
        if(!CollectionUtils.isEmpty(param))
        criteria.andAllEqualTo(param);
        return example;
    }

    /***
     * {@link DynamicSQLCondition.sqlAnd(String,Object,Class<T>)}
     * @param k1
     * @param v1
     * @param targetClass
     * @param <T>
     * @param <V>
     * @return
     */
    default <T, V> Example.Builder sqlAnd(String k1, V v1, Class<T> targetClass) {
        return sqlAnd(ImmutableMap.of(k1, v1), targetClass);
    }

    default <T, V> Example.Builder sqlAnd(String k1, V v1, String k2, V v2, Class<T> targetClass) {
        return sqlAnd(ImmutableMap.of(k1, v1, k2, v2), targetClass);
    }


    default <T, V> Example.Builder sqlAnd(String k1, V v1, String k2, V v2, String k3, V v3, Class<T> targetClass) {
        return sqlAnd(ImmutableMap.of(k1, v1, k2, v2, k3, v3), targetClass);
    }


    default <T, V> Example.Builder sqlAnd(String k1, V v1, String k2, V v2, String k3, V v3, String k4, V v4, Class<T> targetClass) {
        return sqlAnd(ImmutableMap.of(k1, v1, k2, v2, k3, v3, k4, v4), targetClass);
    }


    default <T, K, V> Example.Builder sqlAnd0(String key, V value, Class<T> targetClass, String... excludeProperties) {
//        Example example = new Example(targetClass);
//        Example.Criteria criteria = example.createCriteria();
//        criteria.andEqualTo(key,value);
//        if(excludeProperties!=null)
//        {
//            if(excludeProperties.length>0)
//            {
//                example.excludeProperties(excludeProperties);
//            }
//        }
//        return example;

        return builder(targetClass).andWhere(WeekendSqls.custom().andEqualTo(key, value));
    }



    /***
     * {@code key}属性等于{@code value}的记录
     * @param key
     * @param value
     * @param targetClass
     * @param <T>
     * @return
     */
    @Deprecated
    default <T> Example.Builder sqlAnd0(String key, Object value, Class<T> targetClass) {
        return sqlAnd(Collections.singletonMap(key,value),targetClass);
    }

    default <T> Example.Builder sqlAnd(String key, Object value, Class<T> targetClass, String... excludeProperties) {
//        Example example = new Example(targetClass);
//        Example.Criteria criteria = example.createCriteria();
//        criteria.andEqualTo(key,value);
//        if(excludeProperties!=null)
//        {
//            if(excludeProperties.length>0)
//            {
//                example.excludeProperties(excludeProperties);
//            }
//        }
//        return example;

        return builder(targetClass).andWhere(WeekendSqls.custom().andEqualTo(key, value));
    }

    default <T> Example.Builder sqlAnd(Map<String, Object> nameValuePair, Class<T> targetClass) {
//        Example example = new Example(targetClass);
//        Example.Criteria criteria = example.createCriteria();
//
//        for (Iterator<Map.Entry<String, Object>> it = nameValuePair.entrySet().iterator();it.hasNext();)
//        {
//            Map.Entry<String, Object> entry = it.next();
//            String name = entry.getKey();
//            Object value = entry.getValue();
//            //criteria.andAllEqualTo(nameValuePair);
//            criteria.andEqualTo(name,value);
//        }
//        //criteria.andEqualTo(key,value);
        WeekendSqls<T> criteria = WeekendSqls.custom();

        for (Iterator<Map.Entry<String, Object>> it = nameValuePair.entrySet().iterator(); it.hasNext(); ) {
            Map.Entry<String, Object> entry = it.next();
            String name = entry.getKey();
            Object value = entry.getValue();
            criteria.andEqualTo(name, value);
        }
        return builder(targetClass).where(criteria);
    }

    default <T> Example.Builder orderBy(String fieldName, Class<T> targetClass) {
        return builder(targetClass).orderBy(fieldName);
//        Example example = new Example(targetClass);
//        example.orderBy(fieldName);
//        return example;
    }

    default <T> Example.Builder orderBy(Class<T> targetClass, String... fieldNames) {
        return builder(targetClass).orderBy(fieldNames);
    }


    default <T> Example.Builder orderByDesc(String fieldName, Class<T> targetClass) {
        return builder(targetClass).orderByDesc(fieldName);
    }

    default <T> Example.Builder orderByDesc(Class<T> targetClass, String fieldNames) {
        return builder(targetClass).orderByDesc(fieldNames);
    }

    /***
     * 模糊查询{@code key}属性like {@code value}
     * @param key
     * @param value
     * @param targetClass
     * @param <T>
     * @return
     */
    default <T> Example sqlLike(String key, String value, Class<T> targetClass) {
        Example example = new Example(targetClass);
        Example.Criteria criteria = example.createCriteria();
        criteria.andLike(key, value);
        return example;
    }
}

新增代码使用方法:

public interface ApiServiceConsumerService extends  DynamicSQLCondition{
   
    int queryCount(Integer serviceId,String startTime, String endTime);
}

@Service
public class ApiServiceConsumerServiceImpl implements ApiServiceConsumerService {

  @Override
    public int queryCount(Integer serviceId, String startTime, String endTime) {

        Example example = sqlGreaterThanOrEqualToAndLessThanOrEqualTo(Collections.singletonMap("serviceId", serviceId), "createTime", startTime, endTime, ApiServiceConsumer.class);

        return serviceConsumerMapper.selectCountByExample(example);
    }

}
原文地址:https://www.cnblogs.com/passedbylove/p/12134087.html