手机进销存系统/供应链管理系统
花了將近兩個月的時間學(xué)習(xí)了一個企業(yè)級進銷存項目,已經(jīng)結(jié)束了兩周多,現(xiàn)在終于有時間來對這個項目的學(xué)習(xí)做個總結(jié)了!
一、首先介紹下這個項目
(注:本人目前大三,專業(yè)為信息管理,與編程沾邊不多。而我對編程很感興趣,從大一下期開始主要通過看書和視頻自學(xué)學(xué)習(xí)java編程!)。
項目名稱:手機進銷存系統(tǒng)(Mobile SCM)
主要開發(fā)技術(shù):Struts2+Spring+ibatis+jQuery
數(shù)據(jù)庫:MySql5.1(Navicat客戶端管理工具)
服務(wù)器:tomcat7.0
建模工具:ER/Studio
運行系統(tǒng):Linux
其他技術(shù):報表應(yīng)用iReport+jasperReport技術(shù),應(yīng)用jxl進行excel導(dǎo)出。
項目介紹(視頻原話):本系統(tǒng)由某手機貿(mào)易企業(yè)定制開發(fā),合同價格9.8萬元,開發(fā)周期3個月,5人開發(fā)完成。本系統(tǒng)既具有一般進銷存系統(tǒng)功能,又有客戶獨有的需求,通過學(xué)習(xí)本課程,可以全面了解進銷存類項目。
視頻評價:
①.這是我在網(wǎng)上找的一套視頻教程,總共80集,每集60分鐘左右(需要很大的耐心啊!)。項目有點老,大概是12年左右錄制的,但是學(xué)到的東西很多。
②.這是我看的視頻中總時間最長的一套視頻了,雖然有80集之多,但仍有很多模塊功能的實現(xiàn)沒有在視頻中展現(xiàn)出來。但是,這套視頻已經(jīng)把該講的都講了,而且講的很全面,學(xué)到了很多東西。
③.這套視頻是基于現(xiàn)有的、企業(yè)實際在使用的系統(tǒng)來講解,從售前的與客戶溝通->開發(fā)階段->售后維護階段,讓我了解到了公司項目開發(fā)流程。不過這套視頻的著重點是在開發(fā)階段,主要講解了系統(tǒng)設(shè)計、建模工具的使用、主要模塊功能實現(xiàn)等;像與客戶溝通、具體參與項目需求分析、團隊分工合作等還是得工作后具體參與其中才能真正有所體會。
④.視頻講解的內(nèi)容也非常詳細,就一個功能而言,詳細地講解了JS,頁面構(gòu)成,代碼編寫,文件配置等等,所以也能學(xué)到很多細節(jié)性的東西,某些內(nèi)容會在后面寫出來。作為一個開發(fā)人員,最主要的是需要了解項目的需求,根據(jù)需求來完成代碼的編寫。
實際學(xué)習(xí):
①.首先,視頻中的持久層框架使用的是iBatis,我因為在學(xué)習(xí)這套視頻之前不久剛學(xué)習(xí)過了MyBatis框架,所以將iBatis換成了MyBatis,ibatis、mybatis和hibernate后面會具體說一說。總的來說,框架的使用感覺是非常簡單的,在此之前就已經(jīng)學(xué)習(xí)過了S2SH(Struts2+Spring+Hibernate),SSM(SpringMVC+Spring+MyBatis),學(xué)框架就是學(xué)配置!。
②.在實際學(xué)習(xí)時,視頻中講解系統(tǒng)設(shè)計等內(nèi)容時是跟著視頻認真聽的,涉及到代碼的編寫等內(nèi)容大部分是先了解模塊功能的需求后,先自行編寫代碼實現(xiàn)功能后再快進地看視頻,代碼編寫相對簡單,主要還是業(yè)務(wù)需求。代碼寫多了之后會發(fā)現(xiàn)(剛剛統(tǒng)計了下代碼量<僅統(tǒng)計了.java和.jsp>,到現(xiàn)在為止,已超過11W行啦(∩_∩)),無非就是增刪改查,要說難一點的就是將需求轉(zhuǎn)換為邏輯實現(xiàn)。
③.因為是練習(xí),加上學(xué)校時間也比較緊,實際編寫代碼時,部分類似于表單驗證的就沒有具體做了;到后面部分模塊也沒有具體去實現(xiàn)了,因為基本都是些重復(fù)的工作了,在以前的學(xué)習(xí)和項目中代碼寫得夠多的啦~\(≧▽≦)/~,而且視頻總的來說也只實現(xiàn)了一半不到的功能,因為視頻講的非常詳細,所以想要80集講完所有功能不可能,也沒有必要!!
④.因為講得很詳細,所以學(xué)到了以前很多沒注意到的細節(jié);在學(xué)習(xí)這套視頻的同時,一方面學(xué)到了很多新知識,類似于建模工具ER/Studio的使用;另一方面也復(fù)習(xí)了以前的知識,并更加熟練地加以運用。在這期間,有些新的知識點或者解決的問題寫了幾篇新的博客(可以看之前的博客),有些則會在接下來的篇幅中進行總結(jié)!
?
二、項目相關(guān)截圖展示
1.登錄頁面
?2.首頁
?3.功能展示
菜單管理
權(quán)限管理
供應(yīng)商業(yè)務(wù)
?
4.虛擬機運行效果(Linux)
?5.工程目錄結(jié)構(gòu)
?6.項目相關(guān)文件
?
?三、項目學(xué)習(xí)總結(jié)
?1.進銷存系統(tǒng)概述
?進銷存系統(tǒng)也稱作供應(yīng)鏈管理系統(tǒng)(Supply Chain Management, SCM)。SCM基本內(nèi)容:計劃(決策管理層,主要體現(xiàn)在報表上)、采購、[制造(跟生產(chǎn)有關(guān)的企業(yè))]、庫存、銷售、退換貨管理。SCM總體為兩大流程:物品流、財務(wù)流。
?百度百科解釋:進銷存系統(tǒng)是對企業(yè)生產(chǎn)經(jīng)營中進貨、出貨、批發(fā)銷售、付款等進行全程跟蹤管理,從接獲訂單合同開始,進入物料采購、入庫、領(lǐng)用到產(chǎn)品完工入庫、交貨、回收貨款、支付原材料款等,每一步都為您提供詳盡準(zhǔn)確的數(shù)據(jù)。有效輔助企業(yè)解決業(yè)務(wù)管 ?理、分銷管理、存 ?貨管理、營銷計劃的執(zhí)行和監(jiān)控、統(tǒng)計信息的收集等方面的業(yè)務(wù)問題。
?系統(tǒng)總流程圖:
?
?2.項目組成員及分工(企業(yè)開發(fā)):我想剛進公司的新人則處于開發(fā)工程師這個階段,然后一步步往上走!
?項目經(jīng)理(PM):與客戶溝通、進度、成本、質(zhì)量的控制、資源(人力資源)協(xié)調(diào)等。
?系統(tǒng)分析師(SA)[架構(gòu)設(shè)計師/技術(shù)經(jīng)理]:技術(shù)帶頭人,需求分析、架構(gòu)設(shè)計、指導(dǎo)開發(fā)、重要功能開發(fā)等。
?開發(fā)工程師(SE):具體模塊的設(shè)計與實現(xiàn)。
?測試工程師(Test Engineer):測試用例編寫、執(zhí)行測試提交BUG列表。
?3.項目開發(fā)流程
?需求分析 -> 系統(tǒng)設(shè)計 -> 開發(fā) -> 測試 -> 實施及試運行 -> 客戶培訓(xùn) -> 維護
?項目開發(fā)流程圖:
?4.系統(tǒng)設(shè)計主要工作內(nèi)容:
?①分析需求、了解環(huán)境及限制等
?②總體設(shè)計、完成子系統(tǒng)劃分,并確定子系統(tǒng)間關(guān)聯(lián)及通信方式
?③對每個子系統(tǒng)進行模塊及子模塊劃分,并確定之間關(guān)聯(lián)
?④每個模塊輸入、處理流程、輸出
?⑤設(shè)計數(shù)據(jù)結(jié)構(gòu)
?⑥設(shè)計用戶界面
?⑦完成《概要設(shè)計說明書》
5.概要設(shè)計說明書(主要內(nèi)容參考《概要設(shè)計說明書主要的內(nèi)容.doc》)
概要設(shè)計的目的就是希望一個從來沒有接觸過的人一看就能從各個方面都對系統(tǒng)的作用,功能,實現(xiàn)方面有一個大概的了解,并為以后的各類詳細設(shè)計文檔提供一個指引和方向。
6.《需求規(guī)格說明書》作用及主要內(nèi)容(可具體參考《LSD-軟件需求規(guī)格說明書.doc》)
作用:
①項目組成員、測試人員、公司審核部門的一個參照標(biāo)準(zhǔn)
②客戶驗收標(biāo)準(zhǔn)
主要內(nèi)容:
①標(biāo)題、編號、版本、作者、時間等信息
②變更記錄
③項目概況、編寫目的、目標(biāo)讀者、系統(tǒng)用戶與環(huán)境等
④系統(tǒng)模塊、總流程圖等
⑤功能性需求
⑥性能性需求
7.模塊設(shè)計
①分析模塊流程
②根據(jù)需求確定輸入、輸出及處理邏輯
③設(shè)計用戶界面
④面向?qū)ο蟮脑O(shè)計方法[UML(統(tǒng)一建模語言),時序圖,狀態(tài)圖,類圖等]
⑤以數(shù)據(jù)為中心的設(shè)計方法(數(shù)據(jù)建模)
8.MVC與分層設(shè)計(具體可網(wǎng)上查閱)
①MVC(Model-View-Controller):MVC是一種架構(gòu)型模式,它本身并不引入新的功能,只是用來指導(dǎo)我們改善應(yīng)用程序的架構(gòu),使得應(yīng)用的模型和視圖相分離,從而達到更好的開發(fā)和維護效率。在MVC模式中,應(yīng)用程序被劃分成模型(Model)、視圖(View)和控制器(Controller)三個部分。其中,模型部分包含了應(yīng)用程序的業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù);視圖部分封裝了應(yīng)用程序的輸出形式(頁面、界面);而控制器部分負責(zé)協(xié)調(diào)模型和視圖,根據(jù)用戶請求來選擇要調(diào)用哪個模型來處理業(yè)務(wù),以及最終由哪個視圖為用戶做出應(yīng)答。MVC模式的這三個部分的職責(zé)非常明確,而且相互分離,每個部分都可以獨立的改變而不影響其他部分,大大提高了應(yīng)用的靈活性和重用性。
②為什么分層:便于重用、維護。
③三層結(jié)構(gòu)及各層次的結(jié)構(gòu):業(yè)務(wù)邏輯層(Service):不要出現(xiàn)直接的數(shù)據(jù)訪問;傳進來一組數(shù)據(jù),根據(jù)傳進來的參數(shù)和業(yè)務(wù)邏輯的要求把業(yè)務(wù)邏輯實現(xiàn),最后把要顯示的數(shù)據(jù)傳遞出去。業(yè)務(wù)邏輯層是重用性最高的一層,是核心。
④這里想說一下Struts2的MVC:推薦一篇博客:Struts2與MVC基礎(chǔ)入門
9.ER/Studio(專業(yè)的數(shù)據(jù)建模工具):
ERStudio:ERStudio是優(yōu)秀的數(shù)據(jù)庫建模軟件,它不僅可以建立表、視圖等模型,還可以建立多表間各種關(guān)系的模型,另外還可以根據(jù)模型生成表到數(shù)據(jù)庫。
使用體會:在這次的學(xué)習(xí)中,使用頻率較多的一個軟件就是ERStudio了。在此之前每次做項目時,因為數(shù)據(jù)量都比較小,基本10張表左右,因此都沒有使用過建模工具,一個初步的分析后就開始直接建表;之前一直會遇到的問題是在開發(fā)中對表結(jié)構(gòu)的修改是比較麻煩的,就算只有10張表左右,比如修改了某張表名后,與其相關(guān)聯(lián)的表都要去修改,比較麻煩;而且很難看出表與表之間的聯(lián)系,容易遺漏東西。而在這種中大型項目中(在這個項目中只做了三個模塊就已經(jīng)有30張表了),如果沒有提前進行一個好的表結(jié)構(gòu)設(shè)計的話,對后面的維護將是災(zāi)難性的。所以如果有一個好的建模工具就可以解決這些問題了。
表關(guān)聯(lián)設(shè)計:如果我們對數(shù)據(jù)庫擁有完全的控制權(quán)限,創(chuàng)建數(shù)據(jù)庫時,可以不用考慮表之間的關(guān)聯(lián),因為數(shù)據(jù)庫維護關(guān)聯(lián)關(guān)系會消耗一定的資源。我們可以通過程序來維護即可。
可以看看下圖使用ERStudio建立的邏輯模型:我們可以通過圖形界面很清晰的了解模塊劃分、表結(jié)構(gòu)、表之間的關(guān)聯(lián)(這里并沒有很嚴謹?shù)脑O(shè)計表之間的關(guān)聯(lián),主要通過程序來維護)等等。我們?nèi)绻枰R時修改一個字段或是關(guān)聯(lián)關(guān)系等,可以很容易的修改。而且最方便的是可以直接將該邏輯模型生成物理模型并導(dǎo)出sql文件,直接導(dǎo)入數(shù)據(jù)庫就可以使用了。ERStudio連上數(shù)據(jù)庫后,還可以把數(shù)據(jù)庫中的表拉到可視化建模界面顯示,表與表之間的聯(lián)系能夠清晰地展現(xiàn)出來。
10.編碼的一些技巧
①可直接使用Spring的字符編碼過濾器來設(shè)置UTF-8格式,雖然以前學(xué)過,但在實際使用時就忘了Spring還有這個功能,每次都是自己建立一個過濾器來設(shè)置字符編碼。
1 <filter> 2 <filter-name>CharacterEncodingFilter</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>UTF-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>CharacterEncodingFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>②寫一個系統(tǒng)初始化類實現(xiàn)ServletContextListener來加載系統(tǒng)初始化需要的數(shù)據(jù)以及啟動一個定時器來定時清除系統(tǒng)日志等功能。系統(tǒng)公用的東西(如系統(tǒng)標(biāo)題)可寫在配置文件里,系統(tǒng)初始化時就加載進來。
③系統(tǒng)用戶表一般會設(shè)置一個用戶狀態(tài),如啟動,停用,刪除等狀態(tài)。一般來說,刪除用戶不會真正刪除用戶信息,而是設(shè)置其狀態(tài)為刪除狀態(tài)。角色也是一樣,會有一個狀態(tài)信息,如果停用了就要禁止該角色下的權(quán)限。
④如果我們對數(shù)據(jù)庫擁有完全的控制權(quán)限,創(chuàng)建數(shù)據(jù)庫時,可以不用考慮表之間的關(guān)聯(lián),因為數(shù)據(jù)庫維護關(guān)聯(lián)關(guān)系會消耗一定的資源。我們可以通過程序來維護即可。
⑤權(quán)限系統(tǒng)獨立出來成一個模塊或項目,以方便以后可以重用。
⑥寫一個BaseAction來放置一些常用的request,resposne等等,其它的action類如果要用到這些資源可以直接繼承BaseAction。
?
⑦利用好struts的標(biāo)簽庫。<%@ taglib uri="/struts-tags" prefix="s"%>
?可以用其來按需求顯示某些數(shù)據(jù)或者模塊。比如:<s:if test=" ">...</s:if> ?<s:elseif test=" ">...</s:elseif>
?以及利用好c標(biāo)簽來做頁面的一些判斷處理。比如:<c:choose><c:when test="${status.first}">...</c:when><c:otherwise>...</c:otherwise></c:choose>
1 <c:url value="${ctx}/mobileBasic_delete.action" var="delUrl"> 2 <c:param name="table" value="basic_config"></c:param> 3 <c:param name="id" value="${config.id}"></c:param> 4 </c:url> 5 <a href="${delUrl}" onclick="return confirm('確定要刪除嗎?');">刪除</a> 6 //這種方式也可以對中文進行編碼⑧測試的時候記得經(jīng)常清空瀏覽器緩存(尤其是js文件更改后),否則某些數(shù)據(jù)一直測試不正常。以及,測試的時候個人覺得最好還是用火狐瀏覽器,用好火狐的firebug能節(jié)省很多時間。
⑨以前一般點擊某些功能簡單的按鈕時,會用js來實現(xiàn)。現(xiàn)在才意識到還可以這樣:
例如使用input按鈕來簡單跳轉(zhuǎn)頁面:<input type="button" class="btn cancel" value="取消" οnclick="location='menu_menuDetail.action?menu.id=${menu.id}'"/>
⑩不要忘了可以自定義標(biāo)簽來處理某些問題,代替某些js代碼以及<%= %>。與jsp頁面整體統(tǒng)一。自定義標(biāo)簽一是可以自定義類繼承SimpleTagSupport,在doTag方法里實現(xiàn)邏輯處理,此種方式需要在xml中配置tag。另一種方式是在靜態(tài)類中寫一個靜態(tài)方法處理邏輯,此種方式需要在xml中配置function,前臺的書寫方式則是:${my:dateFormat(beginDate)}
可參考個人博客:JSP自定義標(biāo)簽/自定義標(biāo)簽打包
以及,自定義注解、自定義攔截器、自定義標(biāo)簽等配合使用能更方便的編程。
?字符串處理時,StringBuilder速度更快,但是線程不安全的。SringBuffer是線程安全的,速度相比較慢。
?在類似于easyui這類框架下,我們點擊菜單按鈕跳轉(zhuǎn)的頁面往往是跳轉(zhuǎn)到一個iframe中,但如果有這么一個業(yè)務(wù)需求:修改密碼/退出系統(tǒng),需要返回到首頁,但如果直接讓struts的result跳轉(zhuǎn)到首頁時,首頁則顯示到iframe中了,我們的需求是整個窗口刷新。這里有三種方法:
⑴js獲取該按鈕,利用ajax來實現(xiàn),在action中處理后,返回時利用window.top.location = “”; 即可。
⑵使用一個臨時頁面,result配置轉(zhuǎn)到該頁面后,立即跳轉(zhuǎn)。
⑶還有一種則是,臨時生成一個腳本代碼跳轉(zhuǎn):這種方式就非常簡單了,以前怎么就沒想到呢,反正都是通過js來跳轉(zhuǎn)。
out.print(“<script type=’text/javascript’>top.location=index.action</script>”);
out.close();
?注銷與退出系統(tǒng)的區(qū)別:注銷系統(tǒng):清除用戶信息,返回首頁;退出系統(tǒng):清除用戶信息,關(guān)閉瀏覽器。
?利用mybatis-generator自動生成javabean,sqlMap,dao等,就像利用HIbernate反向生成一樣。我們使用建模工具建好邏輯模型后,生成物理模型,導(dǎo)出sql文件,再導(dǎo)入數(shù)據(jù)庫,然后利用這個插件就可以自動生成javabean,sqlMap,dao等,極其方便。具體怎么安裝插件和使用,這里給出一個百度鏈接:mybatis generator eclipse插件的安裝
?日期:我們選擇日期如2016-05-03 這個代表的是5月3日0時,即5月2日一整天,所以邏輯上我們?nèi)绻@取5月3日的數(shù)據(jù)時,還需要加上一天的時間。
?使用Navicat查詢創(chuàng)建工具完成復(fù)雜SQL構(gòu)建:
?項目完成后可以將工具類留存。
?
11.遇到的一些小問題
①mybatis聯(lián)合查詢(association)的配置問題及某些細節(jié):查看個人博客:MyBatis關(guān)聯(lián)查詢 (association) 時遇到的某些問題/mybatis映射
②一次偶然的斷網(wǎng)條件下,啟動系統(tǒng)發(fā)現(xiàn)報了如下錯誤:
1 DEBUG - Loaded schema mappings: {http://mybatis.org/schema/mybatis-spring-1.2.xsd=org/mybatis/spring/config/mybatis-spring-1.2.xsd, 2 http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd, 3 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd=org/springframework/web/servlet/config/spring-mvc-3.1.xsd, 4 ....................................網(wǎng)上查了下,原因是斷網(wǎng)后,applicationContext.xml配置文件中指定的xsd文件讀取不到了——也就是說xsd每次都是從網(wǎng)上讀取的?
當(dāng)然這是不怎么可取的,具體解決辦法參考這個博客:Spring如何加載XSD文件。我這里出錯的原因是版本不一致導(dǎo)致的。
③一定要將action配置@Scope(value="prototype"),配置成原型模式的,否則就算你重定向也會有意向不到的問題,會將原來的數(shù)據(jù)帶到新的頁面去。
④MyBatis的<foreach ></foreach>標(biāo)簽:
當(dāng)collection為List<Map<String,Object>>的時候,而且我們要使用map的key和value,如下使用item:
<foreach collection="mapList" item="item" separator=",">
(#{item.key},#{item.value})
</foreach>
當(dāng)遍歷的集合collection為Map<String, Object>時,要使用key和value,如下使用:
<foreach collection="map" index="key" item="value" separator=",">
(#{key},#{roleId},#{value})
</foreach>
⑤登出系統(tǒng)時,要清空session所有信息。request.getSession().invalidate();//注:此處必須使用原始的session,不能使用框架的Map<> session,那只是個映射.
⑥表單設(shè)置為disabled="disabled"時,將無法提交該表單數(shù)據(jù),可以設(shè)置為readonly
<input type="text" readonly="readonly" name="supplier.id" value="${supplier.id}"/>
⑦Jstl標(biāo)簽可以用在js中,但只能在jsp文件的js中,外部js文件不可用。
1 <c:forEach items="${mobileTypeList}" var="mobType"> 2 if("${mobType.id}" == mobileTypeId){ 3 $("#refPrice").html("¥${mobType.buyPrice}"); 4 } 5 </c:forEach>?
12.關(guān)于JSON使用的一些問題
①從服務(wù)端返回的json格式數(shù)據(jù) 鍵/值都必須用雙引號(無論是json文件,還是json數(shù)據(jù)),不要用單引號,否則會出現(xiàn)一些意想不到的問題,像數(shù)據(jù)解析不正確等。
看官網(wǎng)的說明:
正確格式:JSON數(shù)據(jù)格式
?②Spring的json插件:
以前一直都是使用JSONObject,JSONArray來得到j(luò)son格式數(shù)據(jù)。這次發(fā)現(xiàn)還可以直接添加一個json插件,就可以很輕松的返回json數(shù)據(jù)了。
步奏:
⑴添加struts2-json-plugin-2.3.28.jar包
⑵修改配置文件(注意綠色的地方)
1 <package name="dev" namespace="/" extends="json-default"> 2 <action name="menu_*" class="menuAction" method="{1}"> 3 <result name="menuTree" type="json"></result> 4 </action> 5 </package>⑶Action中將要轉(zhuǎn)化成json的數(shù)據(jù)放在全局中(成員變量)。不必在方法內(nèi)像JSONObject那樣轉(zhuǎn)成字符串再輸出。
//使用JSONObject轉(zhuǎn)換數(shù)據(jù) JSONObject jsonObject = new JSONObject(); //將data轉(zhuǎn)換為json格式數(shù)據(jù) String result = jsonObject.fromObject(data).toString(); //返回 response.write(result);⑷在前臺獲取的時候,注意需要從data里面取出來,因為此時的data中可能包含多個數(shù)據(jù):
function(data){
?? var json= [data.key];
}
⑸插件原理:在返回到前臺時,框架會自動將有g(shù)et方法的成員變量轉(zhuǎn)換成json格式數(shù)據(jù)返回(所以在action中不要將具體邏輯方法名帶get,還有Action中的service成員也不要設(shè)置get方法,否則極容易出錯。如果非要帶get,可以在這個方法上加注解;@JSON(serialize=false),使其不要序列化,就不會轉(zhuǎn)成json了)。
這種插件方式比使用JSONObject雖然更方便,但不容易控制,JSONObject可以控制具體輸出的類容。
1 JSONObject jsonObject = new JSONObject(); 2 //json配置 3 JsonConfig config = new JsonConfig(); 4 //設(shè)置需要過濾掉的字段 5 config.setExcludes(new String[]{"subMenuList"}); 6 //得到j(luò)son數(shù)據(jù) 7 String result = jsonObject.fromObject(menuTree, config).toString();而且使用JsonConfig可以注冊轉(zhuǎn)換器,比如將Date對象轉(zhuǎn)換成字符串。
注冊轉(zhuǎn)換器:config.registerDefaultValueProcessor(target, defaultValueProcessor);
13.switch…case…
變量的使用:
?
switch(此處數(shù)據(jù)類型):switch后面的括號里面只能放int(byte,short,char)類型和String類型的數(shù)據(jù)
case后的數(shù)據(jù)類型不能為Integer:
?
14.MyBatis、iBatis、Hibernate:具體區(qū)別百度
ibatis:半自動ORM框架,需手動寫sql語句;開發(fā)效率相對于hibernate較低,但是更靈活,適應(yīng)性更廣泛(在企業(yè)開發(fā)中,我們可能不能完全去控制數(shù)據(jù)庫結(jié)構(gòu) );
mybatis:MyBatis 最強大的特性之一就是它的動態(tài)語句功能。其前身就是ibatis。
Hibernate:由hibernate自動生成sql語句;hibernate則需要在符合一定規(guī)范(如數(shù)據(jù)庫結(jié)構(gòu)必須規(guī)范)下才能發(fā)揮它的最大效用。
15.mybatis緩存:默認情況下是沒有開啟緩存的,除了局部的 session 緩存(一級緩存),可以增強變現(xiàn)而且處理循環(huán)依賴也是必須的。要開啟二級緩存,需要在你的 SQL 映射文件中添加一行:<cache/>
?
?
四、項目相關(guān)資料
項目打包文件:手機進銷存系統(tǒng)
視頻分享:北風(fēng)網(wǎng)-手機進銷存系統(tǒng)?
注意所有視頻及資料僅供學(xué)習(xí)使用!!!
然后,說一下此時此刻的感受,通過自學(xué)學(xué)習(xí)的東西雖然有點多,但也比較雜,不能形成一套系統(tǒng)性的知識鏈;而且,越是到后面就越不想再學(xué)下去,主要是現(xiàn)在所學(xué)的東西沒能有地方使用,有點類似于一身武藝沒有用武之地的感覺。以前一直礙于學(xué)校的課程和其它的瑣事沒有找工作,雖然有做過一些課程上的小項目,但都不能滿足我。大三馬上就結(jié)束了,所以還是盡快找個工作,也只有在工作中才能用我所學(xué),也能學(xué)到更多新東西,學(xué)習(xí)才更有動力、更有激情!
?
轉(zhuǎn)載于:https://www.cnblogs.com/chiangchou/p/project-mobilescm.html
總結(jié)
以上是生活随笔為你收集整理的手机进销存系统/供应链管理系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程的单元测试工具 - GroboUt
- 下一篇: 《信息安全系统设计基础》 实验五