mvn clean install 一鍵構建所有模塊,依賴傳遞自動管理。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, 可選) ← 工具類、異常、基類、公共常量
File → New → Project → Maven,勾選 Create from archetype 可選 maven-archetype-quickstart 或直接跳過創建空項目。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>
src 目錄(純聚合不產出代碼)。右鍵父工程 → New → Module → Maven → 填寫 ArtifactId(如 domain)→ 完成。對每個模塊重複。Web 模塊可選 webapp 原型或手動創建 src/main/webapp/WEB-INF/web.xml。
<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>
mybatis-spring、mybatis、commons-dbcp、mysql-connector-java、domain (模塊依賴)。spring-tx、spring-jdbc、dao、domain。spring-webmvc、javax.servlet-api (provided)、jstl、service、domain。public class UserBean implements Serializable {
private int id; private String username, password, realname;
private int userroleid; private Date createdate;
// getter/setter/toString (Lombok @Data 一鍵生成)
}
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。
<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>
<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
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; }
}
@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-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>
<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>
<beans> <import resource="classpath:spring-config-dao.xml"/> <import resource="spring-servlet.xml"/> <context:component-scan base-package="com.lp.*"/> <context:annotation-config/> </beans>
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>。MapperScannerConfigurer.basePackage 必須精確到 Mapper 接口包。@Transactional,父工程引入 spring-tx,applicationContext 加 <tx:annotation-driven/>。JRebel 或 IDEA Reload changed classes (Debug 模式下 Ctrl+F10)。https://localhost:8080/user/dologin 測試登錄/註冊流程。user 表數據寫入。