近期由于客户需求,所以我们整个小组开始开发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

SSM 关于service和dao的封装的更多相关文章

  1. 理解Action,Service和Dao功能(转)

    真正理解.区分Action,Service和Dao功能   在不分层的系统里,我们可以将所有的代码都写到一个地方,比如struts的Action类.在这里,我们不仅要处理页面逻辑,还要做业务逻辑,还要 ...

  2. 使用mybatis plus自动生成controller、service、dao、mapper、entity代码

    官网:http://mp.baomidou.com(这个项目不仅仅可以用于代码生成,还有分页等其他功能,是对mybatis的一层封装) 要求:基于sql自动生成domain.controller.se ...

  3. (转)淘淘商城系列——SSM框架整合之Dao层整合

    http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ...

  4. java中从Spring、Hibernate和Struts框架的action、service和dao三层结构异常处理体系设计

    Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,那么只有在发生了unchecked exception的时候,才会进行事务回滚 ...

  5. Struts2 + Spring + Hibernate 通用 Service 和 DAO

    我在 Struts2 + Spring + Hibernate  项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ...

  6. Controller、Service、Dao进行Junit单元

    原文链接:http://blog.csdn.net/u013041642/article/details/71430293 Spring对Controller.Service.Dao进行Junit单元 ...

  7. java service domain dao 分层思路

    今天在开发项目的时候,对项目的java后台的分层有一些看法: 首先,鼓励使用service domain dao 层分层设计概念. 其次,对几层作用的理解: 第一:dao层操作单表,不涉及复杂逻辑,主 ...

  8. springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

    springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ...

  9. service依赖dao的接口进行数据传输

    service依赖dao的接口进行数据传输

随机推荐

  1. OpenGL笔记(四) API参考

    常见API glActiveTexture 选择活动纹理单元 glAttachShader 将一个着色器对象绑定到一个程序对象 void glAttachShader(GLuint program, ...

  2. 基于bootstrap的multiple-select下拉控件使用

    multiple-select是一款优秀的下拉菜单控件,能够支持单选和多选. 详细参考文档: JS组件系列——两种bootstrap multiselect组件大比拼 multiple-select ...

  3. MapReduce -- 最短路径

    示例: 给出各个节点到相邻节点的距离,要求算出初始节点到各个节点的最短路径. 数据: A (B,) (D,) B (C,) (D,) C (E,) D (B,) (C,) (E,) E (A,) (C ...

  4. 从0开始学golang--2.1--如何去爬园子的数据

    20天过去了,才开始写...主要还是因为自己懒吧.之前一边上班一边也有挤时间练习golang,可是写博客却老是不能行动,跑步也没跑了.突然的就懈怠了快一个月.可能也和开始玩the elder scro ...

  5. 20155334 网络对抗PC平台逆向破解(二)

    注入Shellcode并运行攻击 shellcode就是一段机器指令(code) 通常这段机器指令的目的是为获取一个交互式的shell(像linux的shell或类似windows下的cmd.exe) ...

  6. Spring-data-jpa 学习笔记(一)

    Spring家族越来越强大,作为一名javaWeb开发人员,学习Spring家族的东西是必须的.在此记录学习Spring-data-jpa的相关知识,方便后续查阅. 一.spring-data-jpa ...

  7. libgdx判断矩形重叠碰撞

    有两种方式. 1. 排除法,排除四种不可能重叠的情况就是了. public static boolean IsOverlap( Rectangle rect1, Rectangle rect2 ){ ...

  8. 【ORACLE】oracle打补丁

    -- 备份旧的opatch cd $ORACLE_HOME/ mv OPatch  OPatch_20180323_old -- 上传补丁工具和补丁包到oraclehome目录下,解压 unzip p ...

  9. 记一次Java加密加签算法到php的坑

    此文为本人原创首发于 http://www.35coder.com/convert_encryption_codes_to_php/. 写代码的经历中,总少不了与外部的程序对接,一旦有这样的事,往往周 ...

  10. eclipse中怎么找项目部署的路径和找编译后的class路径

    1.快捷键 ctrl+shift+R,会默认显示你的源文件.java的路径,如果没有.class的话,点击右上角的三角,选中  Show Derived Resource; 2.打开出现下图 3.按下 ...