我是靠谱客的博主 美满小白菜,这篇文章主要介绍Mybatis抽象出通用方法,现在分享给大家,希望可以做个参考。

前言

之前实现了HIbernate的通用方法,相对比较容易,但是Mybatis本身没有提供类似Hibernate的EntityManager类可以操作对象。Mybatis提供了注解的方式直接写sql,达到了对象到数据表的映射,但是缺少通用的增删改查的抽象。目前已经有了第三方通用的Mapper类:tk.mybatis.mapper.common.Mapper,虽然提供了一些通用方法,但是不够全面。

本人在tk的Mapper上进行一次封装,扩展更多的通用方法,对于通用方法实现和继承BaseService、BaseServiceImpl,对于要自定义的方法,直接继承Mapper作为各自Dao接口来实现。

实现

1、BaseService-通用服务接口

import com.github.pagehelper.PageInfo;
import tk.mybatis.mapper.entity.Example;

import java.util.Collection;
import java.util.List;


/**
* 通用服务接口
*
* @param <T>
*/


public interface BaseService<T> {


    /**
     * 根据id获取实例
     *
     * @param id
     * @return
     */
    T get(Object id);




    /**
     * 根据id集合获取实例
     *
     * @param ids
     * @return
     */
    List<T> getByIds(Collection<Object> ids);


    /**
     * 根据name获取实例列表
     *
     * @param name
     * @return
     */
    List<T> getByName(String name);


    /**
     * 根据多个name获取实例列表
     *
     * @param names
     * @return
     */
    List<T> getByNames(Collection<String> names);


    /**
     * 根据name获取唯一的实例
     *
     * @param name
     * @return
     */
    T getUniqueByName(String name);


    /**
     * 根据example条件获取实例
     *
     * @param example
     * @return
     */
    List<T> getByExample(Example example);


    /**
     * 获取所有实例
     *
     * @return
     */
    List<T> getAll();


    /**
     * 分页获取实例(单表)
     *
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageInfo<T> getByPage(int pageNum, int pageSize);


    /**
     * 分页且根据example条件获取实例(单表)
     *
     * @param pageNum
     * @param pageSize
     * @param example
     * @return
     */
    PageInfo<T> getByPage(int pageNum, int pageSize, Example example);


    /**
     * 保存实例
     *
     * @param model
     * @return
     */
    int save(T model);


    /**
     * 批量保存实例
     *
     * @param list
     * @return
     */
    int saveBatch(List<T> list);


    /**
     * 根据id删除实例
     *
     * @param id
     * @return
     */
    int deleteById(Object id);


    /**
     * 根据id集合批量删除实例
     *
     * @param ids
     * @return
     */
    int deleteByIds(Collection<Object> ids);


    /**
     * 根据example条件删除实例
     *
     * @param example
     * @return
     */
    int deleteByExample(Example example);


    /**
     * 更新实例
     *
     * @param model
     * @return
     */
    int update(T model);


    /**
     * 批量更新实例
     *
     * @param list
     * @return
     */
    int updateBatch(List<T> list);


    /**
     * 根据example条件更新实例
     *
     * @param model
     * @param example
     * @return
     */
    int updateByExample(T model, Example example);

}

 

2、BaseServiceImpl-通用服务实现类

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.k3.kanalysis.common.response.BaseException;
import org.k3.kanalysis.service.BaseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.entity.Example;


import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.List;


/**
* 通用服务实现类
*
* <pre>
*      注意:需要实例化 Mapper
*      tk mapper 需要实例化,需要在自定义的service来实现,如:
*      //@PostConstruct
*      //public void init() {
*      //    this.mapper = xxxDao;
*      //}
* </pre>
*
* @param <T>
*/
@Service
@Transactional(rollbackFor = { BaseException.class, RuntimeException.class, Error.class })
public class BaseServiceImpl<T> implements BaseService<T> {


    @Autowired
    private SqlSessionFactory sqlSessionFactory;


    /**
     * 注意:需要实例化 tk mapper
     */
    protected Mapper<T> mapper;




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




    @Override
    public List<T> getByIds(Collection<Object> ids) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Example example = new Example(clazz);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", ids);
        return mapper.selectByExample(example);
    }


    @Override
    public List<T> getByName(String name) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Example example = new Example(clazz);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("name", name);
        return mapper.selectByExample(example);
    }


    @Override
    public List<T> getByNames(Collection<String> names) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Example example = new Example(clazz);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("name", names);
        return mapper.selectByExample(example);
    }


    @Override
    public T getUniqueByName(String name) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Example example = new Example(clazz);
        Example.Criteria criteria = example.createCriteria();
        criteria.andEqualTo("name", name);
        return mapper.selectOneByExample(example);
    }


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


    @Override
    public List<T> getAll() {


        return mapper.selectAll();
    }


    @Override
    public PageInfo<T> getByPage(int pageNum, int pageSize) {
        PageHelper.startPage(pageNum, pageSize);
        List<T> list = mapper.selectAll();
        PageInfo<T> pageInfo = new PageInfo<>(list);


        return pageInfo;
    }


    @Override
    public PageInfo<T> getByPage(int pageNum, int pageSize, Example example) {
        PageHelper.startPage(pageNum, pageSize);
        List<T> list = mapper.selectByExample(example);
        PageInfo<T> pageInfo = new PageInfo<>(list);


        return pageInfo;
    }


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


    @Transactional(rollbackFor = Exception.class)
    @Override
    public int saveBatch(List<T> list) {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        for (int i = 0; i < list.size(); i++) {
            mapper.insertSelective(list.get(i));
            if (i % 200 == 0) {
                sqlSession.flushStatements();
            }
        }
        sqlSession.flushStatements();


        return 1;
    }


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


    @Override
    public int deleteByIds(Collection<Object> ids) {
        Class<T> clazz = (Class<T>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        Example example = new Example(clazz);
        Example.Criteria criteria = example.createCriteria();
        criteria.andIn("id", ids);
        return mapper.deleteByExample(example);
    }


    @Override
    public int deleteByExample(Example example) {
        return mapper.deleteByExample(example);
    }


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


    @Override
    public int updateBatch(List<T> list) {
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
        for (int i = 0; i < list.size(); i++) {
            mapper.updateByPrimaryKeySelective(list.get(i));
            if (i % 200 == 0) {
                sqlSession.flushStatements();
            }
        }
        sqlSession.flushStatements();


        return 1;
    }


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

 

3、使用例子

public interface SysUserService extends BaseService<SysUser> {

}
@Service
public class SysUserServiceImpl extends BaseServiceImpl<SysUser> implements SysUserService {
    @Autowired
    private SysUserDao userDao;

    @PostConstruct
    public void init() {
        this.mapper = userDao;
    }
}
public interface SysUserDao extends Mapper<SysUser> {

}

 

最后

以上就是美满小白菜最近收集整理的关于Mybatis抽象出通用方法的全部内容,更多相关Mybatis抽象出通用方法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部