与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和视图管理, MyBatis作为数据对象持久化引擎。这样搭配的优点是:轻量、自由度高、Spring与Spring MVC契合度更好。通过一个商品管理示例完成SSM框架的集成,可以将前面学习过的一些内容整合起来。
1.客户端发送请求到DispacherServlet(分发器)
2.由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
3.Controller调用业务逻辑处理后,返回ModelAndView
4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
5.视图负责将结果显示到客户端
1.Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器架构,IOC容器包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的。
2.IOC思想最核心的地方在于,资源不由使用资源的双方管理,而由不使用资源的第三方管理,这可以带来很多好处。
第一,资源集中管理,实现资源的可配置和易管理。
第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。
3.容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
1.MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录。
2.MyBatis的操作都是围绕一个sqlSessionFactory实例展开的。MyBatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
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');
结果:
common模块:通用模块,不依赖其它任何模块,主要有utils、可以在多个不同项目中得胜的内容
entitie模块:POJO、VO、DTO
dao模块:数据持久化,访问数据库,这里使用Mybatis
service模块:业务模块,处理业务逻辑
webui模块:B/S结构的表示层,主要用于在浏览器中显示数据,提供用户接口
创建父模块,不使用骨架的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(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。
其中有一些属性及其getter、setter方法的类,没有业务逻辑,有时可以作为VO(value-object)或DTO(Data Transfer Object)来使用。不允许有业务方法,也不能携带connection之类的方法。
JavaBean是Java语言写成的可重用组件。JavaBean则比 POJO复杂很多, Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。EJB则是Enterprise JavaBean,是JavaEE的一部分,定义了一个用于开发基于组件的企业多重应用程序标准。
实体bean,一般是用于ORM对象关系映射,一个实体映射成一张表,一般无业务逻辑代码。
负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个EntityBean对象相当于创建一条记录,删除一个EntityBean对象会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。
业务对象模型(也叫领域模型 domain model)是描述业务用例实现的对象模型。又称概念模型、领域对象模型、分析对象模型。领域模型中的实体类分为四种类型:VO、DTO、DO、PO
VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来。
DTO(Data Transfer Object):数据传输对象,这个概念来源于J2EE的设计模式,原来的目的是为了EJB的分布式应用提供粗粒度的数据实体,以减少分布式调用的次数,从而提高分布式调用的性能和降低网络负载,但在这里,我泛指用于展示层与服务层之间的数据传输对象。
DO(Domain Object):领域对象,就是从现实世界中抽象出来的有形或无形的业务实体。
PO(PersistentObject):持久化对象,它跟持久层(通常是关系型数据库)的数据结构形成一一对应的映射关系,如果持久层是关系型数据库,那么,数据表中的每个字段(或若干个)就对应PO的一个(或若干个)属性。
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通用模块主要是为项目中其它模块提供辅助功能,如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> <#gth#项目内模块--> <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> <#gth#通用部分--> <log4j.version>2.6.1</log4j.version> <junit.version>4.10</junit.version> <#gth#Spring--> <spring.version>4.3.0.RELEASE</spring.version> <aspectjweaver.version>1.8.9</aspectjweaver.version> <cglib.version>3.2.4</cglib.version> <#gth#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> <#gth#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> <#gth#项目内的依赖--> <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> <#gth#common模块--> <#gth#jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency&am
参与评论
手机查看
返回顶部