一,多模块项目的优点:
1,为什么要使用多模块项目?
相比传统的单体工程,使用Maven的多模块配置,
有如下优点:
帮助项目划分模块,鼓励重用,
防止POM变得过于庞大,
方便某个模块的构建,而不用每次都构建整个项目,
对某个模块的特殊控制更为方便
2,创建项目的流程:
先创建一个空项目multimodjar,删除无关文件,只留一个pom.xml和一个multimodjar.iml
然后在这个项目下创建module
3,pom.xml/multimodjar.iml 两个文件的用途说明:
pom.xml: 项目对象模型(Project Object Model)的简称,它是Maven项目中的文件。
作用:管理源代码/配置文件/开发者的信息和角色/问题追踪系统/组织信息/项目授权/项目的url/项目的依赖关系等
multimodjar.iml,iml文件,infomation of module,
作用:保存了项目的配置信息,intellij idea需要从它获取项目信息
说明:作者:刘宏缔 邮箱: 371125307@qq.com
二, 演示项目的相关信息
1,项目地址:
https://github.com/liuhongdi/multimodjar
2,项目功能说明:
演示了多模块项目如何配置pom.xml打包
项目包含了4个模块:mmweb(可执行的入口)
mmservice
mmpojo
mmrepo(数据库)
3,项目结构:如图:
三,配置文件说明
1,根项目pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.3.RELEASE
com.multimodjar
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
pom
mmweb
mmpojo
mmrepo
mmservice
可以看到,在根项目中,只需要添加对各个模块的依赖
2,mmweb模块的pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.3.RELEASE
com.mmweb
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
org.springframework.boot
spring-boot-starter-web
com.mmservice
demo
0.0.1-SNAPSHOT
compile
com.mmpojo
demo
0.0.1-SNAPSHOT
compile
org.springframework.boot
spring-boot-starter-thymeleaf
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
org.springframework.boot
spring-boot-maven-plugin
com.mmweb.demo.DemoApplication
ZIP
repackage
因为mmweb是可执行的类所在模块,所以需要专门指定执行mainClass入口类
3,mmweb的application.properties
#errorserver.error.include-stacktrace=always
#errorlog
logging.level.org.springframework.web=trace
#mysql
spring.datasource.url=jdbc:mysql://localhost:3306/store?characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=lhddemo
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#mybatis
mybatis.mapper-locations=classpath:/mapper/*Mapper.xml
mybatis.type-aliases-package=com.example.demo.mapper
mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
#thymeleaf
spring.thymeleaf.cache=false
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.mode=HTML
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
4,mmservice的pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.3.RELEASE
com.mmservice
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
com.mmpojo
demo
0.0.1-SNAPSHOT
compile
com.mmrepo
demo
0.0.1-SNAPSHOT
compile
com.github.pagehelper
pagehelper-spring-boot-starter
1.2.12
5,mmrepo的pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.3.RELEASE
com.mmrepo
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
com.mmpojo
demo
0.0.1-SNAPSHOT
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.3
mysql
mysql-connector-java
runtime
6,mmpojo的pom.xml
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.3.3.RELEASE
com.mmpojo
demo
0.0.1-SNAPSHOT
demo
Demo project for Spring Boot
11
7,用到的数据表的结构:
CREATE TABLE`goods` (
`goodsId`int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
`goodsName`varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'name',
`subject`varchar(200) NOT NULL DEFAULT '' COMMENT '标题',
`price`decimal(15,2) NOT NULL DEFAULT '0.00' COMMENT '价格',
`stock`int(11) NOT NULL DEFAULT '0' COMMENT 'stock',PRIMARY KEY(`goodsId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='商品表'
四,java代码说明
1,DemoApplication.java
@SpringBootApplication(scanBasePackages = {"com.mmservice.demo","com.mmpojo.demo","com.mmweb.demo"})
@MapperScan("com.mmrepo.demo")public classDemoApplication {public static voidmain(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
说明:因为引入了多模块,需要添加上扫描包的路径
2,HomeController.java
importcom.mmpojo.demo.pojo.Goods;importcom.mmservice.demo.service.GoodsService;importorg.springframework.stereotype.Controller;importorg.springframework.ui.Model;import org.springframework.web.bind.annotation.*;importjavax.annotation.Resource;importjava.util.List;importjava.util.Map;
@Controller
@RequestMapping("/home")public classHomeController {
@ResourceprivateGoodsService goodsService;//list all goods
@GetMapping("/list")
@ResponseBodypublic Listall() {
System.out.println("-------------------------list");
List list =goodsService.getAllGoods();returnlist;
}//带模板显示商品列表 参数:第几页
@GetMapping("/goodslist")publicString goodsList(Model model,
@RequestParam(value="p",required = false,defaultValue = "1") intcurrentPage) {
Map res =goodsService.getAllGoodsByPage(currentPage);
model.addAttribute("pageInfo", res.get("pageInfo"));
model.addAttribute("goodslist", res.get("goodslist"));return "goods/goodslist";
}
}
注意import的goods/GoodsService类的路径
3,GoodsServiceImpl.java
@Servicepublic class GoodsServiceImpl implementsGoodsService {
@ResourceprivateGoodsMapper goodsMapper;//返回全部商品
@Overridepublic ListgetAllGoods() {
List goodsList =goodsMapper.selectAllGoods();returngoodsList;
}//带分页返回商品
@Overridepublic Map getAllGoodsByPage(intcurrentPage) {
Map res = new HashMap();
PageHelper.startPage(currentPage,5);
List goodsList =goodsMapper.selectAllGoods();
res.put("goodslist",goodsList);
PageInfo pageInfo = new PageInfo<>(goodsList);
res.put("pageInfo",pageInfo);returnres;
}
}
4,GoodsMapper.java
@Repository
@Mapperpublic interfaceGoodsMapper {
ListselectAllGoods();
}
5,GoodsMapper.xml
/p>
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
select * from goods order by goodsId desc
6,Goods.java
public classGoods {//商品id
Long goodsId;publicLong getGoodsId() {return this.goodsId;
}public voidsetGoodsId(Long goodsId) {this.goodsId =goodsId;
}//商品名称
privateString goodsName;publicString getGoodsName() {return this.goodsName;
}public voidsetGoodsName(String goodsName) {this.goodsName =goodsName;
}//商品标题
privateString subject;publicString getSubject() {return this.subject;
}public voidsetSubject(String subject) {this.subject =subject;
}//商品价格
privateBigDecimal price;publicBigDecimal getPrice() {return this.price;
}public voidsetPrice(BigDecimal price) {this.price =price;
}//库存
intstock;public intgetStock() {return this.stock;
}public void setStock(intstock) {this.stock =stock;
}publicString toString(){return " Goods:goodsId=" + goodsId +" goodsName=" + goodsName+" subject=" + subject+" price=" + price+" stock=" +stock;
}
}
7,goodslist.html
商品列表