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