tk.mybatis 通用 service 实现

117 阅读1分钟

概述

样例基于 java springboot 整合 tk.mybatis 的使用。

pom.xml

<!-- 引入maven依赖  -->
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>2.1.5</version>
</dependency>

model

@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "SYS_USER")
public class User {
    @Id
    @Column(name = "ID")
    @GeneratedValue(generator = "JDBC", strategy = GenerationType.TABLE)
    private String id;

    @Column(name = "USER_NAME")
    private String userName;

    @Column(name = "REMARK")
    private String remark;

    @Column(name = "DEPT_ID")
    private String deptId;

mapper

@Repository
public interface UserMapper extends Mapper<User> {
    Page<SystemUserVO> selectSystemUserByCondition(SystemUserQueryCondition condition);
}

service

先写一个接口类 IService<T>

public interface Service <T> {
    /**一些简单方法*/
    
    int save(T t);

    int deleteById(Object id);

    int deleteByIds(Collection<Object> ids, String fieldName);

    int update(T t);

    int updateByExample(T t, Example example);

    T selectById(Object id);

    List<T> selectByIds(Collection<String> ids, String fieldName);

    List<T> selectByExample(Example example);

    T selectOneByExample(Example example);

}

实现一个抽象类 AbstractService<T>

public class AbstractService<T> implements Service<T>{

    protected Mapper<T> mapper;

    protected Class<T> modelClass;

    @SuppressWarnings("unchecked")
    public AbstractService() {
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
        modelClass = (Class<T>) pt.getActualTypeArguments()[0];
        String mapperName = modelClass.getSimpleName();
        // 首字母小写 其实就是根据传入的 T 构造出一个可以获取对应 mapper bean 
        // 如:User -> user + Mapper = userMapper
        mapperName = mapperName.substring(0,1).toLowerCase() + mapperName.substring(1);
        mapper = SpringContextUtils.getBean(mapperName + "Mapper",Mapper.class);
    }

    @Override
    public int save(T t) {
        return mapper.insertSelective(t);
    }

    @Override
    public int deleteById(Object id) {
        return mapper.deleteByPrimaryKey(id);
    }

    @Override
    public int deleteByIds(Collection<Object> ids, String fieldName) {
        Example example = new Example(modelClass);
        example.createCriteria().andIn(fieldName, ids);
        return mapper.deleteByExample(example);
    }

    @Override
    public int update(T t) {
        return mapper.updateByPrimaryKeySelective(t);
    }

    @Override
    public int updateByExample(T t, Example example) {
        return mapper.updateByExampleSelective(t, example);
    }

    @Override
    public T selectById(Object id) {
        return mapper.selectByPrimaryKey(id);
    }

    @Override
    public List<T> selectByIds(Collection<String> ids, String fieldName) {
        Example example = new Example(modelClass);
        example.createCriteria().andIn(fieldName, ids);
        return mapper.selectByExample(example);
    }

    @Override
    public List<T> selectByExample(Example example) {
        return mapper.selectByExample(example);
    }

    public T selectOneByExample(Example example) {
        return mapper.selectOneByExample(example);
    }
}

UserService

public class UserServiceImpl extends AbstractService<User>implements IUserService {
}