使用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. 通用接口,该接口方法的名称与使用代码生成工具的名称完全相同
  1. package cn.liuyiyou.yishop.mapper;
  2. import java.io.Serializable;
  3. public interface BaseMapper<T,ID extends Serializable> {
  4. int deleteByPrimaryKey(ID id);
  5. int insert(T record);
  6. int insertSelective(T record);
  7. T selectByPrimaryKey(ID id);
  8. int updateByPrimaryKeySelective(T record);
  9. int updateByPrimaryKeyWithBLOBs(T record);
  10. int updateByPrimaryKey(T record);
  11. }
  1. 通用service接口。为了方便,名字和通用Mapper同名,其实更倾向于命名add。edit,find这类的命名,显得更加面向对象
  1. package cn.liuyiyou.yishop.service;
  2. import java.io.Serializable;
  3. public interface BaseService<T,ID extends Serializable> {
  4. void setBaseMapper();
  5. int deleteByPrimaryKey(ID id);
  6. int insert(T record);
  7. int insertSelective(T record);
  8. T selectByPrimaryKey(ID id);
  9. int updateByPrimaryKeySelective(T record);
  10. int updateByPrimaryKeyWithBLOBs(T record);
  11. int updateByPrimaryKey(T record);
  12. }
  1. 通用service实现。也很简单。就是调用通用mapper里面的方法即可
  1. package cn.liuyiyou.yishop.service.impl;
  2. import java.io.Serializable;
  3. import cn.liuyiyou.yishop.mapper.BaseMapper;
  4. import cn.liuyiyou.yishop.service.BaseService;
  5. public abstract class AbstractService<T, ID extends Serializable> implements BaseService<T, ID> {
  6. private BaseMapper<T, ID> baseMapper;
  7. public void setBaseMapper(BaseMapper<T, ID> baseMapper) {
  8. this.baseMapper = baseMapper;
  9. }
  10. @Override
  11. public int deleteByPrimaryKey(ID id) {
  12. return baseMapper.deleteByPrimaryKey(id);
  13. }
  14. @Override
  15. public int insertSelective(T record) {
  16. return baseMapper.insertSelective(record);
  17. }
  18. @Override
  19. public T selectByPrimaryKey(ID id) {
  20. return baseMapper.selectByPrimaryKey(id);
  21. }
  22. @Override
  23. public int updateByPrimaryKeySelective(T record) {
  24. return baseMapper.updateByPrimaryKey(record);
  25. }
  26. @Override
  27. public int updateByPrimaryKeyWithBLOBs(T record) {
  28. return baseMapper.updateByPrimaryKeyWithBLOBs(record);
  29. }
  30. @Override
  31. public int updateByPrimaryKey(T record) {
  32. return baseMapper.updateByPrimaryKey(record);
  33. }
  34. @Override
  35. public int insert(T record) {
  36. return baseMapper.insert(record);
  37. }
  38. }
  1. 具体的Mapper写法:
  1. package cn.liuyiyou.yishop.mapper;
  2. import java.util.List;
  3. import org.springframework.stereotype.Repository;
  4. import cn.liuyiyou.yishop.domain.ProductCategory;
  5. @Repository
  6. public interface ProductCategoryMapper extends BaseMapper<ProductCategory, Long>{
  7. /**
  8. * 通过父id得到类目列表
  9. * @param praentId
  10. * @return
  11. */
  12. List<ProductCategory> selectByParent(Long parent);
  13. }
  1. 具体的Servicd
  1. package cn.liuyiyou.yishop.service.impl;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import cn.liuyiyou.yishop.domain.Ad;
  7. import cn.liuyiyou.yishop.domain.Product;
  8. import cn.liuyiyou.yishop.mapper.AdMapper;
  9. import cn.liuyiyou.yishop.mapper.ProductMapper;
  10. import cn.liuyiyou.yishop.service.ProductService;
  11. @Service
  12. public class ProductServiceImpl extends AbstractService<Product,Long> implements ProductService {
  13. @Autowired
  14. private ProductMapper productMapper;
  15. @Autowired
  16. private AdMapper adMapper;
  17. //这句必须要加上。不然会报空指针异常,因为在实际掉用的时候不是BaseMapper调用,而是这个productMapper
  18. @Autowired
  19. public void setBaseMapper(){
  20. super.setBaseMapper(productMapper);
  21. }
  22. @Override
  23. public Map<String,Object> testTwo() {
  24. Product product = productMapper.selectByPrimaryKey(1l);
  25. Ad ad = adMapper.selectByPrimaryKey(1l);
  26. Map<String,Object> map = new HashMap<String,Object>();
  27. map.put("product", product);
  28. map.put("ad", ad);
  29. return map;
  30. }
  31. }

资料

http://liuyiyou.cn/2014/12/28/base-dao-service/ –这个好像有提到好坏

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

使用mybatis完成通用dao和通用service的更多相关文章

  1. spring+mybatis通用dao层、service层的实现

    个人理解: 1.mybatis-spring.jar 提供了SqlSessionTemplate类该类可以对数据库进行CRUD操作(底层其实还是SqlSession) 2.我们可以集成SqlSessi ...

  2. Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x

    Mybatis整合通用Dao,Mybatis整合通用Mapper,MyBatis3.x整合通用 Mapper3.5.x ============================== 蕃薯耀 2018年 ...

  3. Mybatis 使用PageHelper封装通用Dao分页方法

    参考: PageHelper官网:https://pagehelper.github.io/docs/howtouse/#3-%E5%A6%82%E4%BD%95%E5%9C%A8%E4%BB%A3% ...

  4. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  5. spring基于通用Dao的多数据源配置

    有时候在一个项目中会连接多个数据库,须要在spring中配置多个数据源,近期就遇到了这个问题,因为我的项目之前是基于通用Dao的,配置的时候问题不断.这样的方式和资源文件冲突:扫描映射文件的话,Sql ...

  6. Java学习笔记之使用反射+泛型构建通用DAO

    PS:最近简单的学了学后台Servlet+JSP.也就只能学到这里了.没那么多精力去学SSH了,毕竟Android还有很多东西都没学完.. 学习内容: 1.如何使用反射+泛型构建通用DAO. 1.使用 ...

  7. Java反射结合JDBC写的一个通用DAO

    以前写反射只是用在了与设计模式的结合上,并没有考虑到反射可以与DAO结合.也是一个偶然的机会,被正在上培训的老师点到这个问题,才考虑到这个可能性,于是上网参考各种代码,然后自己动手开发了一个通用DAO ...

  8. Spring Boot-------JPA——EntityManager构建通用DAO

    EntityManager EntityManager 是用来对实体Bean 进行操作的辅助类.他可以用来产生/删除持久化的实体Bean,通过主键查找实体bean,也可以通过EJB3 QL 语言查找满 ...

  9. 十六、springboot整合Spring-data-jpa(二)之通用DAO接口与添加自定义方法

    @NoRepositoryBean:Spring Data Jpa在启动时就不会去实例化BaseRepository这个接口 1.通用接口: import org.springframework.da ...

随机推荐

  1. ANDROID模拟火花粒子的滑动喷射效果

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 开篇废话: 年前换了一个手机,SONY的Z3C.这个手机在解锁屏幕时有一个滑动动画,类似火 ...

  2. jq 选择器

    基本选择器 1. id选择器(指定id元素)将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () {    ...

  3. Linux 安装 nginx注意

    ./configure --prefix=/usr/local/nginx TO ./configure --prefix=/usr/local/nginx --conf-path=/usr/loca ...

  4. 夺命雷公狗—angularjs—22—bind改指向和传参方式

    在angularjs中的传参的jquery的方式是极度相似的噢,而且还可以通过bind来改变指向 <!DOCTYPE html> <html lang="en" ...

  5. Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法[转]

    方法一: 试试修改一下manifest文件 :添加 一句:   android:installLocation="preferExternal" [html]view plainc ...

  6. js同步访问后台资源

    $.ajax( {  type : 'post',  url : url,  data : data,  async : false,//false代表只有在等待ajax执行完毕后才执行window. ...

  7. Auto push git tag

    CALL "C:\Program Files\TortoiseGit\bin\pageant.exe" "d:\CKey.ppk" set GIT_SSH=C: ...

  8. C语言初学者代码中的常见错误与瑕疵(3)

    问题: n-1位数字 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数. 输入: 第一行为M,表示测试数据组数. 接下来M行,每行包含一个测 ...

  9. 缓存方案之Redis

    Redis简介   Redis是Remote Dictionary Server(Redis) 的缩写,或许光听名字你就能猜出它大概是做什么的.不错,它是一个由Salvatore Sanfilippo ...

  10. STM32模拟I2C

    之前为了测试, 拿最小板做了一个I2C的主发跟主读, 一开始当然是尝试用硬件I2C, 结果弄了很久, 时间紧迫, 只好用了模拟, 结果发现, 哎, 真特么挺好用的, 现在1片儿顶过去5片儿. 硬件I2 ...