一、SSM概要 與SSH(Struts/Spring/Hibernate/)一樣,Spring+SpringMVC+MyBatis也有一個簡稱SSM,Spring實現業務對象管理,Spring MVC負責請求的轉發和視圖管理, MyBatis作為數據對象持久化引擎。這樣搭配的優點是:輕量、自由度高、 ...
一、SSM概要
與SSH(Struts/Spring/Hibernate/)一樣,Spring+SpringMVC+MyBatis也有一個簡稱SSM,Spring實現業務對象管理,Spring MVC負責請求的轉發和視圖管理, MyBatis作為數據對象持久化引擎。這樣搭配的優點是:輕量、自由度高、Spring與Spring MVC契合度更好。通過一個商品管理示例完成SSM框架的集成,可以將前面學習過的一些內容整合起來。
1.1、SpringMVC
1.客戶端發送請求到DispacherServlet(分發器)
2.由DispacherServlet控制器查詢HanderMapping,找到處理請求的Controller
3.Controller調用業務邏輯處理後,返回ModelAndView
4.DispacherSerclet查詢視圖解析器,找到ModelAndView指定的視圖
5.視圖負責將結果顯示到客戶端
1.2、Spring
1.Spring是一個輕量級的控制反轉(IOC)和麵向切麵(AOP)的容器架構,IOC容器包含並管理應用對象的配置和生命周期,你可以配置你的每個bean如何被創建,也可以配置每個bean是只有一個實例,還是每次需要時都生成一個新的實例,以及它們是如何相互關聯的。
2.IOC思想最核心的地方在於,資源不由使用資源的雙方管理,而由不使用資源的第三方管理,這可以帶來很多好處。
第一,資源集中管理,實現資源的可配置和易管理。
第二,降低了使用資源雙方的依賴程度,也就是我們說的耦合度。
3.容器提供了AOP技術,利用它很容易實現如許可權攔截、運行期監控等功能。
1.3、MyBatis
1.MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎所有的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將介面和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成資料庫中的記錄。
2.MyBatis的操作都是圍繞一個sqlSessionFactory實例展開的。MyBatis通過配置文件關聯到各實體類的Mapper文件,Mapper文件中配置了每個類對資料庫所需進行的sql語句映射。在每次與資料庫交互時,通過sqlSessionFactory拿到一個sqlSession,再執行sql命令。
1.4、Maven多模塊
JavaEE項目開發中為了便於後期的維護,一般會進行分層開發,分層之後,各個層之間的職責會比較明確,後期維護起來也相對比較容易。
《一個小時學會Maven》可以獲得更多幫助
二、資料庫
打開MySQL資料庫,創建一個表,這裡以goods表為例,一個用於存放商品的表,共4個欄位id表示編號,name表示商品名稱,picture表示圖片,price表示價格。SQL腳本如下:
SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for `goods` -- ---------------------------- DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(200) NOT NULL, `price` decimal(10,2) DEFAULT '0.00', `picture` varchar(100) DEFAULT 'default.jpg', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of goods -- ---------------------------- INSERT INTO `goods` VALUES ('1', 'G7 中原G7三合一濃醇咖啡固體飲料1200', '66.50', '1.jpg'); INSERT INTO `goods` VALUES ('2', '百草味東北松子200gx2袋 堅果炒貨零', '42.90', '2.jpg'); INSERT INTO `goods` VALUES ('3', '奈津香 桂圓乾500gx2袋莆田特產5A桂', '39.90', '3.jpg'); INSERT INTO `goods` VALUES ('4', '益達尊享護齒裝草本40粒+冰檸40粒+西', '25.90', '4.jpg'); INSERT INTO `goods` VALUES ('5', '猴坑茶業2016新茶原產地手工太平猴魁特', '168.00', '5.jpg'); INSERT INTO `goods` VALUES ('6', '嘻魷記 休閑零食 麻辣香辣奶香炭燒 5種', '39.80', '6.jpg'); INSERT INTO `goods` VALUES ('7', '榮業鴻福五分瘦臘腸 香港土特產香腸腊味', '126.80', '7.jpg'); INSERT INTO `goods` VALUES ('8', '蓓琳娜(BELLINA)3L PDO特級初榨橄欖油', '178.00', '8.jpg'); INSERT INTO `goods` VALUES ('10', '榮業鴻福五分瘦臘腸 香港土特產香腸腊味', '30.60', '9.jpg');
結果:
三、創建多模塊項目
3.1、各模塊的功能
common模塊:通用模塊,不依賴其它任何模塊,主要有utils、可以在多個不同項目中得勝的內容
entitie模塊:POJO、VO、DTO
dao模塊:數據持久化,訪問資料庫,這裡使用Mybatis
service模塊:業務模塊,處理業務邏輯
webui模塊:B/S結構的表示層,主要用於在瀏覽器中顯示數據,提供用戶介面
3.2、創建項目結構
創建父模塊,不使用骨架的maven普通項目
創建子模塊commons
創建不使用骨架的maven普通項目
entity、dao、service模塊創建方法與命名規範同上。
webui需要創建一個使用webapp骨架的maven項目:
完成的項目結構如下:
《一個小時學會Maven》可以獲得更多幫助
四、添加各模塊間的依賴
子模塊預設是繼承父模塊的,這裡全部使用按需依賴。
dao模塊的pom:
<dependencies> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-common</artifactId> </dependency> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-entity</artifactId> </dependency> </dependencies>
service的pom:
<dependencies> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-dao</artifactId> </dependency> </dependencies>
因為依賴具有傳遞性,在service中可以間接的依賴到entity與common
webui的pom:
<dependencies> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-service</artifactId> </dependency> </dependencies>
依賴完成的結果:
五、完成POJO實體模塊
完成這一層之前先明確一下幾個容易混淆的概念:
5.1、POJO
POJO(Plain Ordinary Java Object)簡單的Java對象,實際就是普通JavaBeans,是為了避免和EJB混淆所創造的簡稱。
其中有一些屬性及其getter、setter方法的類,沒有業務邏輯,有時可以作為VO(value-object)或DTO(Data Transfer Object)來使用。不允許有業務方法,也不能攜帶connection之類的方法。
5.2、JavaBean
JavaBean是Java語言寫成的可重用組件。JavaBean則比 POJO複雜很多, Java Bean 是可復用的組件,對 Java Bean 並沒有嚴格的規範,理論上講,任何一個 Java 類都可以是一個 Bean 。EJB則是Enterprise JavaBean,是JavaEE的一部分,定義了一個用於開發基於組件的企業多重應用程式標準。
5.3、Entity
實體bean,一般是用於ORM對象關係映射,一個實體映射成一張表,一般無業務邏輯代碼。
負責將資料庫中的表記錄映射為記憶體中的Entity對象,事實上,創建一個EntityBean對象相當於創建一條記錄,刪除一個EntityBean對象會同時從資料庫中刪除對應記錄,修改一個Entity Bean時,容器會自動將Entity Bean的狀態和資料庫同步。
5.4、Domain Model
業務對象模型(也叫領域模型 domain model)是描述業務用例實現的對象模型。又稱概念模型、領域對象模型、分析對象模型。領域模型中的實體類分為四種類型:VO、DTO、DO、PO
VO(View Object):視圖對象,用於展示層,它的作用是把某個指定頁面(或組件)的所有數據封裝起來。
DTO(Data Transfer Object):數據傳輸對象,這個概念來源於J2EE的設計模式,原來的目的是為了EJB的分散式應用提供粗粒度的數據實體,以減少分散式調用的次數,從而提高分散式調用的性能和降低網路負載,但在這裡,我泛指用於展示層與服務層之間的數據傳輸對象。
DO(Domain Object):領域對象,就是從現實世界中抽象出來的有形或無形的業務實體。
PO(PersistentObject):持久化對象,它跟持久層(通常是關係型資料庫)的數據結構形成一一對應的映射關係,如果持久層是關係型資料庫,那麼,數據表中的每個欄位(或若幹個)就對應PO的一個(或若幹個)屬性。
5.5、實體模塊
Goods商品POJO對象如下:
package com.zhangguo.ssm01.entity; import java.io.Serializable; import java.math.BigDecimal; /** * 商品POJO */ public class Goods implements Serializable { private int id; private String name; private BigDecimal price; private String picture; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getPicture() { return picture; } public void setPicture(String picture) { this.picture = picture; } @Override public String toString() { return "Goods{" + "id=" + id + ", name='" + name + '\'' + ", price=" + price + ", picture='" + picture + '\'' + '}'; } }
六、完成Commons通用工具模塊
commons通用模塊主要是為項目中其它模塊提供輔助功能,如utils工具類等內容:
依賴:
父模塊的pom:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zhangguo.ssm01</groupId> <artifactId>SSM01</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>Ssm01-common</module> <module>Ssm01-entity</module> <module>Ssm01-dao</module> <module>Ssm01-service</module> <module>Ssm01-webui</module> </modules> <properties> <!--項目內模塊--> <Ssm01-common.version>1.0-SNAPSHOT</Ssm01-common.version> <Ssm01-entity.version>1.0-SNAPSHOT</Ssm01-entity.version> <Ssm01-dao.version>1.0-SNAPSHOT</Ssm01-dao.version> <Ssm01-service.version>1.0-SNAPSHOT</Ssm01-service.version> <Ssm01-webui.version>1.0-SNAPSHOT</Ssm01-webui.version> <jackson.version>2.7.4</jackson.version> <commons-lang3.version>3.4</commons-lang3.version> <!--通用部分--> <log4j.version>2.6.1</log4j.version> <junit.version>4.10</junit.version> <!--Spring--> <spring.version>4.3.0.RELEASE</spring.version> <aspectjweaver.version>1.8.9</aspectjweaver.version> <cglib.version>3.2.4</cglib.version> <!--mybatis--> <mybatis-spring.version>1.3.0</mybatis-spring.version> <mysql-connector-java.version>5.1.38</mysql-connector-java.version> <mybatis.version>3.4.1</mybatis.version> <c3p0.version>0.9.1.2</c3p0.version> <!--spring mvc--> <jstl.version>1.2</jstl.version> <servlet-api.version>3.0.1</servlet-api.version> <jsp-api.version>2.1</jsp-api.version> <hibernate.version>5.2.2.Final</hibernate.version> <commons-io.version>2.4</commons-io.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> <freemarker.version>2.3.23</freemarker.version> </properties> <dependencyManagement> <dependencies> <!--項目內的依賴--> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-common</artifactId> <version>${Ssm01-common.version}</version> </dependency> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-entity</artifactId> <version>${Ssm01-entity.version}</version> </dependency> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-dao</artifactId> <version>${Ssm01-dao.version}</version> </dependency> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-service</artifactId> <version>${Ssm01-service.version}</version> </dependency> <dependency> <groupId>com.zhangguo.ssm01</groupId> <artifactId>Ssm01-webui</artifactId> <version>${Ssm01-webui.version}</version> </dependency> <!--common模塊--> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency> <!--apache-commons--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>${commons-lang3.version}</version> </dependency> <!--log4j日誌包 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>${log4j.version}</version> </dependency> <!-- JUnit單元測試工具 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <!--Spring框架核心庫 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <!-- aspectJ AOP 織入器 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectjweaver.version}</version> </dependency> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>${cglib.version}</version> </dependency> <!--mybatis-spring適配器 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>${mybatis-spring.version}</version> </dependency> <!--Spring java資料庫訪問包,在本例中主要用於提供數據源 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${spring.version}</version> </dependency> <!--mysql資料庫驅動 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector-java.version}</version> </dependency> <!-- mybatis ORM框架 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>${mybatis.version}</version> </dependency> <!--c3p0 連接池 --> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>${c3p0.version}</version> </dependency> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <!-- JSTL --> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <