错误信息: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的错误的更多相关文章

  1. 解决mybatis foreach 错误: Parameter '__frch_item_0' not found

    解决mybatis foreach 错误: Parameter '__frch_item_0' not found 在遍历对象的属性(是ArrayList对象)时报错: org.mybatis.spr ...

  2. Idea下mybatis的错误—Module not specified

    IDEA下使用maven的mybatis常见错误 错误类型一:导入项目引起的错误Module not specified 错误提示:idea Error Module not specified. 错 ...

  3. 记一笔MyBatis的坑

    记一笔MyBatis的坑 1.sql查询concat()连接函数xml运行查询乱码 ) , ), char)'%') bll FROM fact_dkxx sq 由于连接的字符串中包含数字与百分比字符 ...

  4. Mybatis学习错误之:重复加载mapper.xml

    学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...

  5. maven,spring,mybatis集成错误

    maven,spring,mybatis集成的时候单元测试junit测试没问题,但mvn jetty:run 就报错误 错误: org.apache.ibatis.binding.BindingExc ...

  6. 记一次mybatis bindingexception 问题排查

    看到的错误信息如出一辙都是这样的:Method threw 'org.apache.ibatis.binding.BindingException' exception.Invalid bound s ...

  7. mybatis常见错误总结

    1. 现象:mybatis xml文件中查询的返回类型写成list或java.util.List时,执行sql时报 java.lang.UnsupportedOperationException错误. ...

  8. 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 ...

  9. mybatis 操作数据错误Truncated incorrect DOUBLE value: ''

    网上查到遇到次错误造成的原因: UPDATE TSYS_ROLE_RIGHTSET ACTIVE_FLAG = '2' and UPDATE_PERSON = 'CaiYiHua' and  UPDA ...

随机推荐

  1. linux系统编程:open常用参数详解

    open用于打开一个文件,通过设置不同的flag,可以让进程只读,只写,可读/可写等操作 一.对一个不存在或者存在的文件(test.txt),进行写入操作 /*==================== ...

  2. 初识DOM

    初识DOM 一. 节点的获取.插入.创建.删除.替换.修改文本节点 获取 1.document.getElementById 2.(element)document.getElementsByTagN ...

  3. 小tip:CSS vw让overflow:auto页面滚动条出现时不跳动——张鑫旭

    小tip:CSS vw让overflow:auto页面滚动条出现时不跳动 这篇文章发布于 2015年01月25日,星期日,23:08,归类于 css相关. 阅读 46274 次, 今日 91 次 by ...

  4. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  5. 【代码笔记】iOS-在Block中修改外部变量值的

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, ...

  6. bootstrap datetimepicker日期插件美化

    效果 https://segmentfault.com/img/bVbieIp?w=1029&h=461 原文链接:https://segmentfault.com/a/11900000167 ...

  7. kvm 创建新虚拟机命virt-install 使用说明

    virt-install 命令说明 1.命令作用      建立(provision)新虚拟机   2.语法   virt-install [选项]... 3.说明(DESCRIPTION)   vi ...

  8. 【葡萄城报表】还在为画“类Word文档报表”而发愁吗?

    ​Word 是非常强大的文档编辑工具,一些行业制式文档都是使用Word来创建的,像教育行业的申请表,履历表,审批表等,像石油业的勘探记录表,记录报告,检测报告等,如房地产业的制式合同,不仅包含大量的文 ...

  9. C语言目录

    软件行业的很多细分学科都是都是基于C语言的,学习数据结构.算法.操作系统.编译原理等都离不开C语言. PHP.Python 等都是用C语言开发出来的,虽然平时做项目的时候看不到C语言的影子,但是如果想 ...

  10. 与HttpSession相关的监听器

    概述 与HttpSession相关的监听器有四个:分别是HttpSessionListener.HttpSessionAttributeListener.HttpSessionBindingListe ...