云自無心水自閑

          天平山上白云泉,云自無心水自閑。何必奔沖山下去,更添波浪向人間!
          posts - 288, comments - 524, trackbacks - 0, articles - 6
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理
          在數據庫的設計中,字典項是經常使用的技巧。
          比如在一個圖書館系統中,書籍表(Book)會有一個分類字段,這時候我們一般會單獨建立一張分類表(Category),在書籍表只保存分類表的ID。
          在用戶界面上顯示書籍明細的時候,會要求顯示CategoryID在Category表中對應的名稱。
          這樣通常的做法是把Book和Category兩張表進行關聯。
          但在實際應用中,Category一般都是Cache在應用服務器端,再使用數據表的連接就不夠高效。
          我的做法是這樣的:在iBatis中使用SqlMap從表中將數據取出,此時不使用數據表的連接。
          package com.demo;
          public class Book {
                
          /* 省略了getter和setter方法 */
                  private int id;
                  
          private String name;
                  
          private int categoryId;
                  
          private String author;
          }


          package com.demo;

          public class Category {
                 
          private static Map<Integer, Category> cacheMap;

                  
          /* 省略了這兩個屬性的getter和setter方法 */

                  
          private int id;
                  
          private String name;
                 
          public static Category getCategory(int id) {
                       init();
                      
          return cacheMap.get(id);
                  }
           
                  
          public static Map<Integer, Category> getCategoryMap() {
                      init();
                     
          return cacheMap();
                  }

                 
          private init() {
                      
          if ( cacheMap != null ) return;

                      
          // the code to load category from datebase
                      
          // 在這里為了演示的需要,使用以下代碼

                       cacheMap 
          = new HashMap<Integer, Category>();
                       Category category 
          = new Category();
                       category.setId(
          1);
                       category.setName(
          "Fiction");
                       cacheMap.put(
          1, category);
           
                       category 
          = new Category();
                       category.setId(
          2);
                       category.setName(
          "Cartoon");
                  }
          }



          package com.demo;

          public class BookAction  {
                  
          /* 省略了屬性的getter和setter方法 */
                  Book book;

                  
          public String execute() {
                          book 
          = new Book();
                          book.setId(
          1);
                          book.setName(
          "Thinking in java");
                          book.setCategoryId(
          1);
                          bookList.add(book);
                          
                          
          return SUCCESS;                
                  }
          }

          JSP:
          <%@ taglib prefix="s" uri="/struts-tags"%>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
           
          <head>
            
          <s:head />
           
          </head>

           
          <body>

            
          <table border="1">
              
          <tr>
               
          <td>
                
          <s:text name="page.label.userName" />
               
          </td>
               
          <td>
                
          <s:property value="book.name" />
               
          </td>
              
          </tr>
              
          <tr>
               
          <td>
                
          <s:text name="page.label.category" />
               
          </td>
               
          <td>
                 
          <s:property value="@com.demo.Category@getCategory(book.categoryId).getName()"/></td>
              
          </tr>
           
          </body>
          </html>






          評論

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-17 17:57 by 雨奏
          @云自無心水自閑

          其實如果修改一下Book為

          public class Book {
          /* 省略了getter和setter方法 */
          private int id;
          private String name;
          private Category category; //Modify code here
          private String author;
          }

          (當然你的action、dao等需要進行相應的修改)

          可以考慮在JSP頁面中這樣訪問:

          <s:property value="book.category.name"/>

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值[未登錄]  回復  更多評論   

          2008-03-17 19:00 by 云自無心水自閑
          @雨奏
          這篇文章主要就是想利用數據的緩存簡化數據存取。
          Category這樣的緩存方法只是一個示例,其實數據完全可以以其他的方式緩存,這里只是介紹有這么一種方法可以使用。

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-17 21:06 by 長江三峽
          學習

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 00:12 by Edward's
          ognl原來可以這樣用啊

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 09:37 by 雨奏
          @云自無心水自閑
          沒錯,數據緩存方式有多種,你的文章也確實展現了ognl的更多的用法。我只是提出一點個人的看法供參考:就你提供的代碼來看,感覺換一種方式似乎更簡潔、更易理解一點

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 09:59 by hejianhuacn
          webwork2 里也支持“@com.demo.Category@getCategory(book.categoryId).getName()"的語法?看來要試一下了

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 20:55 by 云自無心水自閑
          @雨奏
          想請教一下,你準備如何修改action和Dao? 
          即如何獲得book實例中category的值呢?

          # re: 使用struts2中的ognl表達式顯示數據表字典項的值  回復  更多評論   

          2008-03-18 21:53 by 雨奏
          @云自無心水自閑
          因為我使用的是Hibernate,當把Category作為Book的一個屬性,獲得一個Book實例后可直接訪問該屬性取得相應的Category,Hibernate會自動地加載它(如果設置了laze initialization,Hibernate會在程序第一次訪問該屬性時加載,否則加載Book時同時加載)
          我才注意到你使用的是iBatis,很抱歉我對它并不了解,我提到的這種做法可能并不適合
          主站蜘蛛池模板: 达尔| 阿合奇县| 额尔古纳市| 汨罗市| 新余市| 翼城县| 方城县| 淳安县| 民勤县| 浑源县| 凌云县| 镇康县| 勐海县| 安多县| 镇安县| 贵南县| 鹤庆县| 南澳县| 太和县| 五原县| 比如县| 渑池县| 江山市| 裕民县| 舞钢市| 柘荣县| 班戈县| 梁山县| 奈曼旗| 广元市| 肃宁县| 沙坪坝区| 颍上县| 渝中区| 饶河县| 广元市| 八宿县| 阿克| 法库县| 大足县| 黔江区|