错误信息: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. 2018 Google SEO 需要注意的点

    1.RankBrain 是一种机器学习系统 - 会根据用户的行为进行,对网站排名. 用户在你的网页上停留多久(用户停留时长) 多大比例的用户点击了你的网页(点击率) Note: 之前Google 开发 ...

  2. Java基础——详尽说明try-catch-finally的用法

    问:Java异常处理机制,理解了吗?Java异常处理,真的掌握了吗?什么是自定义异常?catch体里遇到return 是怎么处理?finally 体里有return怎么处理?catch 和 final ...

  3. ssh免密登陆及时间设置

    1.ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa // 在自己主机生成私钥和公钥 2.scp id_rsa.pub centos@s201:/home/centos ...

  4. BZOJ3351: [ioi2009]Regions(根号分治)

    题意 题目链接 Sol 很神仙的题 我们考虑询问(a, b)(a是b的祖先),直接对b根号分治 如果b的出现次数\(< \sqrt{n}\),我们可以直接对每个b记录下与它有关的询问,这样每个询 ...

  5. es6 export与export default 的区别

    相同点: 均可用于导出常量.函数.文件.模块等 不同点: 1.在一个文件中export可以有多个,但export default 只能有一个: export var firstName = 'Mich ...

  6. Component Interface相关面试题

    下面的列表中的问题很常见,Component Interface是很重要的.你知道基本知识比知道答案更重要. Q:以下陈述是错误的. A:一个Component Interface 可以map多个Pe ...

  7. React Native常用第三方组件汇总--史上最全 之一

    React Native 项目常用第三方组件汇总: react-native-animatable 动画 react-native-carousel 轮播 react-native-countdown ...

  8. Python基础知识之疑点难点

    一.标识符 (1) 标识符不能以数字开头:以下划线开头的标识符具有特殊的意义,使用时需要特别注意. 以单下划线开头(如_foo)的标识符代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 “ ...

  9. [经典Bug]Android-初始化闪屏不消失

    问题描述: 业务上初始化过程要求显示闪屏界面,某个版本更新后,发现部分场景下,初始化完成后闪屏界面不消失. 问题原因: 初始化是在子线程进行,闪屏属于UI界面,需要UI线程展示.初始化过程和闪屏显示在 ...

  10. 一起学习Boost标准库--Boost.StringAlgorithms库

    概述 在未使用Boost库时,使用STL的std::string处理一些字符串时,总是不顺手,特别是当用了C#/Python等语言后trim/split总要封装一个方法来处理.如果没有形成自己的com ...