<sqlMap namespace="Account">
《賬號信息結(jié)果集》
<resultMap id="result" class="org.springframework.samples.jpetstore.domain.Account">
<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>
《根據(jù)用戶名,獲得用戶信息》
<select id="getAccountByUsername" resultMap="result">
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>
《根據(jù)賬號,密碼,獲取賬號》
<select id="getAccountByUsernameAndPassword" resultMap="result">
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>
《獲取系統(tǒng)用戶名列表》
<select id="getUsernameList" resultClass="java.lang.String">
select username as value from signon
</select>
《更新賬號信息》
<update id="updateAccount">
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 id="insertAccount">
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>
《更新用戶profile表,其中包括用戶語言選擇,以及喜歡的動物分類
<update id="updateProfile">
update profile set langpref = #languagePreference#, favcategory =
#favouriteCategoryId#, mylistopt = #listOptionAsInt#, banneropt =
#bannerOptionAsInt# where userid = #username#
</update>
《增加用戶profile信息〉
<insert id="insertProfile">
insert into profile (langpref, favcategory, mylistopt, banneropt,
userid) values (#languagePreference#, #favouriteCategoryId#,
#listOptionAsInt#, #bannerOptionAsInt#, #username#)
</insert>
〈更新用戶密碼〉
<update id="updateSignon">
update signon set password = #password# where username = #username#
</update>
〈增加用戶名,密碼到用戶登錄表Signon〉
<insert id="insertSignon">
insert into signon (password,username) values (#password#,#username#)
</insert>
</sqlMap>
1.2 Account為賬號管理的POJO類,AccountDao 為賬號管理interface,規(guī)定了一系列方法:
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 實現(xiàn):
public class SqlMapAccountDao extends SqlMapClientDaoSupport implements AccountDao {
public Account getAccount(String username) throws DataAccessException {
return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsername", username);
}
根據(jù)用戶名,密碼,獲得賬號
public Account getAccount(String username, String password) throws DataAccessException {
Account account = new Account();
account.setUsername(username);
account.setPassword(password);
return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsernameAndPassword", account);
}
創(chuàng)建賬號,需要更新account,signon,profile三張表
public void insertAccount(Account account) throws DataAccessException {
getSqlMapClientTemplate().insert("insertAccount", account);
getSqlMapClientTemplate().insert("insertProfile", account);
getSqlMapClientTemplate().insert("insertSignon", account);
}
更新賬號,需要更新account,signon,profile三張表
public void updateAccount(Account account) throws DataAccessException {
getSqlMapClientTemplate().update("updateAccount", account, 1);
getSqlMapClientTemplate().update("updateProfile", account, 1);
if (account.getPassword() != null && account.getPassword().length() > 0) {
getSqlMapClientTemplate().update("updateSignon", account, 1);
}
}
《獲取系統(tǒng)用戶名列表》
public List getUsernameList() throws DataAccessException {
return getSqlMapClientTemplate().queryForList("getUsernameList", null);
}
}
總結(jié):
iBatis持久層使用sql-map-config.xml配置所有ibatis .xml文件
<sqlMapConfig>
<sqlMap resource="org/springframework/samples/jpetstore/dao/ibatis/maps/Account.xml"/>
<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"/>
</sqlMapConfig>
使用dataAccessContext-config.xml配置所有DAO實現(xiàn)
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="accountDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapAccountDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
2,持久層和業(yè)務(wù)邏輯層的耦合,業(yè)務(wù)邏輯接口中包含了AccountDAO的接口操作
public interface PetStoreFacade {
Account getAccount(String username);
Account getAccount(String username, String password);
void insertAccount(Account account);
void updateAccount(Account account);
List getUsernameList();
。。。。。。。
}
業(yè)務(wù)邏輯對象PetStoreImpl 實現(xiàn)了對accountDao的再次封裝
public class PetStoreImpl implements PetStoreFacade, OrderService {
private AccountDao accountDao;
public Account getAccount(String username) {
return this.accountDao.getAccount(username);
}
public Account getAccount(String username, String password) {
return this.accountDao.getAccount(username, password);
}
public void insertAccount(Account account) {
this.accountDao.insertAccount(account);
}
public void updateAccount(Account account) {
this.accountDao.updateAccount(account);
}
public List getUsernameList() {
return this.accountDao.getUsernameList();
}
。。。。
}
總結(jié):
持久層與業(yè)務(wù)邏輯層的耦合是在applicationContext.cml中:
為業(yè)務(wù)邏輯層提供事務(wù)管理
<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>
4表示層和業(yè)務(wù)邏輯層的耦合:
表示層和業(yè)務(wù)邏輯層的耦合是通過BaseAction來實現(xiàn)的,并通過接口來訪問業(yè)務(wù)邏輯對象:
public abstract class BaseAction extends Action {
private PetStoreFacade petStore;
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
protected PetStoreFacade getPetStore() {
return petStore;
}
}
所有的系統(tǒng)里面的Action都是從BaseAction派生過來的,而BaseAction的派生類中,提供了對業(yè)務(wù)邏輯對象
PetStoreFacade 的訪問。