使用mybatis完成通用dao和通用service
2016-05-05 10:52
579 查看
使用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具体代码
通用接口,该接口方法的名称与使用代码生成工具的名称完全相同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); }
[/code]
通用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); }
[/code]
通用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); } }
[/code]
具体的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); }
[/code]
具体的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; } }
[/code]
资料
http://liuyiyou.cn/2014/12/28/base-dao-service/ –这个好像有提到好坏http://git.oschina.net/free/Mapper/blob/master/UseMapperInSpring4.md –这个看了一下,但是没有进行试验,不知道好坏与否
相关文章推荐
- 编译和安装在Windows上橡胶树 (Compiling and Installing Yate on Windows)
- php.ini 核心配置选项说明
- 文本编辑常用快捷键
- MFC时钟跟定时器
- 你还在使用Handler做计时器么?来一个自定义TextView解决这些困扰吧!
- 查看进程
- php.ini 核心配置选项说明
- 27. Remove Element
- spring框架结构介绍
- 你还在使用Handler做计时器么?来一个自定义TextView解决这些困扰吧!
- c#作业
- 在Spring4中使用通用Mapper
- C++ Vector
- Linux下tomcat服务自动重启
- HDU 2103 Family planning
- spi
- Intellij IDEA, Android Studio, Eclipse,Gradle, Maven, Ants关系概述
- HDOJ(HDU) 2143 box(简单的多次判断-用的卫条件)
- HDU 5159 Card(概率期望)
- Number、parseIn和parseFloat 区别