SpringBoot多模块项目搭建
工程结构和依赖关系
工程结构:
springboot-multi
子模块:data(实体类)
子模块:dao(持久层,与数据库交互)
子模块:service(业务层,处理业务逻辑)
子模块:web(controller,页面交互,启动类入口)
依赖关系:
模块 | 模块依赖 |
---|---|
data | - |
dao | data |
service | data、dao |
web | data、dao、service |
一、创建工程模块
File → new → project → Spring Initializr →Next进入下一页面
填写Group和Artifact →Next进入下一页面
Next进入下一页面
选择项目名称和位置 →Finish
工程结构
因为父项目是聚合体,仅仅负责聚合其他模块,删除父项目的src目录
类似父项目的创建过程,创建出子模块
在父工程右键 → new → Module → Spring Initaializr → Next
依赖选择 →Next
确定项目名称和位置 →Finish
重复以上创建流程,创建出dao、service、web子模块
data和service不需额外引入依赖,dao和web根据实际需求引入必要依赖,比如我这dao引入Mysql Mybatis依赖,web引入Web依赖
接下来,删除每个子模块中.mvn、.gitignore、HELP.md、mvnw、mvnw.cmd,
除了web模块的其他模块的Applicatin启动类、sources下的application.properties
项目结构如下
二、配置依赖
父项目需要修改打包方式为pom,build的内容需要替换,具体的配置:
父项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wl</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>multimodule</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<modules>
<module>data</module>
<module>dao</module>
<module>service</module>
<module>web</module>
</modules>
<!--父项目配置的依赖,子模块继承依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests> <!--默认关掉单元测试 -->
</configuration>
</plugin>
</plugins>
</build>
</project>
data子模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wl</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.wl</groupId>
<artifactId>data</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>data</name>
<description>Demo project for Spring Boot</description>
</project>
dao子模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wl</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.wl</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dao</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>com.wl</groupId>
<artifactId>data</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
</project>
service子模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wl</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.wl</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>service</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>com.wl</groupId>
<artifactId>data</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.wl</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
web子模块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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.wl</groupId>
<artifactId>multimodule</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.wl</groupId>
<artifactId>web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>web</name>
<description>Demo project for Spring Boot</description>
<dependencies>
<dependency>
<groupId>com.wl</groupId>
<artifactId>data</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.wl</groupId>
<artifactId>dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.wl</groupId>
<artifactId>service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
项目打包
然后package打包,第一次不需要clean,以后每次打包先clean一下。按照流程走,打包是没有问题的
到这里项目搭建和打包已经是可以了,后面是整合mybatis和一个demo
三、整合MyBatis
web下的application文件填写配置信息
`server:
port: 8080
db:
hikari:
jdbcUrl: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
driverClassName: com.mysql.jdbc.Driver
connectionTestQuery: SELECT 1
connectionTimeout: 30000
idleTimeout: 600000
maxLifetime: 1800000
maximumPoolSize: 20
minimumIdle: 1
`
dao增加MybatisConfig
配置类@Primary可以不加,我是想接下来配置多数据源,所以这样写的
@Configuration
@MapperScan(basePackages = {"com.wl.dao.mapper"})
public class MybatisConfig {
@Bean("hikariDataSource")
@Primary
@ConfigurationProperties(prefix = "db.hikari")
public DataSource getHikariDataSource() {
return new HikariDataSource();
}
@Bean("hikariTransactionManager")
@Primary
public DataSourceTransactionManager getDataSourceTransactionManager() {
return new DataSourceTransactionManager(getHikariDataSource());
}
@Bean("hikariSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("hikariDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sqlSessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mapper/**/*.xml"));
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBean.getObject();
return sqlSessionFactory;
}
}
四、写一个新增、查找的demo
web、service、dao、data内容如下:
// 实体类
@Data
public class User {
private Integer id;
private String username;
private String gender;
private Integer age;
}
// mapper文件
public interface UserMapper {
int insert(User user);
User getByName(String name);
}
// 映射的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wl.dao.mapper.user.UserMapper">
<resultMap id="BaseResultMap" type="com.wl.data.user.User">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="gender" jdbcType="VARCHAR" property="gender" />
<result column="age" jdbcType="BIGINT" property="age" />
</resultMap>
<sql id="Base_Column_List">
id, username, gender, age
</sql>
<!--插入-->
<insert id="insert" parameterType="com.wl.data.user.User">
insert into mul_user (username, gender, age)
values (#{username,jdbcType=VARCHAR}, #{gender,jdbcType=VARCHAR},
#{age,jdbcType=BIGINT})
</insert>
<select id="getByName" parameterType="java.lang.String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"></include>
from mul_user
where username=#{username,jdbcType=VARCHAR}
</select>
</mapper>
// service
public interface UserService {
String insert(User user);
User getByName(String username);
}
// service实现类
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public String insert(User user) {
int result = userMapper.insert(user);
if (result == 1) {
return "success";
}
return "fail";
}
@Override
public User getByName(String username) {
return userMapper.getByName(username);
}
}
@Controller
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/user/addUser")
@ResponseBody
public String addUser(User user) {
return userService.insert(user);
}
@GetMapping("/user/getUserByName")
@ResponseBody
public User getUserByName(String username) {
return userService.getByName(username);
}
}
数据库建表
启动服务,新增user http://localhost:8080/user/addUser + 插入数据(应该用post,为方便浏览器测试,新增也是使用的GetMapping,get请求)
表中插入了数据
调用查询 http://localhost:8080/user/getUserByName?username=doudou