核心 J2EE 模式建議:將所有資料源訪問封裝在公共 API(介面)中。應用程式依賴介面,具體實現可替換(SQL Maps、Hibernate、XML 檔案等),實現持久化機制與業務邏輯解耦。
複製 ibatis-dao-2.jar 至 WEB-INF/lib。
<?xml version="1.0" encoding="UTF-8"?>
<daoConfig>
<context id="sqlmap">
<property name="SqlMapConfigResource"
value="com/sample/contact/dao/sqlmap/SqlMapConfig.xml"/>
<dao interface="com.sample.contact.dao.ContactDAO"
implementation="com.sample.contact.dao.sqlmap.SQLMapContactDAO"/>
</context>
</daoConfig>
<context>:定義一種儲存機制,含事務管理器(此處省略)<dao>:綁定介面與具體實現類package com.sample.contact.dao;
import com.ibatis.dao.client.DAO;
public interface ContactDAO extends DAO {
int insertContact(Contact contact);
int updateContact(Contact contact);
Contact selectContact(int contactId);
int deleteContact(int contactId);
}
方法參數使用 Contact DTO 物件,封裝資料傳遞。
package com.sample.contact.dao.sqlmap;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;
import com.sample.contact.dao.ContactDAO;
import com.sample.contact.domain.Contact;
public class SQLMapContactDAO extends SqlMapDaoTemplate implements ContactDAO {
public SQLMapContactDAO(DaoManager daoManager) { super(daoManager); }
public int deleteContact(int contactId) {
return delete("deleteContact", new Integer(contactId));
}
public int insertContact(Contact contact) {
Integer id = (Integer) insert("insertContact", contact);
return contact.getContactId();
}
public Contact selectContact(int contactId) {
return (Contact) queryForObject("getContact", new Integer(contactId));
}
public int updateContact(Contact contact) {
return update("updateContact", contact);
}
}
關鍵優勢:無需手寫連線獲取、事務邊界、SQL Map 初始化——SqlMapDaoTemplate 封裝了樣板代碼,開發者專注業務邏輯。
public class ContactSelectAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
Contact contactForm = (Contact) form;
Reader reader = Resources.getResourceAsReader("DAOMap.xml");
DaoManager daoManager = DaoManagerBuilder.buildDaoManager(reader);
ContactDAO contactDAO = (ContactDAO) daoManager.getDao(ContactDAO.class, "sqlmap");
request.setAttribute("contactDetail",
contactDAO.selectContact(contactForm.getContactId()));
return mapping.findForward("success");
}
}
生產建議:DaoManager 應在應用啟動時初始化一次(如 Struts PlugIn、ServletContextListener),而非每請求構建。
後續將深入:DAO 框架內部構造、事務管理機制、自訂事務管理器實現。