<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(369) 評論(0)  編輯  收藏 所屬分類: Spring Dev

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    留言簿

    隨筆分類(1)

    文章分類(52)

    好友 小山的博客

    最新隨筆

    最新評論

    主站蜘蛛池模板: 成**人免费一级毛片| 国产精品99久久免费观看| 在线观看成人免费视频| 亚洲AV成人影视在线观看| 国产妇乱子伦视频免费| 亚洲精品国产啊女成拍色拍| 51精品视频免费国产专区| 久久久久亚洲AV片无码下载蜜桃| 免费国产黄网站在线观看| 亚洲国产精品日韩在线| 国产免费久久精品99re丫y| 亚洲国产综合精品中文第一| 最近中文字幕无吗免费高清 | 国产成人精品免费视频软件| 亚洲精品日韩一区二区小说| 亚洲高清免费视频| 波霸在线精品视频免费观看| 久久夜色精品国产亚洲AV动态图 | 亚洲国产AV无码一区二区三区| 在线免费视频一区二区| 国产亚洲美女精品久久| 国产成人精品日本亚洲专区| 国产精品偷伦视频观看免费 | 蜜桃传媒一区二区亚洲AV| 免费人妻无码不卡中文字幕18禁 | 99热这里有免费国产精品| 精品亚洲成A人无码成A在线观看 | 亚洲日韩欧洲无码av夜夜摸| 午夜视频免费在线观看| 亚洲中文字幕无码一去台湾| 免费看国产一级片| 一级毛片免费播放| 综合一区自拍亚洲综合图区| 亚洲中文字幕无码永久在线| 99爱在线精品免费观看| 又大又硬又粗又黄的视频免费看| 亚洲一本综合久久| 日本免费中文字幕在线看| 黄网站免费在线观看| 亚洲精品自偷自拍无码| 国产亚洲精品自在久久|