首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

IntelliJ IDEA 多模塊項目實戰:從父工程創建到 Spring+MyBatis 分層架構落地

     編輯:Java 綜合教學

為什麼選擇 IDEA 多模塊?

  • 職責清晰分離:domain/dao/service/web/common 獨立編譯、獨立依賴、獨立測試。
  • Maven 聚合構建:父工程 mvn clean install 一鍵構建所有模塊,依賴傳遞自動管理。
  • IDE 支持完美:模塊間跳轉、重構、依賴圖谱、Run/Debug 配置隔離。

項目結構規劃

parent-project (pom)          ← 聚合父工程,packaging=pom
├── domain (jar)              ← 實體類、DTO、VO、常量
├── dao (jar)                 ← MyBatis Mapper 接口、XML、DAO 實現
├── service (jar)             ← Service 接口/實現、事務邏輯
├── web (war)                 ← Controller、JSP、SpringMVC 配置、web.xml
└── common (jar, 可選)        ← 工具類、異常、基類、公共常量

步驟 1:創建父工程

  1. File → New → Project → Maven,勾選 Create from archetype 可選 maven-archetype-quickstart 或直接跳過創建空項目。
  2. 修改 pom.xml:
    <packaging>pom</packaging>
    <modules>
      <module>domain</module>
      <module>dao</module>
      <module>service</module>
      <module>web</module>
    </modules>
    <properties>
      <spring.version>5.3.30</spring.version>
      <mybatis.version>3.5.13</mybatis.version>
      <mysql.version>8.0.33</mysql.version>
    </properties>
    <dependencyManagement> ... 統一版本 ... </dependencyManagement>
  3. 刪除父工程自動生成的 src 目錄(純聚合不產出代碼)。

步驟 2:創建子模塊

右鍵父工程 → New → Module → Maven → 填寫 ArtifactId(如 domain)→ 完成。對每個模塊重複。Web 模塊可選 webapp 原型或手動創建 src/main/webapp/WEB-INF/web.xml。

步驟 3:依賴配置(父工程 dependencyManagement 統一版本)

<dependencyManagement>
  <dependencies>
    <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency>
    <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>${mybatis.version}</version></dependency>
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency>
    <dependency><groupId>commons-dbcp</groupId><artifactId>commons-dbcp</artifactId><version>1.4</version></dependency>
    <dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>
    <dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>
  </dependencies>
</dependencyManagement>

各模塊 pom.xml 關鍵依賴(只聲明 groupId+artifactId,版本繼承父工程)

  • domain:無額外依賴(或 Lombok)。
  • dao:mybatis-spring、mybatis、commons-dbcp、mysql-connector-java、domain (模塊依賴)。
  • service:spring-tx、spring-jdbc、dao、domain。
  • web:spring-webmvc、javax.servlet-api (provided)、jstl、service、domain。

步驟 4:代碼實戰(核心片段)

domain - UserBean

public class UserBean implements Serializable {
    private int id; private String username, password, realname;
    private int userroleid; private Date createdate;
    // getter/setter/toString (Lombok @Data 一鍵生成)
}

dao - UserDao + Mapper XML

public interface UserDao {
    int add(UserBean user);
    int isExistUser(UserBean user);
}
<mapper namespace="com.lp.rpc.dao.UserDao">
  <insert id="add" parameterType="UserBean" keyProperty="id" useGeneratedKeys="true">
    INSERT INTO user(username,password,realname,userroleid,createdate)
    VALUES (#{username},#{password},#{realname},#{userroleid},#{createdate})
  </insert>
  <select id="isExistUser" parameterType="UserBean" resultType="int">
    SELECT COUNT(1) FROM user WHERE username=#{username} AND password=#{password}
  </select>
</mapper>

Mapper XML 放在 src/main/resources/sql/UserDao.xml。

dao - Spring 配置 (spring-config-dao.xml)

<beans>
  <import resource="spring-config-datasource.xml"/>
  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mapperLocations" value="classpath:sql/*.xml"/>
  </bean>
  <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.lp.rpc.dao"/>
    <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  </bean>
</beans>

datasource 配置 (spring-config-datasource.xml)

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql://localhost:3306/usermanagerdb?useUnicode=true"/>
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
  <property name="initialSize" value="5"/><property name="maxActive" value="200"/>
  <property name="maxWait" value="10000"/><property name="maxIdle" value="10"/><property name="minIdle" value="5"/>
</bean>

service - UserService

@Service
public class UserServiceImpl implements UserService {
    @Autowired private UserDao userDao;
    @Override public boolean add(UserBean u) { return userDao.add(u) >= 0; }
    @Override public boolean isExist(UserBean u) { return userDao.isExistUser(u) > 0; }
}

web - Controller + JSP + 配置

@Controller @RequestMapping("/user/")
public class UserController {
    @Autowired private UserService userService;

    @PostMapping("dologin")
    public ModelAndView login(HttpServletRequest req) {
        UserBean u = new UserBean();
        u.setUsername(req.getParameter("username"));
        u.setPassword(req.getParameter("password"));
        return userService.isExist(u) ? new ModelAndView("successful") : new ModelAndView("add");
    }

    @PostMapping("save")
    public String save(HttpServletRequest req) {
        UserBean u = new UserBean();
        u.setUsername(req.getParameter("username"));
        u.setPassword(req.getParameter("password"));
        u.setRealname(req.getParameter("realname"));
        u.setUserroleid(Integer.parseInt(req.getParameter("userroleid")));
        u.setCreatedate(new Date());
        return userService.add(u) ? "successful" : "error";
    }
}

JSP 放在 src/main/webapp/WEB-INF/jsp/,add.jsp 表單提交到 /user/save。

web.xml

<web-app version="3.0">
  <listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
  <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value></context-param>
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/applicationContext.xml</param-value></init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

spring-servlet.xml (視圖解析器)

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/jsp/"/>
  <property name="suffix" value=".jsp"/>
  <property name="contentType" value="text/html;charset=UTF-8"/>
</bean>

applicationContext.xml (總裝配)

<beans>
  <import resource="classpath:spring-config-dao.xml"/>
  <import resource="spring-servlet.xml"/>
  <context:component-scan base-package="com.lp.*"/>
  <context:annotation-config/>
</beans>

關鍵避坑指南

  1. 資源文件未編譯到 target:IDEA 默認不編譯 src/main/resources 下的 XML。右鍵模塊 → Open Module Settings → Compiler → Resource Patterns 添加 ?*.xml,或在 pom 加 <resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>。
  2. Mapper 掃描路徑:MapperScannerConfigurer.basePackage 必須精確到 Mapper 接口包。
  3. 事務管理:Service 層需 @Transactional,父工程引入 spring-tx,applicationContext 加 <tx:annotation-driven/>。
  4. 熱部署:安裝 JRebel 或 IDEA Reload changed classes (Debug 模式下 Ctrl+F10)。

運行效果驗證

  1. 啟動 Tomcat (IDEA 配置 Tomcat Server,Deployment 加 web 模塊 exploded war)。
  2. 訪問 https://localhost:8080/user/dologin 測試登錄/註冊流程。
  3. 數據庫驗證 user 表數據寫入。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved