Spring例子JPetStore分析---------3jpetstore的各層之間的關系部分分析

          下面就jpetstore的賬號管理部分,來分析一下jpetstore的各層之間的關系:

          1。持久層分析

          1.1賬號管理的iBatis的xml影射部分如下:

          賬號管理涉及到四張表:

          signon 存放用戶名,密碼

          account, 存放用戶的基本信息

           profile,  存放用戶選擇的語言,以及喜愛的商品分類

           bannerdata 目前不清楚

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" "

          <sqlMap namespace="Account">

          《賬號信息結果集》

            <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>

          《根據用戶名,獲得用戶信息》

            <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>

          《根據賬號,密碼,獲取賬號》

            <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>

          《獲取系統用戶名列表》

            <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,規定了一系列方法:

          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 {
              return (Account) getSqlMapClientTemplate().queryForObject("getAccountByUsername", username);
            }

          根據用戶名,密碼,獲得賬號

            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);
            }

          創建賬號,需要更新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);
              }
            }

          《獲取系統用戶名列表》
           
           public List getUsernameList() throws DataAccessException {
            return getSqlMapClientTemplate().queryForList("getUsernameList", null);
           }

          }

          總結:

          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實現

          <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,持久層和業務邏輯層的耦合,業務邏輯接口中包含了AccountDAO的接口操作

          public interface PetStoreFacade {

           Account getAccount(String username);

           Account getAccount(String username, String password);

           void insertAccount(Account account);

           void updateAccount(Account account);

           List getUsernameList();

          。。。。。。。

          }

          業務邏輯對象PetStoreImpl 實現了對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();
           }

          。。。。

          }

          總結:

          持久層與業務邏輯層的耦合是在applicationContext.cml中:

          為業務邏輯層提供事務管理


          <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表示層和業務邏輯層的耦合:

          表示層和業務邏輯層的耦合是通過BaseAction來實現的,并通過接口來訪問業務邏輯對象:

          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;
           }

          }

          所有的系統里面的Action都是從BaseAction派生過來的,而BaseAction的派生類中,提供了對業務邏輯對象
           PetStoreFacade 的訪問。

          posted on 2007-06-18 18:05 chenguo 閱讀(374) 評論(0)  編輯  收藏 所屬分類: Spring Dev

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          留言簿

          隨筆分類(1)

          文章分類(52)

          好友 小山的博客

          最新隨筆

          最新評論

          主站蜘蛛池模板: 胶州市| 丽江市| 湖南省| 延吉市| 萍乡市| 梁平县| 昔阳县| 治县。| 射阳县| 临洮县| 襄汾县| 衡阳市| 平塘县| 台中市| 永宁县| 乌鲁木齐县| 个旧市| 惠州市| 鹤壁市| 辽宁省| 江山市| 报价| 隆化县| 深水埗区| 武穴市| 嘉善县| 博湖县| 白玉县| 慈溪市| 塔城市| 邓州市| 定边县| 吉林市| 中卫市| 平泉县| 肇州县| 宁国市| 封开县| 雷州市| 金阳县| 南部县|