• SSM 关于service和dao的封装


    近期由于客户需求,所以我们整个小组开始开发java项目。

    虽然很久以前也是系统学习过。不过干了这么多年 .net  ,有关java的早就扔了。

    好了,废话不多说。我们看看SSM 关于service和dao的封装(对于java来说,我是个菜鸡,有问题大家请指正)

    一 对于SSM框架的搭建,我就不细讲了。

    直接上图结构:

    上面这个是我搭建的程序结构。

    红框的是重点会改造的层。

    二  修改 dao 层

    首先,我们看一下原始的目录结构:(原始目录结构并没有  IDao/IDaoBase.java

    我们几乎在每个mapper.java文件中都看到了相同的代码。虽然他们是自动生成的。。。。

    以下就是SysUserMapper的代码。

    注释部分:是自动生成的,

    未注释部分:是我额外添加的方法。

    public interface SysUserMapper extends IDaoBase<SysUser> {
    //public interface SysUserMapper {
    //    int deleteByPrimaryKey(Integer userid);
    //
    //    int insert(SysUser record);
    //
    //    int insertSelective(SysUser record);
    //
    //    SysUser selectByPrimaryKey(Integer userid);
    //
    //    int updateByPrimaryKeySelective(SysUser record);
    //
    //    int updateByPrimaryKey(SysUser record);
        
    	SysUser selectByAccount(String account);
        
        List<SysUser> findAll();
    }


    根据代码中

    public interface SysUserMapper extends IDaoBase<SysUser> {

    我们很明确的知道了。我封装了IDaoBase,让所有的mapper都继承了IDaoBase

    IDaoBase<T>  代码

    public interface IDaoBase<T> {
    	int deleteByPrimaryKey(Integer id);
    
        int insert(T record);
    
        int insertSelective(T record);
    
        T selectByPrimaryKey(Integer id);
    
        int updateByPrimaryKeySelective(T record);
    
        int updateByPrimaryKey(T record);
    }

    记得每个Mapper.java都继承IDaoBase<T>

    当然这里细心的朋友,一定会发觉一个问题。

    为何我使用

    public interface SysUserMapper extends IDaoBase<SysUser>

    而不是

    public interface SysUserMapper<T> extends IDaoBase<T>

    这个问题,我后面讲,目前叫它:问题一

    三  修改Service和Impl层

    serivce层:

    这个层就很简单了。先看结构

    我们不看impl

    先看service。

    其实就是创建了一个 IBaseService.java

    然后看代码

    public interface IBaseService<T> {
    	int deleteByPrimaryKey(Integer id);
    
    	ResultModel insert(T record);
    
    	ResultModel insertSelective(T record);
    
    	T selectByPrimaryKey(Integer id);
    
    	ResultModel updateByPrimaryKeySelective(T record);
    
    	ResultModel updateByPrimaryKey(T record);
    
    }


    然后看一下 IUserService.java的代码

    public interface IUserService {
    	/*int deleteByPrimaryKey(Integer userid);
    
    	ResultModel insert(SysUser record);
    
    	ResultModel insertSelective(SysUser record);
    
    	SysUser selectByPrimaryKey(Integer userid);
    
    	int updateByPrimaryKeySelective(SysUser record);
    
    	int updateByPrimaryKey(SysUser record);*/
    
    	ResultModel selectByUsername(SysUser tUser);
    
    	List<SysUser> findAll();
    }

    注释部分:是自动生成的,

    未注释部分:是我额外添加的方法。

     

    这里也有一个问题,

    public interface IUserService 

    我并没有继承IBaseService<SysUser>

    其实这个无伤大雅,继承不继承,都随意。

    记做问题二

     

    最后,我们看一下 impl层

     

    很明显,我创建了 BaseServiceImpl

    看一下代码:

    ResultModel是我定义的一个返回类型。这里不用管它

    public class BaseServiceImpl<T,U extends IDaoBase<T>> implements IBaseService<T>{
    	@Autowired
    	protected U mapper;
    
    	@Override
    	public int deleteByPrimaryKey(Integer id) {
    		// TODO Auto-generated method stub
    		return mapper.deleteByPrimaryKey(id);
    	}
    
    	@Override
    	public ResultModel insert(T record) {
    		// TODO Auto-generated method stub
    		ResultModel resultModel = new ResultModel();
    		int num = mapper.insert(record);
    		if (num == 0) {
    			resultModel.setCode(ResultModel.FAIL_CODE);
    			resultModel.setMessage(ResultModel.FAIL_MESSAGE);
    		}
    		return resultModel;
    	}
    
    	@Override
    	public ResultModel insertSelective(T record) {
    		// TODO Auto-generated method stub
    		ResultModel resultModel = new ResultModel();
    		int num = mapper.insertSelective(record);
    		if (num == 0) {
    			resultModel.setCode(ResultModel.FAIL_CODE);
    			resultModel.setMessage(ResultModel.FAIL_MESSAGE);
    		}
    		return resultModel;
    	}
    
    	@Override
    	public T selectByPrimaryKey(Integer id) {
    		// TODO Auto-generated method stub
    		return mapper.selectByPrimaryKey(id);
    	}
    
    	@Override
    	public ResultModel updateByPrimaryKeySelective(T record) {
    		// TODO Auto-generated method stub
    		ResultModel resultModel = new ResultModel();
    		int num = mapper.updateByPrimaryKeySelective(record);
    		if (num == 0) {
    			resultModel.setCode(ResultModel.FAIL_CODE);
    			resultModel.setMessage(ResultModel.FAIL_MESSAGE);
    		}
    		return resultModel;
    	}
    
    	@Override
    	public ResultModel updateByPrimaryKey(T record) {
    		// TODO Auto-generated method stub
    		ResultModel resultModel = new ResultModel();
    		int num = mapper.updateByPrimaryKey(record);
    		if (num == 0) {
    			resultModel.setCode(ResultModel.FAIL_CODE);
    			resultModel.setMessage(ResultModel.FAIL_MESSAGE);
    		}
    		return resultModel;
    	}	
    	
    }



    UserServiceImpl

    @Service("userService")
    public class UserServiceImpl extends BaseServiceImpl<SysUser,SysUserMapper>  implements IUserService {
    
    	@Override
    	public ResultModel selectByUsername(SysUser tUser) {
    		// TODO Auto-generated method stub
    		ResultModel resultModel = new ResultModel();
    		SysUser result = mapper.selectByAccount(tUser.getAccount());
    		resultModel.setObject(result);
    		return resultModel;
    	}
    
    	@Override
    	public List<SysUser> findAll() {
    		// TODO Auto-generated method stub
    		List<SysUser> result = mapper.findAll();
    
    		return result;
    
    	}
    	
    	
    }




    这里主要解释一下 

    public class BaseServiceImpl<T,U extends IDaoBase<T>> implements IBaseService<T>

    先看BaseServiceImpl  implements IBaseService<T> 

    和UserServiceImpl implements IUserService

    这也是问题二的答案了。由于BaseServiceImpl 继承了IBaseService<T> ,所以对于IBaseService的6个基本方法,已经在BaseServiceImpl 被实现了。

    并且UserServiceImpl implements IUserService  说明UserServiceImpl 会实现IUserService  中的方法。所以问题二继承不继承都无所谓。

    接着 

    BaseServiceImpl中的

    BaseServiceImpl<T,U extends IDaoBase<T>>

    就对应了

    UserServiceImpl中的

    UserServiceImpl extends BaseServiceImpl<SysUser,SysUserMapper>

    很明显,我需要将实体对象 SysUser和 Mapper对象SysUserMapper传递给BaseServiceImpl。

    这样我才知道调用哪个Mapper和实体对象。

    这也是问题一的来源,可能是我封装的有问题。毕竟java还是不太熟悉,而且还是mybatis作为 orm的ssm架构。

    这里整个帖子也进入了尾声。

    四  问题二的讨论(可以略过)

    应该没什么好多分析的了。我们可以讨论一下问题一

     

    本来我尝试在SysUserMapper中将

    public interface SysUserMapper extends IDaoBase<SysUser>


    修改为

    public interface SysUserMapper<T> extends IDaoBase<T>

    如此一来我本来想在

    UserServiceImpl 中将

    public class UserServiceImpl extends BaseServiceImpl<SysUser,SysUserMapper>  implements IUserService

    修改为

    public class UserServiceImpl extends BaseServiceImpl<SysUserMapper<SysUser>>  implements IUserService


    奈何,由于泛型的继承格式改变,我就要去修改
    BaseServiceImpl中的

    public class BaseServiceImpl<T,U extends IDaoBase<T>> implements IBaseService<T>

    将它改为

    public class BaseServiceImpl<U<T>,U extends IDaoBase<T>> implements IBaseService<T>

    上面这句是伪代码。

    其实我本意就是如果能传递接口泛型U<T> 这样,那么世界就更美好一些了。不过我试了不行,毕竟我是java的彩笔。

    希望有朋友可以指正观点。

    甚至你说这样的封装没有用,也没关系。其实我也就希望给后面的人偷偷懒。不用再次创建很多重复的service和impl



  • 相关阅读:
    小四学习系列教程
    SQL分组多列统计(GROUP BY后按条件分列统计) -转
    fdisk:command not found
    PWA最简单例子
    Rider 2017.1.1下跑AVD出现Unexpected schema version 3错误的解决方法
    困扰:C#.net 连接Oracle11g 不报错但是在connection时出现 ServerVersion 引发了“System.InvalidOperationException”类型的异常
    JQuery EasyUI datagrid 复杂表头处理
    sql server 与oracle 中字段类型的对应
    Oracle 11g导出空表、少表的解决办法
    JS组件系列——两种bootstrap multiselect组件大比拼
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779810.html
Copyright © 2020-2023  润新知