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
SSM 关于service和dao的封装的更多相关文章
- 理解Action,Service和Dao功能(转)
		真正理解.区分Action,Service和Dao功能 在不分层的系统里,我们可以将所有的代码都写到一个地方,比如struts的Action类.在这里,我们不仅要处理页面逻辑,还要做业务逻辑,还要 ... 
- 使用mybatis plus自动生成controller、service、dao、mapper、entity代码
		官网:http://mp.baomidou.com(这个项目不仅仅可以用于代码生成,还有分页等其他功能,是对mybatis的一层封装) 要求:基于sql自动生成domain.controller.se ... 
- (转)淘淘商城系列——SSM框架整合之Dao层整合
		http://blog.csdn.net/yerenyuan_pku/article/details/72721093 一个项目中往往有三层即Dao层.Service层和Web层,看标题就知道了,本文 ... 
- java中从Spring、Hibernate和Struts框架的action、service和dao三层结构异常处理体系设计
		Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,那么只有在发生了unchecked exception的时候,才会进行事务回滚 ... 
- Struts2 + Spring + Hibernate 通用 Service 和 DAO
		我在 Struts2 + Spring + Hibernate 项目开发中总结出了一个Service 和 DAO ,可以用于处理任何的pojo(bean).使用这两个Service 和 DAO 可以 ... 
- Controller、Service、Dao进行Junit单元
		原文链接:http://blog.csdn.net/u013041642/article/details/71430293 Spring对Controller.Service.Dao进行Junit单元 ... 
- java service domain dao 分层思路
		今天在开发项目的时候,对项目的java后台的分层有一些看法: 首先,鼓励使用service domain dao 层分层设计概念. 其次,对几层作用的理解: 第一:dao层操作单表,不涉及复杂逻辑,主 ... 
- springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。
		springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑. 1.1 异常处理思路 系统中异常包括两类:预期异常和运行时异常RuntimeEx ... 
- service依赖dao的接口进行数据传输
		service依赖dao的接口进行数据传输 
随机推荐
- eclipse 格式化快捷键(Ctrl+shift+f)不起作用的解决办法
			eclipse格式化快界面Ctrl+Shift+f不起作用一般是键位冲突所导致的,一般是搜狗输入法的“繁体与简体”中文切换快界面冲突. 把它禁用掉就可以了. 下面是禁用步骤: 点击sougou输入法右 ... 
- 第17章     EXTI—外部中断/事件控制器
			第17章 EXTI—外部中断/事件控制器 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.co ... 
- MiZ702学习笔记11——如何使用vivado isim仿真
			说到vivado的仿真确实是很有意思,不管是ISE还是Quartus都可以自己自动生成测试平台的完整构架,但是vivado不行,所有的测试代码自己写!(我反正是查了好久,都没发现vivado如何自动生 ... 
- TMS320VC5509的MCBSP配置成SPI模式通信
			1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ... 
- .Net Core WebApi控制器接收原始请求正文内容
			主要目标 在Asp.net Core控制器中,通过自定义格式化程序来映射自定义处理控制器中的“未知”内容. 简单案例 为了演示这个问题,我们用VS2017创建一个默认的Asp.net Core Web ... 
- 如何有效的报告bug?
			对于比较棘手的bug,反馈务须清晰.详细.精确,我们给出以下6个建议: 1.现场演示:重复bug出现的操作步骤.这个适用于公司内部人员. 2.详细描述:在什么系统使用哪个版本的YoMail,做了什 ... 
- SpringBoot日记——MQ消息队列整合(二)
			基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ... 
- Python_Xlrd&Xlwt
			import xlrd # \U 开始的字符被编译器认为是八进制 解决方法 r objWB = xlrd.open_workbook(r'C:\Users\IBM\Desktop\S1\7月下旬入库表 ... 
- allegro 封装 (引脚编号修改)
			1. 打开dra文件在find里面 off all 然后只点击text 2.点击需要更改的焊盘 3.菜单栏edit - text 4.弹出窗口修改即可 
- 基于Shader实现的UGUI描边解决方案
			基于Shader实现的UGUI描边解决方案 前言 大扎好,我系狗猥.当大家都以为我鸽了的时候,我又出现了,这也是一种鸽.创业两年失败后归来,今天想给大家分享一个我最近研究出来的好康的,比游戏还刺激,还 ... 
