三層 Web 應用經典架構:Struts (Web) → Spring (Service/事務) → Hibernate (DAO/持久)。本文為系列第一部分,涵蓋資料庫建表、Hibernate/Spring 設定、DAO 介面與實作、JUnit 測試 DAO CRUD 操作。
src/
com.jandar.model/ # 實體類別
com.jandar.service.dao/ # DAO 介面
com.jandar.service.dao.hibernate/ # DAO 實作
test/ # JUnit 測試
WebRoot/
page/ # JSP
WEB-INF/lib/ # Struts/Spring/Hibernate JARs
CREATE TABLE app_user (
id NUMBER NOT NULL PRIMARY KEY,
firstname VARCHAR2(32),
lastname VARCHAR2(32)
);
// User.java (extends BaseObject 含 toString/equals/hashCode)
public class User extends BaseObject {
private Long id;
private String firstName;
private String lastName;
// getter/setter...
}
// IDAO.java (標記介面)
public interface IDAO {}
// IUserDAO.java
public interface IUserDAO extends IDAO {
List getUsers();
User getUser(Integer userId);
void saveUser(User user);
void removeUser(Integer id);
}
// UserDaoHibernate.java
public class UserDaoHibernate extends HibernateDaoSupport implements IUserDAO {
private Log log = LogFactory.getLog(getClass());
public List getUsers() {
return getHibernateTemplate().find("from User");
}
public User getUser(Integer id) {
return (User) getHibernateTemplate().get(User.class, id);
}
public void saveUser(User user) {
getHibernateTemplate().saveOrUpdate(user);
}
public void removeUser(Integer id) {
Object user = getHibernateTemplate().load(User.class, id);
getHibernateTemplate().delete(user);
}
}
com/jandar/model/User.hbm.xml
org.hibernate.dialect.OracleDialect
true
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED,readOnly
public class UserDaoTest extends TestCase {
private ApplicationContext ctx;
private IUserDAO userDAO;
protected void setUp() {
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
userDAO = (IUserDAO) ctx.getBean("userDAO");
}
public void testCRUD() {
// Create
User u = new User(); u.setId(1); u.setFirstName("John"); u.setLastName("Doe");
userDAO.saveUser(u);
// Read
assertEquals("John", userDAO.getUser(1).getFirstName());
assertEquals(1, userDAO.getUsers().size());
// Update
u.setFirstName("Jane"); userDAO.saveUser(u);
assertEquals("Jane", userDAO.getUser(1).getFirstName());
// Delete
userDAO.removeUser(1);
assertEquals(0, userDAO.getUsers().size());
}
}
https://www.binamics.com/hibernatesynchttps://springframework.sourceforge.net/spring-ide/eclipse/updatesite/下一部分將介紹 Service 層業務邏輯、Struts Action 整合與 JSP 頁面實作。