使用mybatis完成通用dao和通用service

使用mybatis完成通用dao和通用service

概述:

使用通用dao和通用service能夠減小代碼的開發。能夠將經常使用的增刪改查放到通用dao中。對不一樣的or框架,基本上都有本身的實現如SpringJPA的Repository就提供了經常使用的增刪改查方法。而MyBatis藉助代碼生成工具也能夠生成經常使用方法的映射java

這裏只針對Mybatis。若是使用代碼生成工具,會有一個問題:每一個Mapper裏面都有一些方法(增曬改查)。維護起來的話還好。只是在寫service的時候會有一個問題。好比UserMapper裏面有 insert(User user) , find(Integer id) ,delete(Integer id) 等方法,則在service中也要有這些方法的實現。假設每一個Mapper有5個方法。則service也須要有5個方法的實現。若是有10個實體類。mapper能夠省略(由生成工具生成),可是service有50個方法。到後期確定很差進行維護git

使用通用Mapper和Service

該通用Mapper使用了Spring-mybatis。因此沒有實現類,而是直接調用xml文件中的同名方法。之因此將通用Mapper抽出來主要是爲了方便些通用的servicespring

具體代碼

  1. 通用接口,該接口方法的名稱與使用代碼生成工具的名稱徹底相同
package cn.liuyiyou.yishop.mapper; import java.io.Serializable; public interface BaseMapper<T,ID extends Serializable> {  int deleteByPrimaryKey(ID id);  int insert(T record);  int insertSelective(T record);  T selectByPrimaryKey(ID id);  int updateByPrimaryKeySelective(T record);  int updateByPrimaryKeyWithBLOBs(T record);  int updateByPrimaryKey(T record); }
  1. 通用service接口。爲了方便,名字和通用Mapper同名,其實更傾向於命名add。edit,find這類的命名,顯得更加面向對象
package cn.liuyiyou.yishop.service; import java.io.Serializable; public interface BaseService<T,ID extends Serializable> {  void setBaseMapper();  int deleteByPrimaryKey(ID id);  int insert(T record);  int insertSelective(T record);  T selectByPrimaryKey(ID id);  int updateByPrimaryKeySelective(T record);  int updateByPrimaryKeyWithBLOBs(T record);  int updateByPrimaryKey(T record); }
  1. 通用service實現。也很簡單。就是調用通用mapper裏面的方法便可
package cn.liuyiyou.yishop.service.impl; import java.io.Serializable; import cn.liuyiyou.yishop.mapper.BaseMapper; import cn.liuyiyou.yishop.service.BaseService; public abstract class AbstractService<T, ID extends Serializable> implements BaseService<T, ID> {  private BaseMapper<T, ID> baseMapper;  public void setBaseMapper(BaseMapper<T, ID> baseMapper) {   this.baseMapper = baseMapper;  }  @Override  public int deleteByPrimaryKey(ID id) {   return baseMapper.deleteByPrimaryKey(id);  }  @Override  public int insertSelective(T record) {   return baseMapper.insertSelective(record);  }  @Override  public T selectByPrimaryKey(ID id) {   return baseMapper.selectByPrimaryKey(id);  }  @Override  public int updateByPrimaryKeySelective(T record) {   return baseMapper.updateByPrimaryKey(record);  }  @Override  public int updateByPrimaryKeyWithBLOBs(T record) {   return baseMapper.updateByPrimaryKeyWithBLOBs(record);  }  @Override  public int updateByPrimaryKey(T record) {   return baseMapper.updateByPrimaryKey(record);  }  @Override  public int insert(T record) {   return baseMapper.insert(record);  } }
  1. 具體的Mapper寫法:
package cn.liuyiyou.yishop.mapper; import java.util.List; import org.springframework.stereotype.Repository; import cn.liuyiyou.yishop.domain.ProductCategory; @Repository public interface ProductCategoryMapper extends BaseMapper<ProductCategory, Long>{  /**  * 經過父id獲得類目列表  * @param praentId  * @return  */  List<ProductCategory> selectByParent(Long parent); }
  1. 具體的Servicd
package cn.liuyiyou.yishop.service.impl; import java.util.HashMap; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.liuyiyou.yishop.domain.Ad; import cn.liuyiyou.yishop.domain.Product; import cn.liuyiyou.yishop.mapper.AdMapper; import cn.liuyiyou.yishop.mapper.ProductMapper; import cn.liuyiyou.yishop.service.ProductService; @Service public class ProductServiceImpl extends AbstractService<Product,Long> implements ProductService {  @Autowired  private ProductMapper productMapper;  @Autowired  private AdMapper adMapper;  //這句必需要加上。否則會報空指針異常,由於在實際掉用的時候不是BaseMapper調用,而是這個productMapper  @Autowired  public void setBaseMapper(){   super.setBaseMapper(productMapper);  }  @Override  public Map<String,Object> testTwo() {   Product product = productMapper.selectByPrimaryKey(1l);   Ad ad = adMapper.selectByPrimaryKey(1l);   Map<String,Object> map = new HashMap<String,Object>();   map.put("product", product);   map.put("ad", ad);   return map;  } }

資料

http://liuyiyou.cn/2014/12/28/base-dao-service/ –這個好像有提到好壞mybatis

http://git.oschina.net/free/Mapper/blob/master/UseMapperInSpring4.md –這個看了一下,可是沒有進行試驗,不知道好壞與否app

相關文章
相關標籤/搜索