前言
之前实现了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抽象出通用方法内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复