- 浏览: 26121 次
- 性别:
- 来自: 广州
文章分类
最新评论
被滥用的service+serviceImpl
JAVA大概是从2003年开始流行,我也是从那时开始学习JAVA。在这十多年中,相关技术推陈出新,我切身感受到这些变化。虽然很多程序员不断追随新技术,但未必领悟到这些变化的推动因素。 最近我看到不少新开工的项目,仍然大量采用 “service+serviceImpl、dao+daoImpl” 的代码结构,说真的,我有点痛心,似乎这种做法是理所当然的,似乎这成了一个技术套路。 今天,我想说的是,这样做是不合理的、没有意义的、过时的。
从代码混战到分层分块
由于java的流行和互联网的普及,企业网站、企业应用的开发开始从C/S转为B/S, 所以从那时起做好一个WEB应用很重要。 刚开始,也即2002~2003年,大家都是采用jsp+javabean+jdbc的方式,也不知道怎么分层,有的干脆把所有代码放在jsp中。 后来大家发现这样没法玩了,系统根本没法维护,也不安全,于是就有了MVC这样的架构模式。 MVC的理念挽救了这种局面,并且,运用该理念的模块化开发框架Struts出现了。MVC和Struts的广泛使用,使得开发WEB应用在业界达成了一个共识,那就是WEB应用基本可分为表现层、控制层、业务处理层。
到2004年,对WEB应用进行分层、分模块已是程序员的常识。 但是,有追求有讲究的企业发现了新的问题,那就是如何使自己的应用或产品既可以跑在mysql上,也可以跑在oracle上。 这个问题对程序员来说,就是如何编写业务处理层,使之易于移植到其它数据库。
为解决移植性问题而产生的套路
2005年以前的大多数项目都是直接在业务处理层的Service类中嵌入JDBC代码,这就使得这个Service类与数据库紧藕合,在换一种数据库的情况下,就要修改Service类中的sql。 根据软件设计的开闭原则,软件应该对修改关闭、对扩展开放。 因此,那时聪明的程序员就把这个Service类设计成一个接口,使控制层只依赖这个接口,于是就有了controller+service+serviceImpl;这样,当某天这个应用要跑在其它数据库上时,就而只需要增加一个serviceImpl类。 这就是service+serviceImpl套路产生的背景。
在那时service+serviceImpl并非解决这个问题的唯一方案,还有部分项目,他们的团队更有想法,他们把与数据库打交道的代码从service类中提取出来,成为单独的“数据访问层”(也称为“持久层”),于是形成了这样的层次结构 controller+service+dao+daoImpl。 了不起!这样对不同的数据库,可以有对应的daoImpl。 相比前面那种方案,而扩展一个daoImpl比扩展一个serviceImpl省事多了。
数据访问层的解决方案或框架
由于传统的JDBC代码,繁锁费事,因此不少人或团队尝试将这些代码封装起来,以使程序员不用再编写操作数据库连接、游标、数据集这样的逻辑。这样的工具通常以O/RMapping的思想作为基础,也称为O/RMapping框架。 2006年,hibernate从多种ORMapping框架中脱颖而出,很多项目中的 serviceImpl类开始采用hibernate来实现。hibernate强大,是把双刃剑,易上手但用好难、扩展性好但效率一般。(这也是我曾自研easydb的原因,代码: https://github.com/HuQingmiao/easydb)
2010年,myBatis诞生,2012年开始流行并讯速得到广泛认可。由于myBatis本身是采用xml文件实现的,因此能极好地融入到项目中,只需要把service+dao+daoImpl 中的daoImpl类去掉,改由其mapp.xml实现即可,即service+dao+mapper.xml。 然而,还有很多人在用myBatis的项目中,采用service+serviceImpl+ dao+daoImpl+ mapper.xml, 真的是浪费青春。所以,我说很多人在误用myBatis。
JAVA大概是从2003年开始流行,我也是从那时开始学习JAVA。在这十多年中,相关技术推陈出新,我切身感受到这些变化。虽然很多程序员不断追随新技术,但未必领悟到这些变化的推动因素。 最近我看到不少新开工的项目,仍然大量采用 “service+serviceImpl、dao+daoImpl” 的代码结构,说真的,我有点痛心,似乎这种做法是理所当然的,似乎这成了一个技术套路。 今天,我想说的是,这样做是不合理的、没有意义的、过时的。
从代码混战到分层分块
由于java的流行和互联网的普及,企业网站、企业应用的开发开始从C/S转为B/S, 所以从那时起做好一个WEB应用很重要。 刚开始,也即2002~2003年,大家都是采用jsp+javabean+jdbc的方式,也不知道怎么分层,有的干脆把所有代码放在jsp中。 后来大家发现这样没法玩了,系统根本没法维护,也不安全,于是就有了MVC这样的架构模式。 MVC的理念挽救了这种局面,并且,运用该理念的模块化开发框架Struts出现了。MVC和Struts的广泛使用,使得开发WEB应用在业界达成了一个共识,那就是WEB应用基本可分为表现层、控制层、业务处理层。
到2004年,对WEB应用进行分层、分模块已是程序员的常识。 但是,有追求有讲究的企业发现了新的问题,那就是如何使自己的应用或产品既可以跑在mysql上,也可以跑在oracle上。 这个问题对程序员来说,就是如何编写业务处理层,使之易于移植到其它数据库。
为解决移植性问题而产生的套路
2005年以前的大多数项目都是直接在业务处理层的Service类中嵌入JDBC代码,这就使得这个Service类与数据库紧藕合,在换一种数据库的情况下,就要修改Service类中的sql。 根据软件设计的开闭原则,软件应该对修改关闭、对扩展开放。 因此,那时聪明的程序员就把这个Service类设计成一个接口,使控制层只依赖这个接口,于是就有了controller+service+serviceImpl;这样,当某天这个应用要跑在其它数据库上时,就而只需要增加一个serviceImpl类。 这就是service+serviceImpl套路产生的背景。
在那时service+serviceImpl并非解决这个问题的唯一方案,还有部分项目,他们的团队更有想法,他们把与数据库打交道的代码从service类中提取出来,成为单独的“数据访问层”(也称为“持久层”),于是形成了这样的层次结构 controller+service+dao+daoImpl。 了不起!这样对不同的数据库,可以有对应的daoImpl。 相比前面那种方案,而扩展一个daoImpl比扩展一个serviceImpl省事多了。
数据访问层的解决方案或框架
由于传统的JDBC代码,繁锁费事,因此不少人或团队尝试将这些代码封装起来,以使程序员不用再编写操作数据库连接、游标、数据集这样的逻辑。这样的工具通常以O/RMapping的思想作为基础,也称为O/RMapping框架。 2006年,hibernate从多种ORMapping框架中脱颖而出,很多项目中的 serviceImpl类开始采用hibernate来实现。hibernate强大,是把双刃剑,易上手但用好难、扩展性好但效率一般。(这也是我曾自研easydb的原因,代码: https://github.com/HuQingmiao/easydb)
2010年,myBatis诞生,2012年开始流行并讯速得到广泛认可。由于myBatis本身是采用xml文件实现的,因此能极好地融入到项目中,只需要把service+dao+daoImpl 中的daoImpl类去掉,改由其mapp.xml实现即可,即service+dao+mapper.xml。 然而,还有很多人在用myBatis的项目中,采用service+serviceImpl+ dao+daoImpl+ mapper.xml, 真的是浪费青春。所以,我说很多人在误用myBatis。
发表评论
-
Spring Junit 读取WEB-INF下的配置文件
2018-01-25 10:31 640测试环境:Spring3.0.5 + Junit4.8.1 ... -
@Autowired和new的区别
2018-01-25 10:35 2826@Autowired相当于setter,在注入之前,对象已经实 ... -
Spring、使用注解方式装配对象(@Resource、@Autowired)
2018-01-25 10:33 662首先,引入注解所使用的Jar包 :common-anno ... -
阿里巴巴java开发手册 1.2
2017-07-07 20:28 655前言 《阿里巴巴 Java 开 ... -
转: Java之CountDownLatch使用
2017-07-04 16:23 3991、类介绍 一个同步辅助类,在完成一组正在其他线程中执行 ... -
SimpleDateFormat线程安全重现与解决
2017-07-04 14:59 704一. 为什么SimpleDateFormat不是线程安全的 ... -
Thread.join()方法详解
2017-07-04 11:15 861API: join public final ... -
hashMap优化
2017-06-30 15:51 4941 集合初始化时,指定集合初始值大小。 说明:Ha ... -
jdk7 Collections.sort()引发的IllegalArgumentException
2017-06-30 15:26 1613一 IllegalArgumentException的重 ... -
java内部类:如何使用
2017-06-29 16:57 530一 定义:放在一个类的内部的类我们就叫内部类。 二、 ... -
ArrayList循环遍历并删除元素的常见陷阱
2017-06-29 11:22 364在工作和学习中,经常碰到删除ArrayList里面的某个元 ... -
转: Eclipse中使用github
2017-06-28 14:24 3751.安装egit插件 在Eclipse中选择help-& ... -
github的注册添加删除
2017-06-28 14:07 4731 官网地址:https://github.com,进行注 ... -
eclipse快速创建标准maven管理的javaEE、web项目
2017-06-28 11:10 4191 先安装 eclipse maven 插件的安 ... -
翻译: 深入理解Java Integer的缓存策略
2017-06-26 17:49 430本文将介绍 Java 中 Intege ... -
@WebServlet注解配置问题记录
2017-06-23 10:34 2329@WebServlet 该注解用于在Web应用中定义Serv ... -
性能优化之ArrayList
2017-06-22 14:25 422ArrayListTest 写道 package cn.c ... -
LinkedList和ArrayList的使用及性能分析
2017-06-22 10:54 420转自http://www.jb51.net/arti ... -
ArrayList源码分析
2017-06-22 10:36 486ArrayList就是传说中的动态数组,就是Array的 ...
相关推荐
MyBatis-CMEU是一款基于MyBatis框架的代码生成工具,专为提高开发效率而设计。这款界面版的代码生成器允许开发者快速地自动生成常见的Java开发组件,包括Entity对象、DAO接口、Service接口及其实现类、Mapper XML...
标题 "mybatis-generator自动生成代码[增加Service的生成]" 指的是MyBatis Generator(MBG)这一工具,它能够根据数据库表结构自动产生Java持久层代码,大大减轻了开发人员的手动编码工作。在描述中提到"增加Service...
在开发过程中,我们经常需要编写大量的DAO(数据访问对象)、Service、ServiceImpl、Entity以及DAOImpl等类来完成数据库操作。然而,手动编写这些代码不仅耗时,而且容易出错。为了解决这个问题,"mybatis反向生成...
首先是springboot+mybatis+mysql,然后 运行util包里的CodeGenerator,可以根据表生成类包括 controller mapper mapper.xml service serviceImpl po
Spring、MyBatis和CXF是Java开发中常用的三大开源框架,它们分别在不同层面上为应用程序提供服务。Spring作为一款全面的后端应用框架,提供了依赖注入(DI)、面向切面编程(AOP)以及丰富的上下文管理功能。MyBatis...
在IDEA中,快捷键被分为多个类别,包括代码编辑、导航、版本控制、调试等。例如: 1. **代码编辑**: - `Ctrl + Alt + Insert`:创建新类、方法或字段。 - `Alt + Insert`:生成构造函数、getter/setter、equals...
##### dao.template 数据库接口Dao(mybatis接口方式,在方法上写sql,复杂的使用sqlProvider) ##### daoSqlProvider.template 复杂sql提供者 ##### service.template 对外开放的接口 ##### serviceImpl....
在现代的Java开发中,Spring Boot和Mybatis框架的结合为开发者提供了强大的后端开发工具。Spring Boot简化了Spring的应用配置,而Mybatis则是一个轻量级的持久层框架,两者结合可以高效地处理数据库操作。当我们需要...
逆向工程(Reverse Engineering)在MyBatis中的应用主要是指自动生成MyBatis的Mapper接口、Mapper XML配置文件以及对应的实体类,极大地简化了开发过程,减少了手动编写这些重复代码的工作量。 MyBatis逆向工程的...
开发者会在Mybatis的Mapper接口中定义SQL方法,通过XML或注解方式配置SQL语句,然后在Service层调用这些方法进行增删查改操作。 项目中的"news"可能代表新闻相关的模块,包含新闻的CRUD操作。在实际开发中,这可能...
SpringMybatisSpringMVC Spring+Mybatis+...web页面传id -> controller (有注入的service)->service.serviceImpl方法->实现dao.xml中的select语句 ->返回model->controller(model and view) model+jsp->返回响应
<property name="configLocation" value="classpath:mybatis-config.xml" /> ``` - **配置事务管理器**: 用于事务管理。 ```xml ``` 3. **创建MyBatis配置文件`mybatis-config.xml`**: - 设置`...
通常我们会按照约定的目录结构组织代码,如`Controller`目录存放控制器,`Entity`目录存放实体类,`Service`目录存放业务逻辑层,`ServiceImpl`存放服务的实现类。 3. **配置文件**: 在`application.yml`中配置...
6. **代码生成器**:Mybatis-Plus提供代码生成器,可以根据数据库表结构自动生成Entity、Mapper接口、ServiceImpl和Mapper XML文件,大大节省开发时间。 在这个简单的项目中,我们可以通过访问HTML页面来展示...
反射生成dto service serviceimpl mapper model类,自动生成代码集成mybats-plus 让开发更高效
在IT行业中,开发人员经常需要处理大量的数据操作,而Mybatis Plus和SpringBoot的结合则为这一过程提供了极大的便利。本篇文章将详细讲解如何利用Mybatis Plus与SpringBoot进行反向生成代码,以及这一过程中的关键...
在Java开发中,MyBatis框架与Oracle数据库结合进行批量数据导入时,可能会遇到一些问题。本文将详细探讨这些问题,并提供一种可行的解决方案。 首先,批量插入操作在DAO层,我们定义了一个`insertList`方法,它接收...
1、软件作者:yannannan闫楠... (1)PowerfulObject主要生成节点:(Controller层、entity实体层、Service/ServiceImpl、Mybatis、mybatisXML) (2)支持两种生成方式(全自动一套一体化生成、和灵活单节点功能生成)
1、springboot+mybatis代码生成器, 支持oracle数据库。 2、可以根据需求简单配置生成entity,dao,mapper.xml, service, serviceimpl, controller 等。