SqlMapCient 類提供了執行所有 mapped statement 的 API。這些方法如下:
1 public int insert(String statementName, Object parameterObject) 2 throws SQLException 3 4 5 6 7 public int update(String statementName, Object parameterObject) 8 throws SQLException 9 10 11 public int delete(String statementName, Object parameterObject) 12 throws SQLException 13 14 15 public Object queryForObject(String statementName, Object parameterObject) 16 throws SQLException 17 18 public Object queryForObject(String statementName, Object parameterObject, Object resultObject) throws SQLException 19 20 21 public List queryForList(String statementName, Object parameterObject) 22 throws SQLException 23 24 25 public List queryForList(String statementName, Object parameterObject, int skipResults, int maxResults) 26 throws SQLException 27 28 29 public List queryForList (String statementName, 30 31 Object parameterObject, RowHandler rowHandler) 32 33 throws SQLException 34 35 36 public PaginatedList queryForPaginatedList(String statementName, Object parameterObject, int pageSize) 37 throws SQLException 38 39 40 public Map queryForMap (String statementName, Object parameterObject, String keyProperty) 41 throws SQLException 42 43 44 public Map queryForMap (String statementName, Object parameterObject, String keyProperty, String valueProperty) 45 throws SQLException
在上面的每個方法中,Mapped Statement 的名稱作為第一個參數。這個名稱要對應<statement>的名稱屬性。另外,第二個參數總是參數對象。如果不需要參數對象,可以為
null。除了這些之外,上面的方法就沒有相同的了。下面簡單地介紹一下它們的不同之處。
* insert( ),update( ),delete( )
這些方法用於數據更新(即非查詢語句)。這就是說,使用下面的查詢方法來執行數據更新操作並不是不可能。但這顯得很奇怪,並明顯依賴於 JDBC 的驅動程序。執行 update(), 返回受影響數據記錄的數目。
* queryForObject( )
queryForObject()方法有兩個版本。一個返回查詢得到的新對象,另一個用一個事先生成 的對象作為參數。后者對於使用多個查詢為對象賦值很有用。
* queryForList( )
queryForList()方法也有三個版本。第一個執行一個查詢並返回所有的查詢結果。第二個 允許指定跳過結果的數目(即開始點)和返回結果的最大數目。對於查詢一個數量很大的結 果集,並且不想返回所有的數據時很有用。最后一個版本的 queryForList()方法需要一個行處理器(row handler)作為輸入參數。這 個方法可以讓您使用結果對象,而不是數據表的行和列來逐行地處理查詢結果集。這個方法 的參數除了例行的名稱和參數對象外,還包括了一個實現了 RowHandler 接口的類的實例。 RowHandler 接口只有一個方法:
public void handleRow (Object object, List list);對於每一行從數據庫中返回的數據,RowHandler 接口的方法都會被執行。這種處理數 據的方法,簡潔而具有擴展性。
* queryForPaginatedList( )
對於要返回一個可以向前和向后翻頁的數據子集,queryForPaginatedList()方法很有用, 它返回一個可管理的 List 對象。通常用於只顯示一部分查詢結果的用戶界面。一個常見的 例子是,搜索引擎找到了 10000 條結果,但每次只顯示其中的 100 條。PaginatedList 接口包 含了向前和向后翻頁的方法(nextPage(),previousPage(),gotoPage()),並提供了檢查翻頁 狀態的方 法( isFirstPage() , isMiddlePage() , isLastPage() , isPreviousPageAvailable() , getPageIndex(),getPageSize())。雖然不能從 PaginatedList 接口得到查詢結果集的總數,但 這個總數可以再執行一個簡單的語句 count()來得到。否則,PaginatedList 接口會大大的降低 性能。
* queryForMap( )
queryForMap()方法將結果集放在一個Map 對象中,這個 Map 對象用一個傳入參數 keyProperty 作為 key 值。例如,要讀入一批 Employee 對象,您可以將這些 Employee 對象放在一個用 employeeNumber 屬性作為 key 值 的 Map 對象中。Map 對象的值可以是整個 Employee 對象,也可以是 Employee 對象的另一 個屬性,屬性的名稱由第二個參數 valueProperty 指定。例如,您可能只是需要一個 Map 對 象,用員工號作為 key 值,員工姓名作為 value 值。不要把它和用 Map 作為結果對象的概念 混淆。這個方法可以使用 Java Bean 和 Map(或基本類型的包裝類,但不可能這樣用)作為 結果對象。
代碼實例:
例子1:執行update(insert,update,delete)
1 sqlMap.startTransaction(); 2 Product product = new Product(); product.setId (1); product.setDescription (“Shih Tzu”); 3 int rows = sqlMap.insert (“insertProduct”, product); 4 sqlMap.commitTransaction();
例子2:查詢成對象(select)
1 sqlMap.startTransaction(); 2 Integer key = new Integer (1); 3 Product product = (Product)sqlMap.queryForObject (“getProduct”, key); sqlMap.commitTransaction();
例子3:用預賦值的結果對象查詢成對象(select)
1 sqlMap.startTransaction(); 2 Customer customer = new Customer(); sqlMap.queryForObject(“getCust”, parameterObject, customer);
sqlMap.queryForObject(“getAddr”, parameterObject, customer); sqlMap.commitTransaction();
例子4:查詢成對象List(select)
1 sqlMap.startTransaction(); 2 List list = sqlMap.queryForList (“getProductList”, null); 3 sqlMap.commitTransaction();
例子5:用結果集邊界查詢成對象List(select)
1 sqlMap.startTransaction(); 2 List list = sqlMap.queryForList (“getProductList”, null, 0, 40); sqlMap.commitTransaction();
例子6:用RowHandler執行查詢(select)
1 public class MyRowHandler implements RowHandler { 2 public void handleRow (Object object, List list) throws SQLException { Product product = (Product) object; 3 product.setQuantity (10000); 4 sqlMap.update (“updateProduct”, product); 5 // Optionally you could add the result object to the list. 6 // The list is returned from the queryForList() method. 7 } 8 } 9 sqlMap.startTransaction(); 10 RowHandler rowHandler = new MyRowHandler(); 11 List list = sqlMap.queryForList (“getProductList”, null, rowHandler); 12 sqlMap.commitTransaction();
例子7:查詢成Paginated List(select)
1 PaginatedList list = 2 sqlMap.queryForPaginatedList (“getProductList”, null, 10); 3 list.nextPage(); list.previousPage();
例子9:查詢成Map(select)
1 sqlMap.startTransaction(); 2 Map map = sqlMap.queryForMap (“getProductList”, null, “productCode”); 3 sqlMap.commitTransaction(); 4 Product p = (Product) map.get(“EST-93”);
注意:自動提交,當沒調用 startTransaction 的情況下,statements 會自動提交。沒必要 commit/rollback。