MyBatis通用dao和通用service

更新于2015/01/29,增加了第三种方法

##更新于2015/02/09,第三种方法方法改进,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

第一种:需要三个泛型,当前实体对象,主键,映射对象,

好处:具体Service实现类简单,如果自己没有特殊的方法,继承BaseServiceImpl之后不需要写任何东西

不好之处:

  1. 每个通用方法都需要传递映射参数:比如findById,如果是UserService调用,则需要这样写:userService.findById(1,UserMapper.class),这样在BaseMapperImpl中才可以通过class.getName得到映射的名称

  2. 而且在BaseMapperImpl中写得比较死。修改起来比较复杂

第二种:

第一:不需要在方法上写各种泛型参数,同时也不需要在各种方法中传递映射参数

第二:通用dao也不需要写实现:mybatis-spring所倡导的的一致

不好之处:

需要在每个Service实现类中写上:

 
  1. @Autowired

  2. public void setBaseMapper(UserMapper userMapper){

  3.  
  4. super.setBaseMapper(userMapper);

  5. }

而且关键的是@Autowired不能少。这个在开发过程中不好进行限制

具体代码

  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. }

第三种:更新于2015/01/31,增加了第三种方法

这一种算是第二种的改进。避免了在ServiceImpl中写@Autowired

去掉,privste BaseMapper<T,ID> baseMapper。

 
  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. @Override

  7. public abstract BaseMapper<T, ID> getMapper() ;

  8. @Override

  9. public int deleteByPrimaryKey(ID id) {

  10. return getMapper().deleteByPrimaryKey(id);

  11. }

  12. @Override

  13. public int insert(T record) {

  14. return getMapper().insert(record);

  15. }

  16. @Override

  17. public int insertSelective(T record) {

  18. return getMapper().insertSelective(record);

  19. }

  20. @Override

  21. public T selectByPrimaryKey(ID id) {

  22. return getMapper().selectByPrimaryKey(id);

  23. }

  24. @Override

  25. public int updateByPrimaryKeySelective(T record) {

  26. return getMapper().updateByPrimaryKeySelective(record);

  27. }

  28. @Override

  29. public int updateByPrimaryKeyWithBLOBs(T record) {

  30. return getMapper().updateByPrimaryKeyWithBLOBs(record);

  31. }

  32. @Override

  33. public int updateByPrimaryKey(T record) {

  34. return getMapper().updateByPrimaryKey(record);

  35. }

  36. }

具体的Service实现。在这个里面,通过抽象的Service,来强制具体Service实现getMapper方法,而不需要在该方法上加@Autowired。

 
  1. package cn.liuyiyou.yishop.service.impl;

  2. import org.springframework.beans.factory.annotation.Autowired;

  3. import org.springframework.stereotype.Service;

  4. import cn.liuyiyou.yishop.domain.Ad;

  5. import cn.liuyiyou.yishop.mapper.AdMapper;

  6. import cn.liuyiyou.yishop.mapper.BaseMapper;

  7. import cn.liuyiyou.yishop.service.AdService;

  8. import cn.liuyiyou.yishop.service.BaseService;

  9. @Service

  10. public class AdServiceImpl extends AbstractService<Ad,Long> implements AdService {

  11. @Autowired

  12. public AdMapper adMapper;

  13. @Override

  14. public BaseMapper<Ad, Long> getMapper() {

  15. return adMapper;

  16. }

  17. }

最近更新于2015/02/09,第三种方法方法改进,service实现上不需要加泛型

之所以记录下来的原因是因为,在service接口上没有使用泛型

 
  1. package cn.liuyiyou.springmvc.mapper;

  2. import java.io.Serializable;

  3. /**

  4. * User: liuyiyou

  5. * Date: 14-12-27

  6. * Time: 下午11:39

  7. */

  8. public interface BaseMapper<T,ID extends Serializable> {

  9. //只需要这个就可以了,并不需要具体的实现,只需要在Service中设置BaseMapper

  10. T findById(ID id);

  11. Integer insert(T t);

  12. }

  13. package cn.liuyiyou.springmvc.service;

  14. import java.io.Serializable;

  15. /**

  16. * User: liuyiyou

  17. * Date: 14-12-27

  18. * Time: 下午11:53

  19. */

  20. public interface BaseService <T,ID extends Serializable>{

  21. T findById(ID id);

  22. int insert(T t);

  23. }

  24. package cn.liuyiyou.springmvc.service;

  25. import cn.liuyiyou.springmvc.mapper.BaseMapper;

  26. import java.io.Serializable;

  27. /**

  28. * User: liuyiyou

  29. * Date: 14-12-27

  30. * Time: 下午11:54

  31. */

  32. public abstract class BaseServiceImpl<T,ID extends Serializable> implements BaseService<T,ID> {

  33. public abstract BaseMapper getMapper();

  34. @Override

  35. public T findById(ID id) {

  36. return (T) getMapper().findById(id);

  37. }

  38. @Override

  39. public int insert(T t) {

  40. return getMapper().insert(t);

  41. }

  42. }

  43. package cn.liuyiyou.springmvc.service;

  44. import cn.liuyiyou.springmvc.domain.User;

  45. public interface UserService extends BaseService {

  46. boolean addUser(User user);

  47. }

  48. package cn.liuyiyou.springmvc.service;

  49. import cn.liuyiyou.springmvc.mapper.BaseMapper;

  50. import cn.liuyiyou.springmvc.mapper.UserMapper;

  51. import org.springframework.beans.factory.annotation.Autowired;

  52. import org.springframework.stereotype.Service;

  53. import org.springframework.transaction.annotation.Transactional;

  54. import cn.liuyiyou.springmvc.domain.User;

  55. @Service

  56. @Transactional(value="transactionManager")

  57. public class UserServiceImpl extends BaseServiceImpl implements UserService{

  58. @Autowired

  59. private UserMapper userMapper;

  60. @Override

  61. public BaseMapper getMapper(){

  62. return userMapper;

  63. }

  64. public boolean addUser(User user) {

  65. int reuslt = userMapper.insert(user);

  66. if (reuslt>0)

  67. return true;

  68. return false;

  69. }

  70. }

文章标签: mybatis

https://blog.csdn.net/w1014074794/article/details/52335549

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用Mybatis-Plus进行通用DAO层封装的示例代码: 1. 首先,我们需要引入Mybatis-Plus依赖: ```xml <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.2</version> </dependency> ``` 2. 接着,我们需要定义一个基础的Mapper接口,用于封装通用的增删改查操作: ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; public interface MyBaseMapper<T> extends BaseMapper<T> { } ``` 3. 然后,我们需要定义一个基础的Service接口,用于封装通用的增删改查操作: ```java import com.baomidou.mybatisplus.extension.service.IService; public interface MyBaseService<T> extends IService<T> { } ``` 4. 最后,我们需要定义一个基础的ServiceImpl实现类,用于实现通用的增删改查操作: ```java import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; public abstract class MyBaseServiceImpl<M extends MyBaseMapper<T>, T> extends ServiceImpl<M, T> implements MyBaseService<T> { } ``` 通过以上代码实现,我们可以很方便地使用Mybatis-Plus进行通用DAO层封装。接下来,我们只需要定义具体的Mapper和Service接口,继承以上基础接口即可,如: ```java public interface UserMapper extends MyBaseMapper<User> { } public interface UserService extends MyBaseService<User> { } public class UserServiceImpl extends MyBaseServiceImpl<UserMapper, User> implements UserService { } ``` 这样,我们就可以通过UserService接口,调用Mybatis-Plus提供的通用方法,实现对User表的增删改查操作了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值