本文記錄依照《Spring 3.x 企業應用開發實戰》一書,從零搭建一個基於 Spring + Spring MVC + JDBC Template 的用戶登錄模塊,涵蓋分層架構、數據庫設計、DAO/Service/Web 層代碼、配置文件及單元測試。
MySQL 5.x,兩張表:
user:存儲用戶基本信息(id、user_name、password、credits、last_ip、last_time)。user_log:記錄登錄日誌(user_id、ip、log_time)。使用 JdbcTemplate 簡化 JDBC 操作,配合 @Repository、@Autowired 註解。
@Repository
public class UserDao {
@Autowired private JdbcTemplate jdbcTemplate;
public int getMatchCount(String username, String password) {
String sql = "SELECT COUNT(*) FROM user WHERE user_name=? AND password=?";
return jdbcTemplate.queryForInt(sql, username, password);
}
public User findUserByUserName(final String username) {
String sql = "SELECT id, user_name, credits FROM user WHERE user_name=?";
final User user = new User();
jdbcTemplate.query(sql, new Object[]{username}, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
user.setId(rs.getInt("id"));
user.setUserName(rs.getString("user_name"));
user.setCredits(rs.getInt("credits"));
}
});
return user;
}
public void updateLoginInfo(User user) {
String sql = "UPDATE user SET credits=?, last_ip=?, last_time=? WHERE id=?";
jdbcTemplate.update(sql, user.getCredits(), user.getLastIp(), user.getLastTime(), user.getId());
}
}
LoginLogDao 同理,僅實現 insertLoginLog 插入日誌。
標註 @Service,注入 DAO,編排登錄、查詢、積分更新與日誌記錄邏輯,配合聲明式事務。
@Service
public class UserService {
@Autowired private UserDao userDao;
@Autowired private LoginLogDao loginLogDao;
public boolean userLogin(String username, String password) {
return userDao.getMatchCount(username, password) > 0;
}
public User findUserByUserName(String username) {
return userDao.findUserByUserName(username);
}
public void successLoginLog(User user) {
if (user != null) {
user.setCredits(user.getCredits() + 5);
UserLog log = new UserLog();
log.setUserId(user.getId());
log.setIp(user.getLastIp());
log.setLogTime(user.getLastTime());
userDao.updateLoginInfo(user);
loginLogDao.insertLoginLog(log);
}
}
}
applicationContext.xml 包含:
<context:component-scan base-package="com.zwy.dao,com.zwy.service"/>JdbcTemplate Bean。DataSourceTransactionManager + AOP 切面 execution(* com.zwy.service..*(..)) 實現聲明式事務。使用 SpringJUnit4ClassRunner 載入容器,注入 UserService 驗證登錄、查詢、積分更新流程。
LoginController 處理 /index.html 與 /loginCheck.html,表單數據自動綁定到 LoginCommand,登錄成功存入 Session、跳轉主頁,失敗返回錯誤信息。
ContextLoaderListener 啟動根容器。DispatcherServlet 處理 *.html 請求,配置 InternalResourceViewResolver 指向 /WEB-INF/jsp/*.jsp。完整代碼結構清晰,展示了 Spring 3.x 經典「三層架構 + JDBC Template + 聲明式事務 + Spring MVC」的最佳實踐,適合初學者快速上手企業級開發模式。