Maven进阶
一、使用Tomcat关于maven的插件
在pom.xml添加一个插件的配置:
<build>
<plugins>
<!--Tomcat7插件-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!--指定义访问项目时的上下文根路径-->
<path>/maven-demo02-web</path>
<!--访问tomcat的端口-->
<port>8080</port>
<!--针对get方式请求字符集编码-->
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
依赖和插件的区别:
-
添加依赖: 默认会随着项目打包时以及运行时一起添加
|-注意,可通过scope来改变依赖的范围
-
添加插件: 仅在开发项目时添加,打包部署时,插件的jar文件不会一起添加
补充:maven项目使用tomat7插件运行时,如何调试:
(1)调试: debug 解决程序中的错误 .
(2)调试的步骤:
- 猜测试程序出错的大致的地方
- 设置断点 breakpoint
- 单步运行
- 观察程序执行时变量的变化
- 找出代码问题
- 停止debug模式
- 更正代码
(3) 配置Idea,启用debug

二、Maven进阶
1.依赖范围
当我们在pom中添加依赖时,指定scope,用来表示此依赖jar的存在时间范围(使用时期).
- 编译时期 A
- 测试时期 B
- 运行时期 C
- 打包时期 D
scope [6个值]
|-compile [编译] 此依赖范围值,是scope的默认值,也是最强依赖 [A,B,C,D]
|- provided 提供 表示由第三方容器来提供, [A,B 需要] 在 [C,D]运行和打包时期 不需要加载
代表: servlet-api,jsp-api
|- runtime 运行时 表示所依赖的jar文件,仅在运行时和测试时加载 [C,B]
代表: jdbc.jar -- java.sql.* Connection,Statement,ResultSet,PrepareStatement接口
|- test 仅在测试时需要加载,
需要注意的是,如果某个包的作用域是test,那么只能在src/test目录下使用jar的相关类,其他任何地方访问无效
代表: junit
不 推 荐:
system 、import
2.传递依赖
对比Eclipse与 Idea 对于项目与模块区分
Eclipse ---> Workspace ----相当于Idea -->Project
Eclipse --> Project ----相当于 Idea 中的Module [模块]
比如: A -> B -> C
A 添加对B项目的依赖 ,则 C项目也被传递依赖到A项目中.
- 传递Jar时原则:
使用jar包时,按照就近原则,路径最近的原则进行使用.
- 如果路径是一样的,则以pom.xml中的dependency配置的先后顺序为准
3.排除依赖
如果对于传递依赖的某个jar包,不想要使用加载至当前项目中,则可以排除此依赖.
<dependencies>
<dependency>
<groupId>com.woniu</groupId>
<artifactId>module-a</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
</exclusion>
<exclusion>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</exclusion>
</exclusions>
</dependency>
4.maven生命周期 [了解]
- Maven生命周期主要分为三个大的阶段 [clean , default - 【编译,测试,打包,安装,部署】, site]
- 每个阶段都是相关的插件程序来完成的
- clean --validate [验证]-- compile 【src/main/java/目录代码进行编译】-- test 【src/test/java/编译并执行@Test方法】 – package【jar,war,pom】 – verify[校验]-- install - deploy【安装到远程仓库】 – site
小结:maven的生命周期包含多个阶段,每个阶段由对应的插件去完成对应的动作;其中后面的插件执行会先执行之前的生命周期
5.统一版本管理
- 解决版本之前的兼容问题
- 对于多模块的父子项目中,统一版本的管理,更快捷方便更新版本号
<properties>
<mysql.jdbc.version>8.0.19</mysql.jdbc.version>
<druid.version>1.2.4</druid.version>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
6.maven聚合与继承
(1)**引言:**在实际的项目中,如果项目比较大的情况下,会把项目的功能分成很多个模块(module),模块与模块之间使用RPC(远程调用),而聚合和继承就特别适合
(2) 什么是聚合与继承
- 聚合与继承是两个概念,但是它们通常一起出现
- 聚合 -就是将多个项目模块进行统一管理[统一编译,测试,打包,安装,部署]
- 聚合模块知道被聚合模块,被聚合不知道聚合模块
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
-
继承 - 将父项目中配置的依赖与插件信息供子项目继承,简化子项目的配置,及统一版本管理
-
子模块必须知道父模块,父模块不知道子模块的存在
父模块中一定有: <packaging>pom</packaging>
-

<parent>
<artifactId>parent</artifactId>
<groupId>com.woniu</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
补充:配置插件,对于src/main/java目录下的资源文件不过滤:
<build>
<plugins>
<!--资源文件拷贝插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugins</artifactId>
<version>2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<!--配置maven对resources文件过滤-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<!--false表示不过滤java目录下的xml,properties文件-->
<filtering>false</filtering>
</resource>
</resources>
</build>
依赖和插件的区别:
- 依赖:在运行时需要的jar包,打包是会添加
- 插件:仅在项目开发时需要用到,运行时不需要,打包不会被添加
三、MyBatis注解开发(了解)
1.基本CRUD注解
使用相对较多
@Insert,
|-@Options
@Options(useGeneratedKeys=true,keyColumn="id",keyProperty="id")
获取自动生成的主键id
@Select,@Update,@Delete
结果集映射 ResultMap
@Results
{@Result(id=true,column="",property="")}
/**
* 用户 Dao的接口
*/
public interface UserDao {
// public User getById(int id);
@Select("select id,userCode,userName,userPassword,gender,birthday from smbms_user where roleid=#{roleid}")
@ResultMap(value="userResultMap") //引用已经定义的results
public List<User> getUsersByRoleId(int roleid);
@Select("select id,userCode,userName,userPassword,gender,birthday from smbms_user")
@Results(id="userResultMap",value={
@Result(id=true,column = "id",property = "id"),
//ctrl+d 复制当前行
@Result(column = "userCode",property = "userCode"),
@Result(column = "userName",property = "user_name"),
@Result(column = "userPassword",property = "userPassword"),
@Result(column = "gender",property = "gender"),
@Result(column = "birthday",property = "birthday")
})
public List<User> getUserList();
@Insert("insert into smbms_user(userCode,userName,userPassword,gender,birthday,roleid) " +
"values(#{userCode},#{userName},#{userPassword},#{gender},#{birthday},#{roleid})")
//ctrl+p
@Options(useGeneratedKeys=true,keyColumn="id",keyProperty="id")
public void add(User user);
//
// public void update(User user);
//
// public void deleteById(int id);
}
2.关联查询注解
mapper.xml
一对多 @Many
多对一,一对一 @One
import com.woniu.entity.Role;
import org.apache.ibatis.annotations.Many;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.mapping.FetchType;
import java.util.List;
public interface RoleDao {
@Select("select id,roleCode,roleName from smbms_role")
@Results(id="roleResultMap",value={
@Result(id = true,column = "id",property = "id"),
@Result(column="roleCode",property = "roleCode"),
@Result(column="roleName",property = "roleName"),
@Result(column="id",property = "userList",
many=@Many(select="com.woniu.dao.UserDao.getUsersByRoleId",
fetchType= FetchType.LAZY))
}
)
public List<Role> getRoleList();
}
3.动态SQL注解
(略),查看教学文档了解