Spring例子JPetStore分析---------3jpetstore的各層之間的關系部分分析
下面就jpetstore的賬號管理部分,來分析一下jpetstore的各層之間的關系:
1。持久層分析
1.1賬號管理的iBatis的xml影射部分如下:
賬號管理涉及到四張表:
signon 存放用戶名,密碼
account, 存放用戶的基本信息
profile, 存放用戶選擇的語言,以及喜愛的商品分類
bannerdata 目前不清楚
<?xml version="1.0" encoding="UTF-8"?> <sqlMap namespace="Account"> 《賬號信息結果集》 <resultMap id="result" class="org.springframework.samples.jpetstore.domain.Account"> 《根據用戶名,獲得用戶信息》 <select id="getAccountByUsername" resultMap="result"> 《根據賬號,密碼,獲取賬號》 <select id="getAccountByUsernameAndPassword" resultMap="result"> 《獲取系統用戶名列表》 <select id="getUsernameList" resultClass="java.lang.String"> 《更新賬號信息》 <update id="updateAccount"> 《增加新賬號》 <insert id="insertAccount"> 《更新用戶profile表,其中包括用戶語言選擇,以及喜歡的動物分類 <update id="updateProfile"> 《增加用戶profile信息〉 <insert id="insertProfile"> 〈更新用戶密碼〉 <update id="updateSignon"> 〈增加用戶名,密碼到用戶登錄表Signon〉 <insert id="insertSignon"> </sqlMap> public interface AccountDao { Account getAccount(String username) throws DataAccessException; Account getAccount(String username, String password) throws DataAccessException; void insertAccount(Account account) throws DataAccessException; void updateAccount(Account account) throws DataAccessException; List getUsernameList() throws DataAccessException; } 1.3Account interface 實現: public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao { public Account getAccount(String username) throws DataAccessException { 根據用戶名,密碼,獲得賬號 public Account getAccount(String username, String password) throws DataAccessException { 創建賬號,需要更新account,signon,profile三張表 public void insertAccount(Account account) throws DataAccessException { 更新賬號,需要更新account,signon,profile三張表 public void updateAccount(Account account) throws DataAccessException { 《獲取系統用戶名列表》 } 總結: iBatis持久層使用sql-map-config.xml配置所有ibatis .xml文件 <sqlMapConfig> <sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Account.xml"/> </sqlMapConfig> 使用dataAccessContext-config.xml配置所有DAO實現 <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"> <bean id="accountDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao"> 2,持久層和業務邏輯層的耦合,業務邏輯接口中包含了AccountDAO的接口操作 public interface PetStoreFacade { Account getAccount(String username); Account getAccount(String username, String password); void insertAccount(Account account); void updateAccount(Account account); List getUsernameList(); 。。。。。。。 } public class PetStoreImpl implements PetStoreFacade, OrderService { private AccountDao accountDao; public Account getAccount(String username) { public Account getAccount(String username, String password) { public void insertAccount(Account account) { public void updateAccount(Account account) { public List getUsernameList() { 。。。。 } 總結: 持久層與業務邏輯層的耦合是在applicationContext.cml中: 為業務邏輯層提供事務管理 4表示層和業務邏輯層的耦合: 表示層和業務邏輯層的耦合是通過BaseAction來實現的,并通過接口來訪問業務邏輯對象: public abstract class BaseAction extends Action { private PetStoreFacade petStore; public void setServlet(ActionServlet actionServlet) { protected PetStoreFacade getPetStore() { } 所有的系統里面的Action都是從BaseAction派生過來的,而BaseAction的派生類中,提供了對業務邏輯對象
posted on 2007-06-18 18:05 chenguo 閱讀(375) 評論(0) 編輯 收藏 所屬分類: Spring Dev
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "
<result property="username" column="userid" columnIndex="1"/>
<result property="email" column="email" columnIndex="2"/>
<result property="firstName" column="firstname" columnIndex="3"/>
<result property="lastName" column="lastname" columnIndex="4"/>
<result property="status" column="status" columnIndex="5"/>
<result property="address1" column="addr1" columnIndex="6"/>
<result property="address2" column="addr2" columnIndex="7"/>
<result property="city" column="city" columnIndex="8"/>
<result property="state" column="state" columnIndex="9"/>
<result property="zip" column="zip" columnIndex="10"/>
<result property="country" column="country" columnIndex="11"/>
<result property="phone" column="phone" columnIndex="12"/>
<result property="languagePreference" column="langpref" columnIndex="13"/>
<result property="favouriteCategoryId" column="favcategory" columnIndex="14"/>
<result property="listOption" column="mylistopt" columnIndex="15"/>
<result property="bannerOption" column="banneropt" columnIndex="16"/>
<result property="bannerName" column="bannername" columnIndex="17"/>
</resultMap>
select
signon.username as userid,
account.email,
account.firstname,
account.lastname,
account.status,
account.addr1,
account.addr2,
account.city,
account.state,
account.zip,
account.country,
account.phone,
profile.langpref,
profile.favcategory,
profile.mylistopt,
profile.banneropt,
bannerdata.bannername
from account, profile, signon, bannerdata
where account.userid = #value#
and signon.username = account.userid
and profile.userid = account.userid
and profile.favcategory = bannerdata.favcategory
</select>
select
signon.username as userid,
account.email,
account.firstname,
account.lastname,
account.status,
account.addr1,
account.addr2,
account.city,
account.state,
account.zip,
account.country,
account.phone,
profile.langpref,
profile.favcategory,
profile.mylistopt,
profile.banneropt,
bannerdata.bannername
from account, profile, signon, bannerdata
where account.userid = #username#
and signon.password = #password#
and signon.username = account.userid
and profile.userid = account.userid
and profile.favcategory = bannerdata.favcategory
</select>
select username as value from signon
</select>
update account set email = #email#, firstname = #firstName#, lastname =
#lastName#, status = #status#, addr1 = #address1#, addr2 =
#address2:varchar#, city = #city#, state = #state#, zip = #zip#,
country = #country#, phone = #phone# where userid = #username#
</update>
insert into account (email, firstname, lastname, status, addr1, addr2,
city, state, zip, country, phone, userid) values (#email#, #firstName#,
#lastName#, #status#, #address1#, #address2:varchar#, #city#, #state#,
#zip#, #country#, #phone#, #username#)
</insert>
update profile set langpref = #languagePreference#, favcategory =
#favouriteCategoryId#, mylistopt = #listOptionAsInt#, banneropt =
#bannerOptionAsInt# where userid = #username#
</update>
insert into profile (langpref, favcategory, mylistopt, banneropt,
userid) values (#languagePreference#, #favouriteCategoryId#,
#listOptionAsInt#, #bannerOptionAsInt#, #username#)
</insert>
update signon set password = #password# where username = #username#
</update>
insert into signon (password,username) values (#password#,#username#)
</insert>
1.2 Account為賬號管理的POJO類,AccountDao 為賬號管理interface,規定了一系列方法:
return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsername", username);
}
Account account = new Account();
account.setUsername(username);
account.setPassword(password);
return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsernameAndPassword", account);
}
getSqlMapClientTemplate().insert("insertAccount", account);
getSqlMapClientTemplate().insert("insertProfile", account);
getSqlMapClientTemplate().insert("insertSignon", account);
}
getSqlMapClientTemplate().update("updateAccount", account, 1);
getSqlMapClientTemplate().update("updateProfile", account, 1);
if (account.getPassword() != null && account.getPassword().length() > 0) {
getSqlMapClientTemplate().update("updateSignon", account, 1);
}
}
public List getUsernameList() throws DataAccessException {
return getSqlMapClientTemplate().queryForList("getUsernameList", null);
}
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Category.xml"/>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Product.xml"/>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Item.xml"/>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Order.xml"/>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/LineItem.xml"/>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Sequence.xml"/>
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
業務邏輯對象PetStoreImpl 實現了對accountDao的再次封裝
return this.accountDao.getAccount(username);
}
return this.accountDao.getAccount(username, password);
}
this.accountDao.insertAccount(account);
}
this.accountDao.updateAccount(account);
}
return this.accountDao.getUsernameList();
}
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<bean id="petStore" parent="baseTransactionProxy">
<property name="target">
<bean class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>
</property>
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
return petStore;
}
PetStoreFacade 的訪問。