SqlMapClient类提供了执行所有mapped statement的API。这些方法如下:
public int insert(String statmentName , Object parameterObject) throws SQLException;
public int update(String statementName , Object parameterObject) trhows SQLException;
public int delete(String statementName , Object parameterObject) throws SQLException;
public Object queryForObject(String statementName , Object parameterObject) throws SQLException;
public Object queryForObject(String statementName , Object parameterObject , Object resultObject) throws SQLException;
public List queryForList(String statementName , Object parameterObject) throws SQLException;
public List queryForList(String statementName , Object parameterObject , int skipResults , int maxResults) throws SQLException;
public List queryForList(String statementName , Object parameterObject , RowHandler rowHandler) throws SQLException;
public PaginatedList queryForPaginatedList(String statementName , Object parameterObject , int pageSize) throws SQLException;
public Map queryForMap(String statementName , Object parameterObject , String keyProperty) throws SQLException;
public Map queryForMap(String statementName , Object parameterObject , String keyProperty , String valueProperty) throws Exception;
在上面的每个方法中,Mapped Statement的名称作为第一个参数。这个名称要对应<statement>的名称属性。另外,第二个参数总是参数对象。如果不需要参数对象,可以为null。除了这些之外,上面的方法就没有相同的了。下面简单的介绍一下他们的不同之处。
insert(),update(),delete()
这些方法用于数据更新(即非查询语句)。这就是说,使用下面的查询方法来执行数据更新操作并不是不可能。但这显得很奇怪,并明显依赖于JDBC的驱动程序。执行update()返回受影响数据记录的数目。
queryForObject()方法有两个版本。一个返回查询得到的新对象,另一个用一个事先生成的对象作为参数。后者对于使用多个查询为对象赋值很有用。
queryForList()方法也有三个版本。第一个执行一个查询并返回所有的查询结果。第二个允许指定跳过结果的数目(即开始点)和返回结果的最大数目。对于查询一个数量很大的结果集,并且不想返回所有的数据时很有用。 最后一个版本的queryForList()方法需要一个行处理器(row handler)作为输入参数。这个方法可以让您使用结果对象,而不是数据表的行和列来逐行地处理查询结果集。这个方法的参数除了例行的名称和参数对象外,还包括了一个实现了RowHandler接口的类的实例。 RowHandler接口只有一个方法: public void handleRow(Object object , List list); 对于每一行从数据库中返回的数据,RowHandler接口的方法都会被执行。这种处理数据的方法,简洁而具有扩展性。输入参数list是List接口的一个实例,并从queryForList()方法中再次返回。您可以向list对象添加零或多个结果对象。显然,如果您处理上百万的数据行,把他们全部放入一个list对象里并不是个好方法。
对于要返回一个可以向前和向后翻页的数据子集,queryForPaginatedList()方法很有用,他返回一个可管理的List对象。通常用于只显示一部分查询结果的用户界面。一个常见的例子是,搜搜引擎找到10 000条结果,但每次只显示其中的100条。PaginatedList接口包含了向前和向后翻页的方法(nextPage(),previousPage(),gotoPage()),并提供了检查翻页状态的方法(isFirstPage(),isMiddlePage(),isLastPage(),isPrevioutsPageAvailable(),getPageIndex(),getPageSize())。虽然不能从PaginatedList接口得到查询结果集的总数,但是这个总数可以再执行一个简单的语句count()来得到。否则,PaginatedList接口会大大的降低性能。
上面的方法将查询结果集放在List对象中,而queryForMap()方法将结果集放在一个Map对象中,这个Map对象用一个传入参数keyProperty作为key值。例如,要读入一批Employee对象,您可以将这些Employee对象放在一个用employeeNumber属性作为key值得Map对象中。Map对象的值可以是整个Employee对象,也可以是Employee对象的另一个属性,属性的名称由第二个参数valueProperty指定。例如,您可能只是需要一个Map对象,用员工号作为key值,员工姓名作为value值。不要把它和用Map作为结果对象的概念混淆。这个方法可以使用JavaBean和Map(或基本类型的包装类,但不可能这样用)作为结果对象。代码例子
例子1:执行update(insert ,update ,delete)
sqlMap.startTransaction();
Product product = new Product();
product.setId(1);
product.setDescription("Shih Tzu");
int rows = sqlMap.insert("insertProduct" , product);
sqlMap.commitTransaction();
例子2:查询成员(select)
sqlMap.startTransaction();
Integer key = new Integer(1);
Product product = (Product) sqlMap.queryForObject("getProudct" , key );
sqlMap.commitTransaction();
例子3:用预赋值的结果对象查询成对象(select)
sqlMap.startTransaction();
Customer customer = new Customer();
sqlMap.queryForObject("getCust" , parameterObject , customer);
sqlMap.queryForObject("getAddr" , parameterObject , customer);
sqlMap.commitTransaction();
例子4:查询成对象List(select)
sqlMap.startTransaction();
List list = sqlMap.queryForList("getProductList" , null);
sqlMap.commitTransaction();
例子5:自动提交
// 但没调用startTransaction的情况下,statements会自动提交。
// 没必要 commit/rollback。
int rows = sqlMap.insert( "insertProduct" , product );
例子6:用结果集边界查询成对象List(select)
sqlMap.startTranasction();
List list = sqlMap.queryForList("getProductList", null , 0 , 40);
sqlMap.commitTransaction();
例子7:用RowHandler执行查询(select)
public class MyRowHandler implements RowHandler {
public void handleRow(Object object , List list) throws SQLException {
Product product = (Product) object;
product.setQuantity(10 000);
sqlMap.update("updateProduct" , product );
// Optionally you could add the result object to the list.
// The list is returned from the queryForList() method.
}
}
sqlMap.startTransaction();
RowHandler rowHandler = new MyRowHandler();
List list = sqlMap.queryForList("getProductList" , null , rowHandler);
sqlMap.commitTransaction();
例子8:查询成PaginatedList(select)
PaginatedList list = sqlMap.queryForPaginatedList("getProductList" , null , 10);
list.nextPage();
list.previousPage();
例子9:查询成Map(select)
sqlMap.startTransaction();
Map map = sqlMap.queryForMap("getProductList" , null , "productCode");
sqlMap.commitTransaction();
Product p = (Product) map.get("EST-93");