一步步教你整合SSM框架(Spring MVC+Spring+MyBatis)詳細教程
SSM(Spring+SpringMVC+Mybatis)是目前較為主流的企業級架構方案,不知道大家有沒有留意,在我們看招聘資訊的時候,經常會看到這一點,需要具備SSH框架的技能;而且在大部分教學課堂中,也會把SSH作為最核心的教學內容。
但是,我們在實際應用中發現,SpringMVC可以完全替代Struts,配合註解的方式,程式設計非常快捷,而且通過restful風格定義url,讓地址看起來非常優雅。
另外,MyBatis也可以替換Hibernate,正因為MyBatis的半自動特點,我們程式猿可以完全掌控SQL,這會讓有資料庫經驗的程式猿能開發出高效率的SQL語句,而且XML配置管理起來也非常方便。
好了,如果你也認同我的看法,那麼下面我們一起來做整合吧!話不多說,來一起看看詳細的介紹:
在寫程式碼之前我們先了解一下這三個框架分別是幹什麼的?
相信大以前也看過不少這些概念,我這就用大白話來講,如果之前有了解過可以跳過這一大段,直接看程式碼!
- SpringMVC:它用於web層,相當於controller(等價於傳統的servlet和struts的action),用來處理使用者請求。舉個例子,使用者在位址列輸入http://網站域名/login,那麼springmvc就會攔截到這個請求,並且呼叫controller層中相應的方法,(中間可能包含驗證使用者名稱和密碼的業務邏輯,以及查詢資料庫操作,但這些都不是springmvc的職責),最終把結果返回給使用者,並且返回相應的頁面(當然也可以只反饋josn/xml等格式資料)。springmvc就是做前面和後面過程的活,與使用者打交道!!
- Spring:太強大了,以至於我無法用一個詞或一句話來概括它。但與我們平時開發接觸最多的估計就是IOC容器,它可以裝載bean(也就是我們java中的類,當然也包括service dao裡面的),有了這個機制,我們就不用在每次使用這個類的時候為它初始化,很少看到關鍵字new。另外spring的aop,事務管理等等都是我們經常用到的。
- MyBatis:如果你問我它跟鼎鼎大名的Hibernate有什麼區別?我只想說,他更符合我的需求。第一,它能自由控制sql,這會讓有資料庫經驗的人(當然不是說我啦~捂臉~)編寫的程式碼能搞提升資料庫訪問的效率。第二,它可以使用xml的方式來組織管理我們的sql,因為一般程式出錯很多情況下是sql出錯,別人接手程式碼後能快速找到出錯地方,甚至可以優化原來寫的sql。
SSM框架整合配置
好了,前面bb那麼多,下面我們真正開始敲程式碼了~
首先我們開啟IED,我這裡用的是eclipse(你們應該也是用的這個,對嗎?),建立一個動態web專案,建立好相應的目錄結構(重點!)
(打了馬賽克是因為這裡還用不到,你們不要那麼汙好不好?)
我說一下每個目錄都有什麼用吧(第一次畫表格,我發現markdown的表格語法很不友好呀~)
這個目錄結構同時也遵循maven的目錄規範~
檔名 | 作用 |
---|---|
src | 根目錄,沒什麼好說的,下面有main和test。 |
main | 主要目錄,可以放java程式碼和一些資原始檔。 |
java | 存放我們的java程式碼,這個資料夾要使用Build Path -> Use as Source Folder,這樣看包結構會方便很多,新建的包就相當於在這裡新建資料夾咯。 |
resources | 存放資原始檔,譬如各種的spring,mybatis,log配置檔案。 |
mapper | 存放dao中每個方法對應的sql,在這裡配置,無需寫daoImpl。 |
spring | 這裡當然是存放spring相關的配置檔案,有dao service web三層。 |
sql | 其實這個可以沒有,但是為了專案完整性還是加上吧。 |
webapp | 這個貌似是最熟悉的目錄了,用來存放我們前端的靜態資源,如jsp js css。 |
resources | 這裡的資源是指專案的靜態資源,如js css images等。 |
WEB-INF | 很重要的一個目錄,外部瀏覽器無法訪問,只有羨慕內部才能訪問,可以把jsp放在這裡,另外就是web.xml了。你可能有疑問了,為什麼上面java中的resources裡面的配置檔案不妨在這裡,那麼是不是會被外部竊取到?你想太多了,部署時候基本上只有webapp裡的會直接輸出到根目錄,其他都會放入WEB-INF裡面,專案內部依然可以使用classpath:XXX來訪問,好像IDE裡可以設定部署輸出目錄,這裡扯遠了~ |
test | 這裡是測試分支。 |
java | 測試java程式碼,應遵循包名相同的原則,這個資料夾同樣要使用Build Path -> Use as Source Folder,這樣看包結構會方便很多。 |
resources 沒什麼好說的,好像也很少用到,但這個是maven的規範。
我先新建好幾個必要的包,併為大家講解一下每個包的作用,順便理清一下後臺的思路~
包名 | 名稱 | 作用 |
---|---|---|
dao | 資料訪問層(介面) | 與資料打交道,可以是資料庫操作,也可以是檔案讀寫操作,甚至是redis快取操作,總之與資料操作有關的都放在這裡,也有人叫做dal或者資料持久層都差不多意思。為什麼沒有daoImpl,因為我們用的是mybatis,所以可以直接在配置檔案中實現介面的每個方法。 |
entity | 實體類 | 一般與資料庫的表相對應,封裝dao層取出來的資料為一個物件,也就是我們常說的pojo,一般只在dao層與service層之間傳輸。 |
dto | 資料傳輸層 | 剛學框架的人可能不明白這個有什麼用,其實就是用於service層與web層之間傳輸,為什麼不直接用entity(pojo)?其實在實際開發中發現,很多時間一個entity並不能滿足我們的業務需求,可能呈現給使用者的資訊十分之多,這時候就有了dto,也相當於vo,記住一定不要把這個混雜在entity裡面,答應我好嗎? |
service | 業務邏輯(介面) | 寫我們的業務邏輯,也有人叫bll,在設計業務介面時候應該站在“使用者”的角度。額,不要問我為什麼這裡沒顯示!IDE調皮我也拿它沒辦法~ |
serviceImpl | 業務邏輯(實現) | 實現我們業務介面,一般事務控制是寫在這裡,沒什麼好說的。 |
web | 控制器 | springmvc就是在這裡發揮作用的,一般人叫做controller控制器,相當於struts中的action。 |
還有最後一步基礎工作,匯入我們相應的jar包,我使用的是maven來管理我們的jar,所以只需要在poom.xml中加入相應的依賴就好了,如果不使用maven的可以自己去官網下載相應的jar,放到專案WEB-INF/lib目錄下。關於maven的學習大家可以看慕課網的視訊教程,這裡就不展開了。我把專案用到的jar都寫在下面,版本都不是最新的,大家有經驗的話可以自己調整版本號。另外,所有jar都會與專案一起打包放到我的github上,喜歡的給個star吧~
poom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |
|
下面真的要開始進行編碼工作了,堅持到這裡辛苦大家了~
第一步:我們先在spring資料夾裡新建spring-dao.xml檔案,因為spring的配置太多,我們這裡分三層,分別是dao service web。
1、讀入資料庫連線相關引數(可選)
2、配置資料連線池
配置連線屬性,可以不讀配置項檔案直接在這裡寫死
配置c3p0,只配了幾個常用的
3、配置SqlSessionFactory物件(mybatis)
4、掃描dao層介面,動態實現dao介面,也就是說不需要daoImpl,sql和引數都寫在xml檔案上
spring-dao.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
|
因為資料庫配置相關引數是讀取配置檔案,所以在resources資料夾裡新建一個jdbc.properties檔案,存放我們4個最常見的資料庫連線屬性,這是我本地的,大家記得修改呀~還有喜歡傳到github上“大頭蝦們”記得刪掉密碼,不然別人就很容易得到你伺服器的資料庫配置資訊,然後幹一些羞羞的事情,你懂的!!
jdbc.properties
友情提示:配置檔案中的jdbc.username
,如果寫成username,可能會與系統環境中的username變數衝突,所以到時候真正連線資料庫的時候,使用者名稱就被替換成系統中的使用者名稱(有得可能是administrator),那肯定是連線不成功的,這裡有個小坑,我被坑了一晚上!!
因為這裡用到了mybatis,所以需要配置mybatis核心檔案,在recources資料夾裡新建mybatis-config.xml檔案。
- 使用自增主鍵
- 使用列別名
- 開啟駝峰命名轉換 create_time -> createTime
mybatis-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
第二步:剛弄好dao層,接下來到service層了。在spring資料夾裡新建spring-service.xml檔案。
- 掃描service包所有註解 @Service
- 配置事務管理器,把事務管理交由spring來完成
- 配置基於註解的宣告式事務,可以直接在方法上@Transaction
spring-service.xml
第三步:配置web層,在spring資料夾裡新建spring-web.xml檔案。
- 開啟SpringMVC註解模式,可以使用@RequestMapping,@PathVariable,@ResponseBody等
- 對靜態資源處理,如js,css,jpg等
- 配置jsp 顯示ViewResolver,例如在controller中某個方法返回一個string型別的”login”,實際上會返回”/WEB-INF/login.jsp”
- 掃描web層 @Controller
spring-web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
|
第四步:最後就是修改web.xml檔案了,它在webapp的WEB-INF下。
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
我們在專案中經常會使用到日誌,所以這裡還有配置日誌xml,在resources資料夾裡新建logback.xml檔案,所給出的日誌輸出格式也是最基本的控制檯s撥出,大家有興趣檢視logback官方文件。
logback.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
到目前為止,我們一共寫了7個配置檔案,我們一起來看下最終的配置檔案結構圖。
SSM框架應用例項(圖書管理系統)
一開始想就這樣結束教程,但是發現其實很多人都還不會把這個SSM框架用起來,特別是mybatis部分。那我現在就以最常見的“圖書管理系統”中【查詢圖書】和【預約圖書】業務來做一個demo吧!
首先新建資料庫名為ssm,再建立兩張表:圖書表book和預約圖書表appointment,並且為book表初始化一些資料,sql如下。
schema.sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
在entity包中新增兩個對應的實體,圖書實體Book.java和預約圖書實體Appointment.java。
Book.java
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Appointment.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
在dao包新建介面BookDao.java和Appointment.java
BookDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
AppointmentDao.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
提示:這裡為什麼要給方法的引數新增@Param註解呢?是因為該方法有兩個或以上的引數,一定要加,不然mybatis識別不了。上面的BookDao介面的queryById方法和reduceNumber方法只有一個引數book_id,所以可以不用加 @Param註解,當然加了也無所謂~
注意:這裡不需要實現dao介面不用編寫daoImpl, mybatis會給我們動態實現,但是我們需要編寫相應的mapper。
在mapper目錄裡新建兩個檔案BookDao.xml和AppointmentDao.xml,分別對應上面兩個dao介面,程式碼如下。
BookDao.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
AppointmentDao.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
mapper總結:namespace是該xml對應的介面全名,select和update中的id對應方法名,resultType是返回值型別,parameterType是引數型別(這個其實可選),最後#{...}中填寫的是方法的引數,看懂了是不是很簡單!!我也這麼覺得~ 還有一個小技巧要交給大家,就是在返回Appointment物件包含了一個屬性名為book的Book物件,那麼可以使用"book.屬性名"的方式來取值,看上面queryByKeyWithBook方法的sql。
dao層寫完了,接下來test對應的package寫我們測試方法吧。
因為我們之後會寫很多測試方法,在測試前需要讓程式讀入spring-dao和mybatis等配置檔案,所以我這裡就抽離出來一個BaseTest類,只要是測試方法就繼承它,這樣那些繁瑣的重複的程式碼就不用寫那麼多了~
BaseTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
因為spring-service在service層的測試中會時候到,這裡也一起引入算了!
新建BookDaoTest.java和AppointmentDaoTest.java兩個dao測試檔案。
BookDaoTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
BookDaoTest測試結果
testQueryById
testQueryAll
testReduceNumber
AppointmentDaoTest.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
|