zoukankan      html  css  js  c++  java
  • 使用mybatis完成通用dao和通用service

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

    概述:

    使用通用dao和通用service可以减少代码的开发。可以将常用的增删改查放到通用dao中。对不同的or框架,基本上都有自己的实现如SpringJPA的Repository就提供了常用的增删改查方法。而MyBatis借助代码生成工具也可以生成常用方法的映射

    这里只针对Mybatis。如果使用代码生成工具,会有一个问题:每个Mapper里面都有一些方法(增晒改查)。维护起来的话还好。只是在写service的时候会有一个问题。比如UserMapper里面有 insert(User user) , find(Integer id) ,delete(Integer id) 等方法,则在service中也要有这些方法的实现。假设每个Mapper有5个方法。则service也需要有5个方法的实现。如果有10个实体类。mapper可以省略(由生成工具生成),但是service有50个方法。到后期肯定不好进行维护

    使用通用Mapper和Service

    该通用Mapper使用了Spring-mybatis。所以没有实现类,而是直接调用xml文件中的同名方法。之所以将通用Mapper抽出来主要是为了方便些通用的service

    具体代码

    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/ –这个好像有提到好坏

    http://git.oschina.net/free/Mapper/blob/master/UseMapperInSpring4.md –这个看了一下,但是没有进行试验,不知道好坏与否

  • 相关阅读:
    【MySQL】学生成绩
    【MySQL】统计累计求和
    【MySQL】查询不在表中的数据
    【MySQL】排名函数
    【Python】数据处理分析,一些问题记录
    【Github】如何下载csv文件/win10如何修改txt文件为csv文件
    【Windows】github无法访问/hosts文件只能另存为txt
    【C/C++】拔河比赛/分组/招商银行
    【C/C++】金币
    【C/C++】旋转数组的最小数字/ 剑指offer
  • 原文地址:https://www.cnblogs.com/handsome1013/p/5461020.html
Copyright © 2011-2022 走看看