记一次MyBatis的错误
错误信息:java.lang.StackOverflowError
关于这个错误的深度解析,大家可以参考这篇博文,比较详细:https://blog.csdn.net/zc375039901/article/details/79179465\
先说说这个错误,我是怎么发生的?我的这个错误与上面我推荐的该错误原因深度解析没有多大的关系,大家可以适当了解了解。
简单的说,这是一个低级错误,特别对于"码农"头衔的大多数开发者而言。
习惯了惯性思维,习惯的复制粘贴,习惯了那套编写业务逻辑层的方式。
贴代码讲示例:
错误代码:
@Service
public class SysModuleServiceImpl extends ServiceImpl<SysModuleDao, SysModule> implements SysModuleService { @Autowired
private SysModuleService sysModuleService; @Override
public List<SysModule> queryModuleListInfo(Map<String, Object> map) {
// TODO Auto-generated method stub
return sysModuleService.queryModuleListInfo(map);
} @Override
public int queryModuleCountInfo(Map<String, Object> map) {
// TODO Auto-generated method stub
return sysModuleService.queryModuleCountInfo(map);
} }
这是我一时疏忽,这样写了,其实也不能说是一时疏忽,只能说是思维定势导致的。
开发者们一定不能思维定势,对于思维定势的开发者们,业界有这样一句名言,做五年的开发,相当于一年而已或者是开发多年,还是在那一套章法上循环往复。
不多说大道理了,关于上面的代码为什么不能这么写,为什么是错的,下面我将进行解答。
首先来说,@Service这个注解,大家应该不陌生了,特别是对于Java开发者们。
与这个注解并列的有@Reponsitory,@Component,@Controller,这些对于奋战一线的开发者们,早已眼熟而详了。
关于上面我为什么会犯这个错误?因为我忽略了依赖注入。
通常情况下,业务逻辑层直接与数据访问层交互,而Dao层,早已通过MyBatis动态扫描,注入了也就是在对应的spring-mybatis.xml文件配置了Bean。
当然了,这里要提一点,之所以不用MyBatis非动态扫描的方式,最大的原因是难以维护,不方便管理,因为如果采用这种方式,每个对应的Dao,我都要专门写一个bean进行管理,这样非常不好。特别对于业务需求时常变化,甚至以后功能扩展,代码重构都会带来很大的麻烦。而采用动态扫描的方式,则只要在Spring-MyBatis.xml配置对应的如下所示即可,这里我用的是MyBatis Plus,MyBatis Plus和MyBatis同Spring整合,基本上是没有区别的,除了一些特殊的插件和其他优化配置之外。
<!-- Spring整合Mybatis,更多查看文档:http://mp.baomidou.com -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描Mapping.xml文件 -->
<property name="mapperLocations" value="classpath:mybatis/system/*.xml"/>
<property name="configLocation" value="classpath:mybatis/mybatis-config.xml"/>
<property name="typeAliasesPackage" value="com.blog.entity"/>
<property name="plugins">
<array>
<!-- 分页插件配置 -->
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
</bean>
</array>
</property>
<!-- 全局配置注入 -->
<property name="globalConfig" ref="globalConfig" />
</bean>
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!--
AUTO->`0`("数据库ID自增")
INPUT->`1`(用户输入ID")
ID_WORKER->`2`("全局唯一ID")
UUID->`3`("全局唯一ID")
-->
<property name="idType" value="2" /> </bean> <!-- MyBatis 动态扫描 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.blog.daor"/>
</bean>
关键一行就是动态扫描这一行,还有就是对应的xml配置文件,上面和下面结合使Dao接口与xml文件中的sql进行绑定。
业务逻辑层是基于数据访问层的,如果直接业务逻辑层按照我文章开头那样的错误代码写法,是无法访问Dao层的。
另外大家要知道一点,层与层之间是双向关系,数据访问层依赖于数据库,数据库如果有什么异常,是会报错的,业务逻辑层依赖于数据访问层,控制层也就是接口层或者路由层,因为这里主要是处理前台请求的,并根据对应的逻辑返回对应的数据或者某种提示信息等等。
正确代码如下:
@Service
public class SysModuleServiceImpl extends ServiceImpl<SysModuleDao, SysModule> implements SysModuleService { @Autowired
private SysModuleDao sysModuleDao; @Override
public List<SysModule> queryModuleListInfo(Map<String, Object> map) {
// TODO Auto-generated method stub
return sysModuleDao.queryModuleListInfo(map);
} @Override
public int queryModuleCountInfo(Map<String, Object> map) {
// TODO Auto-generated method stub
return sysModuleDao.queryModuleCountInfo(map);
} }
这里还要提一下,为什么要有业务逻辑层,简单的说,业务逻辑层主要是为了复用数据访问层,实际业务是非常复杂的,需要整合多个数据访问层来达到实现业务的目的,比如拿智能门锁来说,我需要知道门锁编码是否存在,之前是否批量导入,根据我们的业务,与我们合作商,购买我们的门锁,通常购买一般以批次来衡量,比如他们购买了我们100把门锁,我们在后台通过一个Excel数据记录对应的门锁编号和其他相关数据,将其录入到我们的数据表中(批量导入),然后对方使用我们的后台管理系统进行安装,虽然我们导入了但是尚未激活,门锁有一个对应的状态,默认为0(尚未安装的或尚未激活的意思)。
当他们安装时,首先需要判断安装门锁编码是否存在,另外他们用于住宿方面,酒店编号和房间编号是否存在(这里使用我们对应的智能酒店管理系统与智能门锁后台系统进行关联,还有就是网关,判断网关是否安装,而且网关涉及到我们另外的数据表,为了使门锁与网关结合,我们需要编写一个方法,该方法涉及两张表的业务方面,所以这里就需要业务逻辑层,这里我想表达的意思是,业务逻辑层就是为了更好的处理业务和复用业务,以此来达到构建一个可扩展性好,可维护性好,稳定性好的web系统。
小结:这里我想告诉大家的是,不要忽视任何一个错误以及对于编程人员而言,是用脑来思考编程如何做的更好,而不是慢慢的变为一个重复性的体力劳动。当然了,博主我目前也没有完全做到,所以需要不断的学习和实际中不断的反思总结,以此来达到做最优秀的程序员和写一手优雅的代码目的。
记一次MyBatis的错误的更多相关文章
- 解决mybatis foreach 错误: Parameter '__frch_item_0' not found
解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spr ...
- Idea下mybatis的错误—Module not specified
IDEA下使用maven的mybatis常见错误 错误类型一:导入项目引起的错误Module not specified 错误提示:idea Error Module not specified. 错 ...
- 记一笔MyBatis的坑
记一笔MyBatis的坑 1.sql查询concat()连接函数xml运行查询乱码 ) , ), char)'%') bll FROM fact_dkxx sq 由于连接的字符串中包含数字与百分比字符 ...
- Mybatis学习错误之:重复加载mapper.xml
学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...
- maven,spring,mybatis集成错误
maven,spring,mybatis集成的时候单元测试junit测试没问题,但mvn jetty:run 就报错误 错误: org.apache.ibatis.binding.BindingExc ...
- 记一次mybatis bindingexception 问题排查
看到的错误信息如出一辙都是这样的:Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound s ...
- mybatis常见错误总结
1. 现象:mybatis xml文件中查询的返回类型写成list或java.util.List时,执行sql时报 java.lang.UnsupportedOperationException错误. ...
- Mybatis运行错误:信息: SQLErrorCodes loaded: [DB2, Derby, H2, HDB, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
Mybatis运行出现错误提示: 五月 23, 2018 12:07:22 上午 org.springframework.jdbc.support.SQLErrorCodesFactory <i ...
- mybatis 操作数据错误Truncated incorrect DOUBLE value: ''
网上查到遇到次错误造成的原因: UPDATE TSYS_ROLE_RIGHTSET ACTIVE_FLAG = '2' and UPDATE_PERSON = 'CaiYiHua' and UPDA ...
随机推荐
- JavaSE Set集合
明确Set集合接口的特点. java.util.Set接口和java.util.List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对Collec ...
- 关于centos 防火墙设置(nginx无法访问)
参考:http://blog.csdn.net/rosten/article/details/25053523 或者:http://blog.csdn.net/zhang197093/article/ ...
- 【ZeroMQ】1、ZeroMQ(java)入门之Requerst/Response模式
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些 ...
- JAVA设计模式详解(一)----------策略模式
策略模式,顾名思义就是设计一个策略算法,然后与对象拆分开来将其单独封装到一系列策略类中,并且它们之间可以相互替换.首先LZ举一个例子为大家引出这一个模式. 例子:某公司的中秋节奖励制度为每个员工发放2 ...
- 华中农业大学第五届程序设计大赛网络同步赛-D
Problem D: GCD Time Limit: 1 Sec Memory Limit: 1280 MBSubmit: 179 Solved: 25[Submit][Status][Web B ...
- windows 格式化D盘
格式化D盘1.右击我的电脑2.高级系统设置3.高级4.性能->设置5.高级->虚拟内存(更改)6.双击D设置->无分页文件7.确定->重启计算机
- django-sql注入攻击
一.原理 什么是sql注入 所谓SQL注入就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串(注入本质上就是把输入的字符串变成可执行的程序语句),最终达到欺骗服务器执行恶意的SQ ...
- python-享元模式
源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 如果一个软件系统在运行时所创建的相同或相似对象数量太多,将导致运行代价过高,带来 ...
- 走通Django的基本流程
工程目录及文件的说明 manage.py:一个命令行工具,可以使我们用多种方式对Django项目进行交互 __init__.py:一个空文件,它告诉Python这个文件的上级目录应该看做一个pytho ...
- 网页CSS中*{margin:0; padding:0;}有什么用
* 这东西叫“通配符”用来匹配页面上所有元素.*{margin:0; padding:0;} 像 2L 所说,body ,ul, li ,p,h1~h6,dd,dt 等……都有默认的margin 或p ...