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());
    }
}

猜你喜欢

转载自www.cnblogs.com/passedbylove/p/12134087.html