Maven高级

教学目标

  • Maven基础回顾

  • jar包冲突(解决方案:直接排除,直接依赖)

  • 工程分解(一个父工程,四(n)个子工程) —重点

操作系统要关闭自动更新

1. Maven基础回顾

【目标】

回顾Maven基础课程

【路径】

1:Maven好处

2:安装配置Maven

3:三种仓库

4:常见命令

5:坐标的书写规范

6:如何添加坐标

7:依赖范围

【讲解】

1.1. 回顾[理解]

什么是Maven?

Maven高级讲义 - 图2

1.1.1. Maven好处

  1. 节省磁盘空间

  2. 可以一键构建

Maven高级讲义 - 图3

  1. 可以跨平台

  2. 应用在大型项目时可以提高开发效率(jar包管理,maven的工程分解,可分模块开发)

1.1.2. 安装配置 maven

注意: 3.5+版本需要 jdk1.8+以上的支持

MAVEN_HOME

JDK

JAVA_HOME =>1.8 64位

path:%JAVA_HOME%/bin;

1.1.3. 三种仓库

  1. 本地仓库 conf/settings.xml localRepository
    idea 本地仓库跟settings.xml配置要一致

  2. 远程仓库(私服), 公司内部 工作中:找私服ip和端口

  3. 中央仓库

1.1.4. 常见的命令

  1. Compile

  2. Test

  3. Package(jar,war)

  4. Install(安装到本地仓库)

  5. Deploy(部署到远程仓库(私服))

  6. Clean(target下生成的文件)

1.1.5. 坐标的书写规范

  1. groupId 公司或组织域名的倒序

  2. artifactId 项目名或模块名

  3. version 版本号

Maven高级讲义 - 图4

1.1.6. 如何添加坐标

1.在本地仓库中搜索

2.互联网上搜,推荐网址 http://www.mvnrepository.com/

或百度 httpclient3.1 maven

Maven高级讲义 - 图5

1.1.7. 依赖范围

属性:

  1. Compile(默认)

  2. Test

  3. Provided

  4. Runtime

Maven高级讲义 - 图6

例如:

Maven高级讲义 - 图7

【小结】

1:Maven好处(了解) 依赖的管理,一键构建

2:安装配置Maven(熟练)

3:三种仓库(本地仓库(阿里镜像),中央仓库(远程仓库),私服(代理仓库))

4:常见命令(clean compile test package install deploy)

5:坐标的书写规范(groupId artifactId version)

6:如何添加坐标(http://www.mvnrepository.com/)

7:依赖范围 compile test provided runtime

8 : 私服的配置(settings.xml配置私服 工作中大概率要配置的)

2. Maven中jar包冲突问题

【目标】

使用maven依赖导入jar包,会不会出现导入相同的jar包,且版本不一致呢?

直接引入a.jar 依赖 b-1.0.jar

直接引入c.jar 依赖 b-2.0.jar

【路径】

1:演示jar包冲突问题:遵循第一声明者优先原则

2:解决jar包冲突问题,路径近者优先

3:解决jar包冲突问题,直接排除法

【讲解】

创建一个jar包工程,流程如下图:

Maven高级讲义 - 图8

2.1. 第一声明优先原则

  1. 哪个jar包在靠上的位置,这个jar包就是先声明的,先声明的jar包下的依赖包,可以优先引入项目中。
  2. 我们在pom.xml中引入如下坐标,分别是spring中不同的版本。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>maven_day01_demo</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>jar</packaging>
  10. <!--导入相关依赖包-->
  11. <dependencies>
  12. <!--引入spring-context,它所以来的包都会导入进来-->
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-context</artifactId>
  16. <version>5.0.2.RELEASE</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-beans</artifactId>
  21. <version>4.2.4.RELEASE</version>
  22. </dependency>
  23. </dependencies>
  24. </project>

我们在控制面板的maven面板,点击查看依赖关系按钮,看到了包和包之间的依赖关系存在冲突,都使用了spring-core包,关系图如下:

Maven高级讲义 - 图9

我们再来看看他们依赖包的导入,发现导入的包却没有问题,包使用的都是5.0.2的版本。

Maven高级讲义 - 图10

我们把上面2个包的顺序调换后就变成了低版本的依赖导入。

Maven高级讲义 - 图11

2.2. 路径近者优先原则

直接依赖比传递依赖路径近,你那么最终进入项目的jar包会是路径近的直接依赖包。

直接依赖:项目中直接导入的jar包就是项目的直接依赖包。

传递依赖(间接依赖):项目中没有直接导入的jar包,可以通过中直接依赖包传递到项目中去。

修改jar包,直接引入依赖spring-core

  1. <!--导入相关依赖包-->
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-beans</artifactId>
  6. <version>4.2.4.RELEASE</version>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.springframework</groupId>
  10. <artifactId>spring-context</artifactId>
  11. <version>5.0.2.RELEASE</version>
  12. </dependency>
  13. <!--引入直接依赖-->
  14. <dependency>
  15. <groupId>org.springframework</groupId>
  16. <artifactId>spring-core</artifactId>
  17. <version>4.2.8.RELEASE</version>
  18. </dependency>
  19. </dependencies>

此时优先引入的是直接依赖的引用

Maven高级讲义 - 图12

2.3. 直接排除法【重点】

问题:整合项目需要用到5的版本,引入4的版本,会不会出现异常(类没有找到,方法没有找到)

解决方案:?

当我们需要排除某个jar包的依赖时,在配置exclusions标签的时候,内部可以不写版本号。pom.xml依赖如下:

  1. <!--导入相关依赖包-->
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework</groupId>
  5. <artifactId>spring-beans</artifactId>
  6. <version>4.2.4.RELEASE</version>
  7. <!--直接排除-->
  8. <exclusions>
  9. <exclusion>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-core</artifactId>
  12. </exclusion>
  13. </exclusions>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework</groupId>
  17. <artifactId>spring-context</artifactId>
  18. <version>5.0.2.RELEASE</version>
  19. </dependency>
  20. </dependencies>

快捷操作:

Maven高级讲义 - 图13

依赖导入的jar包如下:

没有添加exclusion之前

Maven高级讲义 - 图14

添加exclusion之后,因为排除了4.2.4的版本spring-core的jar包

Maven高级讲义 - 图15

【小结】

真实项目中,出现1个项目存在多个同种jar包的时候,需要我们进行解决maven的jar包冲突问题(异常:Class not found, class not defined、Method not found, NoSuchField等)

  1. 路径近者优先

  2. 节点路径相同时,使用第一声明优先(xml上下顺序有关)

  3. 无法通过依赖管理原则排除的,使用直接排除法

    1. <exclusions>
    2. <exclusion>
    3. <groupId>org.springframework</groupId>
    4. <artifactId>spring-core</artifactId>
    5. </exclusion>
    6. </exclusions>

3. 工程分层【重点】

回顾之前项目开发:

Maven高级讲义 - 图16

工程分层后的开发:所有的service和dao的代码都在一起,1:增强程序的通用性,2:降低了代码的耦合性

Maven高级讲义 - 图17

【目标】

实现项目工程分解,掌握聚合和继承的作用

【路径】

1:聚合和继承

2:准备数据库环境

3:ssm_parent(父工程) pom 引入依赖

4:ssm_model(子工程) 实体类

5:ssm_dao(子工程) 数据库操作

6:ssm_service(子工程) 完业务操作

7:ssm_web(子工程) 收集请求参数,调用业务,返回结果给前端

8:测试(工程发布tomcat)

【讲解】

3.1. 聚合(多模块)和继承 【思想重点】

继承和聚合结构图:

Maven高级讲义 - 图18

特点1(继承):

ssm_parent父工程:存放项目的所有jar包。

ssm_web和ssm_service和ssm_dao有选择的继承jar包,并在自己的工程中使用。这样可以消除jar包重复,并锁定版本

特点2(聚合):

  1. ssm_web依赖于ssm_servicessm_service依赖于ssm_dao,我们启动ssm_web,便可以访问我们的程序。
  2. 执行安装的时候,执行ssm_parent,就可以将所有的子工程全部进行安装。

理解继承和聚合总结:

  1. 通常继承和聚合同时使用。

· 何为继承?

  1. 继承是为了消除重复,如果将 dao service web 分开创建独立的工程则每个工程的 pom.xml 文件中的内容存在重复,比如:设置编译版本、锁定 spring 的版本的等,可以将这些重复的 配置提取出来在父工程的 pom.xml 中定义。

· 何为聚合?

  1. 项目开发通常是分组分模块开发, 每个模块开发完成要运行整个工程需要将每个模块聚合在 一起运行,比如: dao service web 三个工程最终会打一个独立的 war 运行。

Maven高级讲义 - 图19

3.2. 准备数据库环境

准备工作,导入sql

创建数据库itcastmaven

执行items.sql

Maven高级讲义 - 图20

  1. SET FOREIGN_KEY_CHECKS=0;
  2. -- ----------------------------
  3. -- Table structure for `items`
  4. -- ----------------------------
  5. DROP TABLE IF EXISTS `items`;
  6. CREATE TABLE `items` (
  7. `id` int(10) NOT NULL auto_increment,
  8. `name` varchar(20) default NULL,
  9. `price` float(10,0) default NULL,
  10. `pic` varchar(40) default NULL,
  11. `createtime` datetime default NULL,
  12. `detail` varchar(200) default NULL,
  13. PRIMARY KEY (`id`)
  14. ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;
  15. -- ----------------------------
  16. -- Records of items
  17. -- ----------------------------
  18. INSERT INTO `items` VALUES ('1', '传智播客web课程', '1000', null, '2018-03-13 09:29:30', '带我走上人生巅峰');
  19. INSERT INTO `items` VALUES ('2', '黑马之路', null, null, '2018-03-28 10:05:52', '插入测试');
  20. INSERT INTO `items` VALUES ('3', '黑马之路二', '199', null, '2018-03-07 10:08:04', '插入测试');
  21. INSERT INTO `items` VALUES ('7', '插入测试', null, null, null, null);
  22. INSERT INTO `items` VALUES ('8', '插入测试', null, null, null, null);

Maven高级讲义 - 图21

3.3. ssm_parent

Maven高级讲义 - 图22

删除src文件夹

Maven高级讲义 - 图23

3.3.1. pom.xml

父工程:pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.itheima</groupId>
  7. <artifactId>ssm_parent</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <packaging>pom</packaging>
  10. <!--
  11. 特殊属性定义,一般是版本号
  12. -->
  13. <properties>
  14. <spring.version>5.0.2.RELEASE</spring.version>
  15. <slf4j.version>1.6.6</slf4j.version>
  16. <log4j.version>1.2.12</log4j.version>
  17. <mysql.version>5.1.6</mysql.version>
  18. <mybatis.version>3.4.5</mybatis.version>
  19. <aspectjweaver.version>1.6.8</aspectjweaver.version>
  20. <junit.version>4.12</junit.version>
  21. <jsp-api.version>2.0</jsp-api.version>
  22. <servlet-api.version>2.5</servlet-api.version>
  23. <jstl.version>1.2</jstl.version>
  24. <mybatis-spring.version>1.3.0</mybatis-spring.version>
  25. <druid.version>1.0.9</druid.version>
  26. <!--文件的编码格式-->
  27. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  28. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  29. </properties>
  30. <!--
  31. jar包管理
  32. dependencyManagement:并非导入依赖,而只是管理依赖(这样子工程可供选择)
  33. -->
  34. <dependencyManagement>
  35. <!--引入依赖-->
  36. <dependencies>
  37. <!-- spring(切面) -->
  38. <dependency>
  39. <groupId>org.aspectj</groupId>
  40. <artifactId>aspectjweaver</artifactId>
  41. <version>${aspectjweaver.version}</version>
  42. </dependency>
  43. <!-- spring(aop) -->
  44. <dependency>
  45. <groupId>org.springframework</groupId>
  46. <artifactId>spring-aop</artifactId>
  47. <version>${spring.version}</version>
  48. </dependency>
  49. <!--spring包(核心)-->
  50. <dependency>
  51. <groupId>org.springframework</groupId>
  52. <artifactId>spring-context</artifactId>
  53. <version>${spring.version}</version>
  54. </dependency>
  55. <!--用于SpringMVC-->
  56. <dependency>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-webmvc</artifactId>
  59. <version>${spring.version}</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-web</artifactId>
  64. <version>${spring.version}</version>
  65. </dependency>
  66. <!--用于数据库源相关操作-->
  67. <!-- spring(整合jdbc) -->
  68. <dependency>
  69. <groupId>org.springframework</groupId>
  70. <artifactId>spring-jdbc</artifactId>
  71. <version>${spring.version}</version>
  72. </dependency>
  73. <!-- spring(事务) -->
  74. <dependency>
  75. <groupId>org.springframework</groupId>
  76. <artifactId>spring-tx</artifactId>
  77. <version>${spring.version}</version>
  78. </dependency>
  79. <!--Servlet相关API(可以使用Request、Response)-->
  80. <dependency>
  81. <groupId>javax.servlet</groupId>
  82. <artifactId>servlet-api</artifactId>
  83. <version>${servlet-api.version}</version>
  84. <scope>provided</scope>
  85. </dependency>
  86. <dependency>
  87. <groupId>javax.servlet.jsp</groupId>
  88. <artifactId>jsp-api</artifactId>
  89. <version>${jsp-api.version}</version>
  90. <scope>provided</scope>
  91. </dependency>
  92. <!--jstl标签-->
  93. <dependency>
  94. <groupId>jstl</groupId>
  95. <artifactId>jstl</artifactId>
  96. <version>${jstl.version}</version>
  97. </dependency>
  98. <!--MySQL数据库驱动-->
  99. <dependency>
  100. <groupId>mysql</groupId>
  101. <artifactId>mysql-connector-java</artifactId>
  102. <version>${mysql.version}</version>
  103. <scope>runtime</scope>
  104. </dependency>
  105. <!--spring测试-->
  106. <dependency>
  107. <groupId>org.springframework</groupId>
  108. <artifactId>spring-test</artifactId>
  109. <version>${spring.version}</version>
  110. </dependency>
  111. <dependency>
  112. <groupId>junit</groupId>
  113. <artifactId>junit</artifactId>
  114. <version>${junit.version}</version>
  115. <scope>test</scope>
  116. </dependency>
  117. <!-- log日志 start -->
  118. <dependency>
  119. <groupId>log4j</groupId>
  120. <artifactId>log4j</artifactId>
  121. <version>${log4j.version}</version>
  122. </dependency>
  123. <dependency>
  124. <groupId>org.slf4j</groupId>
  125. <artifactId>slf4j-api</artifactId>
  126. <version>${slf4j.version}</version>
  127. </dependency>
  128. <dependency>
  129. <groupId>org.slf4j</groupId>
  130. <artifactId>slf4j-log4j12</artifactId>
  131. <version>${slf4j.version}</version>
  132. </dependency>
  133. <!-- log end -->
  134. <!--mybatis-->
  135. <dependency>
  136. <groupId>org.mybatis</groupId>
  137. <artifactId>mybatis</artifactId>
  138. <version>${mybatis.version}</version>
  139. </dependency>
  140. <!--MyBatis集成Spring-->
  141. <dependency>
  142. <groupId>org.mybatis</groupId>
  143. <artifactId>mybatis-spring</artifactId>
  144. <version>${mybatis-spring.version}</version>
  145. </dependency>
  146. <!--数据源-->
  147. <dependency>
  148. <groupId>com.alibaba</groupId>
  149. <artifactId>druid</artifactId>
  150. <version>${druid.version}</version>
  151. </dependency>
  152. </dependencies>
  153. </dependencyManagement>
  154. </project>

【小结】

  • pom

  • 管理所有的jar包(并锁定版本)

  • 父工程不需要开发的代码,src的文件夹可以删除

3.4. ssm_model

【路径】

1:配置pom.xml

2:创建Items.java

选择Module

Maven高级讲义 - 图24

Maven高级讲义 - 图25

对应数据库的表和字段

Maven高级讲义 - 图26

3.4.1. pom.xml

查看子工程pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>ssm_parent</artifactId>
  7. <groupId>com.itheima</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>ssm_model</artifactId>
  12. <packaging>jar</packaging>
  13. </project>

查看父工程pom.xml

表示聚合了ssm_model

  1. <modules>
  2. <module>ssm_model</module>
  3. </modules>

3.4.2. 创建Items.java

  1. public class Items {
  2. private Integer id;
  3. private String name;
  4. private Float price;
  5. private String pic;
  6. private Date createtime;
  7. private String detail;
  8. //get..set..
  9. }

【小结】

  • jar
  • 管理项目中所有的实体类

3.5. ssm_dao

【路径】

1:配置pom.xml

2:创建spring-mybatis.xml(spring整合mybatis的配置)

3:创建ItemsDao.java

4:创建ItemsDao.xml

5:创建mybatis.xml(mybatis的配置文件)(可以省略)

Maven高级讲义 - 图27

3.5.1. pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>ssm_parent</artifactId>
  7. <groupId>com.itheima</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>ssm_dao</artifactId>
  12. <!--jar包-->
  13. <packaging>jar</packaging>
  14. <!--引入依赖-->
  15. <dependencies>
  16. <!--model的依赖-->
  17. <dependency>
  18. <groupId>com.itheima</groupId>
  19. <artifactId>ssm_model</artifactId>
  20. <version>1.0-SNAPSHOT</version>
  21. </dependency>
  22. <!--mybatis-->
  23. <dependency>
  24. <groupId>org.mybatis</groupId>
  25. <artifactId>mybatis</artifactId>
  26. </dependency>
  27. <!--MyBatis集成Spring-->
  28. <dependency>
  29. <groupId>org.mybatis</groupId>
  30. <artifactId>mybatis-spring</artifactId>
  31. </dependency>
  32. <!--数据源-->
  33. <dependency>
  34. <groupId>com.alibaba</groupId>
  35. <artifactId>druid</artifactId>
  36. </dependency>
  37. <!--MySQL数据库驱动-->
  38. <dependency>
  39. <groupId>mysql</groupId>
  40. <artifactId>mysql-connector-java</artifactId>
  41. </dependency>
  42. <!--SpringJdbc -->
  43. <dependency>
  44. <groupId>org.springframework</groupId>
  45. <artifactId>spring-jdbc</artifactId>
  46. </dependency>
  47. <!-- log start -->
  48. <dependency>
  49. <groupId>log4j</groupId>
  50. <artifactId>log4j</artifactId>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.slf4j</groupId>
  54. <artifactId>slf4j-api</artifactId>
  55. </dependency>
  56. <dependency>
  57. <groupId>org.slf4j</groupId>
  58. <artifactId>slf4j-log4j12</artifactId>
  59. </dependency>
  60. <!-- log end -->
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-context</artifactId>
  64. </dependency>
  65. </dependencies>
  66. </project>

查看父工程pom.xml

  1. <modules>
  2. <module>ssm_model</module>
  3. <module>ssm_dao</module>
  4. </modules>

3.5.2. 创建spring-mybatis.xml

【路径】

1:数据库连接池

2:SqlSessionFactoryBean

3:Dao层接口扫描,让Dao被spring管理

在resources下创建spring-mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!--1.数据库连接池-->
  6. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
  7. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  8. <property name="url" value="jdbc:mysql://localhost:3306/你的数据库?characterEncoding=utf8"/>
  9. <property name="username" value="root"/>
  10. <property name="password" value="root用户的密码"/>
  11. </bean>
  12. <!--2.配置sqlSessionFactoryBean-->
  13. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  14. <!--配置数据源-->
  15. <property name="dataSource" ref="dataSource"/>
  16. <!--别名配置-->
  17. <property name="typeAliasesPackage" value="com.itheima.pojo"/>
  18. </bean>
  19. <!--3.dao接口扫描-->
  20. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  21. <property name="basePackage" value="com.itheima.dao"/>
  22. </bean>
  23. </beans>

3.5.3. 创建ItemsDao.java

  1. public interface ItemsDao {
  2. /***
  3. * 查询所有
  4. * @return
  5. */
  6. List<Items> findAll();
  7. /***
  8. * 保存操作
  9. * @param items
  10. * @return
  11. */
  12. int save(Items items);
  13. }

3.5.4. 创建ItemsDao.xml

在com/itheima/dao/ItemsDao.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <!--
  6. namespace="Dao接口的全限定名"
  7. -->
  8. <mapper namespace="com.itheima.dao.ItemsDao">
  9. <!--保存操作-->
  10. <insert id="save" parameterType="Items">
  11. INSERT INTO items(name,price,pic,createtime,detail) VALUES(#{name},#{price},#{pic},#{createtime},#{detail})
  12. </insert>
  13. <!--查询所有-->
  14. <select id="findAll" resultType="Items">
  15. SELECT * FROM items
  16. </select>
  17. </mapper>

3.5.5. 创建sqlMapConfig.xml(可以省略)

在resources下创建mybatis.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE configuration
  3. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-config.dtd">
  5. <configuration>
  6. </configuration>

3.5.6 dao测试

在test下创建DaoTest

  1. public class DaoTest {
  2. public static void main(String[] args) {
  3. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring-mybatis.xml");
  4. ItemsDao itemsDao = (ItemsDao)applicationContext.getBean("itemsDao");
  5. System.out.println("商品列表:::"+itemsDao.findAll());
  6. Items items = new Items();
  7. items.setName("商品名称");
  8. items.setPrice(16666f);
  9. items.setCreatetime(new Date());
  10. itemsDao.save(items);
  11. }
  12. }

【小结】

  • jar
  • 引入依赖 ssm_model 、mybatis的依赖…
  • spring-mybatis.xml(spring的配置文件)(spring整合mybatis的框架)

    • 数据源
    • 工厂
    • 包扫描(dao)
  • 接口ItemsDao.java
  • 创建映射文件ItemsDao.xml (映射文件路径与包名相同, resources目录下的)

3.6. ssm_service

【路径】

1:pom.xml

2:创建spring-service.xml(spring的声明式事务处理)

3:创建ItemsService接口

4:创建ItemsServiceImpl实现类

Maven高级讲义 - 图28

3.6.1. pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>ssm_parent</artifactId>
  7. <groupId>com.itheima</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>ssm_service</artifactId>
  12. <!--jar包-->
  13. <packaging>jar</packaging>
  14. <!--依赖-->
  15. <dependencies>
  16. <!--依赖dao-->
  17. <dependency>
  18. <groupId>com.itheima</groupId>
  19. <artifactId>ssm_dao</artifactId>
  20. <version>1.0-SNAPSHOT</version>
  21. </dependency>
  22. <!-- spring -->
  23. <dependency>
  24. <groupId>org.aspectj</groupId>
  25. <artifactId>aspectjweaver</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-aop</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework</groupId>
  33. <artifactId>spring-context</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-tx</artifactId>
  38. </dependency>
  39. </dependencies>
  40. </project>

查看父工程pom.xml

  1. <modules>
  2. <module>ssm_model</module>
  3. <module>ssm_dao</module>
  4. <module>ssm_service</module>
  5. </modules>

3.6.2. 创建spring-service.xml

【路径】

1:创建一个事务管理器

2:配置事务的通知,及传播特性,对切入点方法的细化

3:AOP声明式事务配置(配置切入点,通知关联切入点)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:tx="http://www.springframework.org/schema/tx"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/tx
  10. http://www.springframework.org/schema/tx/spring-tx.xsd
  11. http://www.springframework.org/schema/aop
  12. http://www.springframework.org/schema/aop/spring-aop.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context.xsd">
  15. <!--1.创建一个事务管理器-->
  16. <bean id="txtManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
  17. <!--指定数据源-->
  18. <property name="dataSource" ref="dataSource" />
  19. </bean>
  20. <!--2.方式一:声明式事务配置-->
  21. <tx:advice id="txAdvice" transaction-manager="txtManager">
  22. <!--配置传播特性属性-->
  23. <tx:attributes>
  24. <!--
  25. 对应方法参与事务并且在事务下执行,事务隔离剂别使用默认隔离级别,发生异常需要事务回滚
  26. -->
  27. <tx:method name="add*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  28. <tx:method name="insert*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  29. <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  30. <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  31. <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  32. <tx:method name="edit*" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.Exception" />
  33. <!--
  34. 只读操作
  35. -->
  36. <tx:method name="*" read-only="true" />
  37. </tx:attributes>
  38. </tx:advice>
  39. <!--AOP声明式事务配置(配置切入点,通知关联切入点)-->
  40. <aop:config>
  41. <!--切点指点-->
  42. <aop:pointcut id="tranpointcut" expression="execution(* com.itheima.service.*.*(..))" />
  43. <!--配置通知-->
  44. <aop:advisor advice-ref="txAdvice" pointcut-ref="tranpointcut" />
  45. </aop:config>
  46. <!--方式二:注解方式事务配置-->
  47. <!--<tx:annotation-driven transaction-manager="txtManager"/>-->
  48. <!--3.扫描service-->
  49. <context:component-scan base-package="com.itheima.service"/>
  50. <!--4.引入spring-mybatis.xml-->
  51. <import resource="classpath:spring-mybatis.xml" />
  52. </beans>

3.6.3. 创建ItemsService接口

  1. public interface ItemsService {
  2. /***
  3. * 列表查询
  4. * @return
  5. */
  6. List<Items> findAll();
  7. /***
  8. * 增加商品
  9. * @param items
  10. * @return
  11. */
  12. int save(Items items);
  13. }

3.6.4. 创建ItemsServiceImpl

  1. @Service
  2. public class ItemsServiceImpl implements ItemsService {
  3. @Autowired
  4. private ItemsDao itemsDao;
  5. /***
  6. * 集合查询
  7. * @return
  8. */
  9. public List<Items> findAll() {
  10. return itemsDao.findAll();
  11. }
  12. /***
  13. * 增加商品测试事务
  14. * @param items
  15. * @return
  16. */
  17. public int save(Items items) {
  18. int acount = itemsDao.save(items);
  19. System.out.println("acount:"+acount);
  20. //测试事务,如果出错,是否回滚
  21. //int q=10/0;
  22. return acount;
  23. }
  24. }

3.6.5. service测试

  1. public class ServiceTest {
  2. public static void main(String[] args) {
  3. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-service.xml");
  4. ItemsService itemsService = (ItemsService)applicationContext.getBean("itemsServiceImpl");
  5. Items items = new Items();
  6. items.setName("测试事务");
  7. itemsService.save(items);
  8. }
  9. }

【小结】

  • jar
  • 引入依赖 ssm_dao 、spring相关的依赖
  • spring-service.xml(声明式事务处理)

    • 扫描业务层
    • 事务管理器
    • 通知->切的方法
    • aop:config

      • 要切的包 表达式
      • 把advice与pointcut整合起来
    • 注解式事务
  • 接口ItemsService.java
  • 实现类ItemsServiceImpl.java

3.7. ssm_web

【路径】

1:pom.xml

2:创建web.xml

3:创建springmvc.xml

4:创建ItemsController.java

5:创建页面items.jsp

Maven高级讲义 - 图29

3.7.1. pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>ssm_parent</artifactId>
  7. <groupId>com.itheima</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>ssm_web</artifactId>
  12. <!--war包-->
  13. <packaging>war</packaging>
  14. <!--依赖引入-->
  15. <dependencies>
  16. <!--依赖service-->
  17. <dependency>
  18. <groupId>com.itheima</groupId>
  19. <artifactId>ssm_service</artifactId>
  20. <version>1.0-SNAPSHOT</version>
  21. </dependency>
  22. <!--导入springmvc-->
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-web</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-webmvc</artifactId>
  30. </dependency>
  31. <!--servletAPI -->
  32. <dependency>
  33. <groupId>javax.servlet</groupId>
  34. <artifactId>servlet-api</artifactId>
  35. <scope>provided</scope>
  36. </dependency>
  37. <dependency>
  38. <groupId>javax.servlet.jsp</groupId>
  39. <artifactId>jsp-api</artifactId>
  40. <scope>provided</scope>
  41. </dependency>
  42. <!--jstl表达式 -->
  43. <dependency>
  44. <groupId>jstl</groupId>
  45. <artifactId>jstl</artifactId>
  46. </dependency>
  47. </dependencies>
  48. <build>
  49. <!--插件-->
  50. <plugins>
  51. <!--tomcat插件-->
  52. <plugin>
  53. <groupId>org.apache.tomcat.maven</groupId>
  54. <artifactId>tomcat7-maven-plugin</artifactId>
  55. <!--插件使用的相关配置-->
  56. <configuration>
  57. <!--端口号-->
  58. <port>18081</port>
  59. <!--写当前项目的名字(虚拟路径),如果写/,那么每次访问项目就不需要加项目名字了-->
  60. <path>/</path>
  61. <!--解决get请求乱码-->
  62. <uriEncoding>UTF-8</uriEncoding>
  63. </configuration>
  64. </plugin>
  65. </plugins>
  66. </build>
  67. </project>

查看父工程pom.xml

  1. <modules>
  2. <module>ssm_model</module>
  3. <module>ssm_dao</module>
  4. <module>ssm_service</module>
  5. <module>ssm_web</module>
  6. </modules>

3.7.2.创建web.xml

【路径】

1:配置编码过滤器

2:springmvc前端核心控制器

Maven高级讲义 - 图30

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  5. version="3.1">
  6. <!--1.配置编码过滤器-->
  7. <filter>
  8. <filter-name>encodingFilter</filter-name>
  9. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
  10. <!--编码设置-->
  11. <init-param>
  12. <param-name>encoding</param-name>
  13. <param-value>UTF-8</param-value>
  14. </init-param>
  15. </filter>
  16. <filter-mapping>
  17. <filter-name>encodingFilter</filter-name>
  18. <url-pattern>/*</url-pattern>
  19. </filter-mapping>
  20. <!--2.springmvc核心控制器-->
  21. <servlet>
  22. <servlet-name>dispatcherServlet</servlet-name>
  23. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  24. <init-param>
  25. <param-name>contextConfigLocation</param-name>
  26. <param-value>classpath:spring-mvc.xml</param-value>
  27. </init-param>
  28. <!--启动优先级-->
  29. <load-on-startup>1</load-on-startup>
  30. </servlet>
  31. <!--3.指定映射拦截-->
  32. <servlet-mapping>
  33. <servlet-name>dispatcherServlet</servlet-name>
  34. <url-pattern>/</url-pattern>
  35. </servlet-mapping>
  36. </web-app>

3.7.3. 创建springmvc.xml

【路径】

1:包扫描

2:视图解析器

3:springmvc注解驱动,自动配置mvc的处理器适配器和处理映射器

4:静态资源不过滤

5:import导入spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:mvc="http://www.springframework.org/schema/mvc"
  6. xsi:schemaLocation="http://www.springframework.org/schema/context
  7. http://www.springframework.org/schema/context/spring-context.xsd
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  10. <!--1:包扫描-->
  11. <context:component-scan base-package="com.itheima.controller"/>
  12. <!--2:视图解析器-->
  13. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  14. <property name="prefix" value="/WEB-INF/pages/"/>
  15. <property name="suffix" value=".jsp"/>
  16. </bean>
  17. <!--3:springmvc注解驱动,自动配置mvc的处理器适配器和处理映射器-->
  18. <mvc:annotation-driven/>
  19. <!--4:静态资源不过滤-->
  20. <mvc:default-servlet-handler/>
  21. <!--5:导入spring.xml-->
  22. <import resource="classpath:spring-service.xml"/>
  23. </beans>

3.7.4. 创建ItemsController

  1. @Controller
  2. @RequestMapping(value = "/items")
  3. public class ItemsController {
  4. @Autowired
  5. private ItemsService itemsService;
  6. /**
  7. * 列表访问
  8. * @return
  9. */
  10. @RequestMapping(value = "/list")
  11. public String list(Model model){
  12. //集合查询
  13. List<Items> items = itemsService.findAll();
  14. //存入回显
  15. model.addAttribute("items",items);
  16. return "items";
  17. }
  18. /***
  19. * 事务测试
  20. * 增加商品
  21. * @return
  22. */
  23. @RequestMapping(value = "/save")
  24. public String save(Items items){
  25. int acount = itemsService.save(items);
  26. //集合列表页跳转
  27. return "redirect:/items/list";
  28. }
  29. }

3.7.5. 创建页面items.jsp

在/WEB-INF/pages/创建items.jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <html>
  4. <head>
  5. <title>新增/查询</title>
  6. </head>
  7. <body>
  8. <table>
  9. <form action="/items/save" method="post">
  10. <table>
  11. <tr>
  12. <td>名称</td>
  13. <td><input type="text" name="name"/></td>
  14. </tr>
  15. <tr>
  16. <td>价格</td>
  17. <td><input type="text" name="price"/></td>
  18. </tr>
  19. <tr>
  20. <td>图片</td>
  21. <td><input type="text" name="pic"/></td>
  22. </tr>
  23. <tr>
  24. <td>创建日期</td>
  25. <td><input type="text" name="createtime"/></td>
  26. </tr>
  27. <tr>
  28. <td>详情</td>
  29. <td><input type="text" name="detail"/></td>
  30. </tr>
  31. <tr>
  32. <td colspan="2">
  33. <input type="submit" value="提交"/>
  34. </td>
  35. </tr>
  36. </table>
  37. </form>
  38. </table>
  39. <hr>
  40. <table border="1">
  41. <tr>
  42. <td>ID</td>
  43. <td>name</td>
  44. <td>price</td>
  45. <td>pic</td>
  46. <td>createTime</td>
  47. <td>detail</td>
  48. <td></td>
  49. </tr>
  50. <c:forEach items="${items}" var="item">
  51. <tr>
  52. <td>${item.id}</td>
  53. <td>${item.name}</td>
  54. <td>${item.price}</td>
  55. <td>${item.pic}</td>
  56. <td>${item.createtime}</td>
  57. <td>${item.detail}</td>
  58. </tr>
  59. </c:forEach>
  60. </table>
  61. </body>
  62. </html>

【小结】

  • war
  • 引入依赖 ssm_service 、 springmvc 、 servlet_api等
  • springmvc.xml(springmvc的相关配置)
  • web.xml(springmvc的核心控制器、post乱码过滤器)
  • 类ItemsController.java
  • 测试页面items.jsp

3.8. 测试

【路径】

1:测试打包package、安装install(演示maven聚合)

2:发布到外部tomcat

3:使用maven的tomcat插件发布

3.8.1. 方式一:tomcat插件发布(配置父工程)

Maven高级讲义 - 图31

使用http://localhost:18081/items/list测试:

Maven高级讲义 - 图32

3.8.2. 方式二:tomcat插件发布(配置web工程)

在父工程打包

Maven高级讲义 - 图33

所有的子工程都会被打包(package)。这就是“聚合”的作用。

也可以同时安装(install),同时部署(deploy)

Maven高级讲义 - 图34

【小结】

使用maven内置的tomcat插件的时候 :

第一种:配置D:\ideaProjects\ssm_parent:parent是有聚合的功能,不需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库。

第二种:配置D:\ideaProjects\ssm_parent\ssm_web:需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库。

3.8.3. 方式三:发布到外部tomcat

Maven高级讲义 - 图35

Maven高级讲义 - 图36

使用http://localhost:18081/ssm/items/list测试:

Maven高级讲义 - 图37

【小结】

当使用外部tomcat进行开发的时候,不需要将ssm_parent,ssm_model,ssm_dao,ssm_service安装到本地仓库。

【小结】

1:拆分与聚合和继承

  1. 拆分:解耦,代码最大程度的重复使用,维护方便
  2. 聚合:靠父工程来聚合,单一工程是没法完成工作。
  3. 继承:父工程引入依赖,子工程就不需要再引了, 父式程依赖的版本管理

2: Maven的jar包冲突解决

  • 路径近者优先
  • 路径相同,第一声明优先
  • 路径相同,使用强制排除exclusions

3:准备数据库环境

  • ssm_parent(父工程)聚合,引入依赖管理

  • ssm_model(子工程) 实体类

  • ssm_dao(子工程) mybatis, dataSource, sqlSessionFactorybean, MapperScannerConfigurer
    注:映射文件的路径必须与包名路径一样

  • ssm_service(子工程)
    扫service包,事务管理器,通知、切面。

  • ssm_web(子工程)

    • SpringMVC.xml 扫controller, 视图解析器,注解驱动,静态资源过滤
    • web.xml 编码过滤器,前端核心控制器(load-on-startup)

8:测试(工程发布tomcat)

  • 推荐使用本地tomcat

4. 补充

**当下载jar的时候,如果断网,或者连接超时的时候,会自动在文件夹中创建一个名为.lastupdate的文件,当有了这个文件之后,当你再次联网的时候,那么该文件不会再自动联网,必须手动删除,才能正常下载使用。如何删除呢?

使用工具:

Maven高级讲义 - 图38

如何使用?打开工具

Maven高级讲义 - 图39

双击运行

Maven高级讲义 - 图40

Maven项目,如果正在下载一个jar,但是突然断网,此时,就会产生一个m2e-lastUpdated.,别指望下次上网就会自动下载,必须手动删除该文件,然后再进行下载。