记一次MyBatis的错误
錯誤信息:java.lang.StackOverflowError
關(guān)于這個錯誤的深度解析,大家可以參考這篇博文,比較詳細(xì):https://blog.csdn.net/zc375039901/article/details/79179465\
先說說這個錯誤,我是怎么發(fā)生的?我的這個錯誤與上面我推薦的該錯誤原因深度解析沒有多大的關(guān)系,大家可以適當(dāng)了解了解。
簡單的說,這是一個低級錯誤,特別對于"碼農(nóng)"頭銜的大多數(shù)開發(fā)者而言。
習(xí)慣了慣性思維,習(xí)慣的復(fù)制粘貼,習(xí)慣了那套編寫業(yè)務(wù)邏輯層的方式。
貼代碼講示例:
錯誤代碼:
@Service public class SysModuleServiceImpl extends ServiceImpl<SysModuleDao, SysModule> implements SysModuleService {@Autowiredprivate SysModuleService sysModuleService;@Overridepublic List<SysModule> queryModuleListInfo(Map<String, Object> map) {// TODO Auto-generated method stubreturn sysModuleService.queryModuleListInfo(map);}@Overridepublic int queryModuleCountInfo(Map<String, Object> map) {// TODO Auto-generated method stubreturn sysModuleService.queryModuleCountInfo(map);}}?
這是我一時疏忽,這樣寫了,其實也不能說是一時疏忽,只能說是思維定勢導(dǎo)致的。
開發(fā)者們一定不能思維定勢,對于思維定勢的開發(fā)者們,業(yè)界有這樣一句名言,做五年的開發(fā),相當(dāng)于一年而已或者是開發(fā)多年,還是在那一套章法上循環(huán)往復(fù)。
不多說大道理了,關(guān)于上面的代碼為什么不能這么寫,為什么是錯的,下面我將進(jìn)行解答。
首先來說,@Service這個注解,大家應(yīng)該不陌生了,特別是對于Java開發(fā)者們。
與這個注解并列的有@Reponsitory,@Component,@Controller,這些對于奮戰(zhàn)一線的開發(fā)者們,早已眼熟而詳了。
關(guān)于上面我為什么會犯這個錯誤?因為我忽略了依賴注入。
通常情況下,業(yè)務(wù)邏輯層直接與數(shù)據(jù)訪問層交互,而Dao層,早已通過MyBatis動態(tài)掃描,注入了也就是在對應(yīng)的spring-mybatis.xml文件配置了Bean。
當(dāng)然了,這里要提一點,之所以不用MyBatis非動態(tài)掃描的方式,最大的原因是難以維護,不方便管理,因為如果采用這種方式,每個對應(yīng)的Dao,我都要專門寫一個bean進(jìn)行管理,這樣非常不好。特別對于業(yè)務(wù)需求時常變化,甚至以后功能擴展,代碼重構(gòu)都會帶來很大的麻煩。而采用動態(tài)掃描的方式,則只要在Spring-MyBatis.xml配置對應(yīng)的如下所示即可,這里我用的是MyBatis Plus,MyBatis Plus和MyBatis同Spring整合,基本上是沒有區(qū)別的,除了一些特殊的插件和其他優(yōu)化配置之外。
<!-- 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`("數(shù)據(jù)庫ID自增")INPUT->`1`(用戶輸入ID")ID_WORKER->`2`("全局唯一ID")UUID->`3`("全局唯一ID")--><property name="idType" value="2" /></bean><!-- MyBatis 動態(tài)掃描 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.blog.daor"/></bean>?
關(guān)鍵一行就是動態(tài)掃描這一行,還有就是對應(yīng)的xml配置文件,上面和下面結(jié)合使Dao接口與xml文件中的sql進(jìn)行綁定。
業(yè)務(wù)邏輯層是基于數(shù)據(jù)訪問層的,如果直接業(yè)務(wù)邏輯層按照我文章開頭那樣的錯誤代碼寫法,是無法訪問Dao層的。
另外大家要知道一點,層與層之間是雙向關(guān)系,數(shù)據(jù)訪問層依賴于數(shù)據(jù)庫,數(shù)據(jù)庫如果有什么異常,是會報錯的,業(yè)務(wù)邏輯層依賴于數(shù)據(jù)訪問層,控制層也就是接口層或者路由層,因為這里主要是處理前臺請求的,并根據(jù)對應(yīng)的邏輯返回對應(yīng)的數(shù)據(jù)或者某種提示信息等等。
?
正確代碼如下:
@Service public class SysModuleServiceImpl extends ServiceImpl<SysModuleDao, SysModule> implements SysModuleService {@Autowiredprivate SysModuleDao sysModuleDao;@Overridepublic List<SysModule> queryModuleListInfo(Map<String, Object> map) {// TODO Auto-generated method stubreturn sysModuleDao.queryModuleListInfo(map);}@Overridepublic int queryModuleCountInfo(Map<String, Object> map) {// TODO Auto-generated method stubreturn sysModuleDao.queryModuleCountInfo(map);}}?
這里還要提一下,為什么要有業(yè)務(wù)邏輯層,簡單的說,業(yè)務(wù)邏輯層主要是為了復(fù)用數(shù)據(jù)訪問層,實際業(yè)務(wù)是非常復(fù)雜的,需要整合多個數(shù)據(jù)訪問層來達(dá)到實現(xiàn)業(yè)務(wù)的目的,比如拿智能門鎖來說,我需要知道門鎖編碼是否存在,之前是否批量導(dǎo)入,根據(jù)我們的業(yè)務(wù),與我們合作商,購買我們的門鎖,通常購買一般以批次來衡量,比如他們購買了我們100把門鎖,我們在后臺通過一個Excel數(shù)據(jù)記錄對應(yīng)的門鎖編號和其他相關(guān)數(shù)據(jù),將其錄入到我們的數(shù)據(jù)表中(批量導(dǎo)入),然后對方使用我們的后臺管理系統(tǒng)進(jìn)行安裝,雖然我們導(dǎo)入了但是尚未激活,門鎖有一個對應(yīng)的狀態(tài),默認(rèn)為0(尚未安裝的或尚未激活的意思)。
當(dāng)他們安裝時,首先需要判斷安裝門鎖編碼是否存在,另外他們用于住宿方面,酒店編號和房間編號是否存在(這里使用我們對應(yīng)的智能酒店管理系統(tǒng)與智能門鎖后臺系統(tǒng)進(jìn)行關(guān)聯(lián),還有就是網(wǎng)關(guān),判斷網(wǎng)關(guān)是否安裝,而且網(wǎng)關(guān)涉及到我們另外的數(shù)據(jù)表,為了使門鎖與網(wǎng)關(guān)結(jié)合,我們需要編寫一個方法,該方法涉及兩張表的業(yè)務(wù)方面,所以這里就需要業(yè)務(wù)邏輯層,這里我想表達(dá)的意思是,業(yè)務(wù)邏輯層就是為了更好的處理業(yè)務(wù)和復(fù)用業(yè)務(wù),以此來達(dá)到構(gòu)建一個可擴展性好,可維護性好,穩(wěn)定性好的web系統(tǒng)。
?
小結(jié):這里我想告訴大家的是,不要忽視任何一個錯誤以及對于編程人員而言,是用腦來思考編程如何做的更好,而不是慢慢的變?yōu)橐粋€重復(fù)性的體力勞動。當(dāng)然了,博主我目前也沒有完全做到,所以需要不斷的學(xué)習(xí)和實際中不斷的反思總結(jié),以此來達(dá)到做最優(yōu)秀的程序員和寫一手優(yōu)雅的代碼目的。
轉(zhuǎn)載于:https://www.cnblogs.com/youcong/p/9451756.html
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的记一次MyBatis的错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wi-Fi模块的设置方法汇总
- 下一篇: TMD 这个写笔记的号,盗了有意思吗