简介
使用SQL Map,能够大大减少访问关系数据库的代码。SQL Map使用简单的XML配置文件将Java Bean映射
成SQL语句,对比其他的数据库持续层和ORM框架(如JDO的实现,Hibernate等),SQL Map最大的优点在
于它简单易学。要使用SQL Map,只要熟悉Java Bean,XML和SQL,就能使您充分发挥SQL语句的能力。
1. com.ibatis.sqlmap.client.SqlMapClient
一个使用SQL Maps(从这个类开始运行的)的,线程安全的客户端。这个接口通过继承
SqlMapTransactionManager和SqlMapExecutor接口获得了事务控制和执行方法。
SqlMapClient是使用SQL Maps 的核心类。这个类将允许你映射操作语句(select、insert、
update、delete等),而且还划分了事务界线并能使用批处理。一旦你拥有了一个SqlMapClient实例,你
使用SQL 映射变得足够简单。
SqlMapClient能够直接作为多线程客户端使用(内部session管理),或者你也能得到一个单线程
的session并且使用它。如果你明确的获得一个session(使用 openSession()方法)的话,这里可能有一
点轻微性能的提升,因为这样节省了SqlMapClient管理线程上下文信息的开销。但是在大多数的情况下
,这不会产生什么不同,因此你可以选择任意一个你需要或喜欢的方式。
一个SqlMapClient实例可以被安全地作为静态的,或者实现为一个单例。一般来说,好的想法
是,做成一个简单的配置类,而通过SqlMapClientBuilder去配置这个类的事例。
其实就是客户端程序员进行Sql Map操作的客户端类。
SQL Maps (com.ibatis.sqlmap.*)
SQL Map的概念
SQL Map API让开发人员可以轻易地将Java Bean映射成PreparedStatement的输入参数和ResultSet结果
集。开发SQL Map的想法很简单:提供一个简洁的架构,能够用20%的代码实现80%JDBC的功能。
SQL Map如何工作?
SQL Map提供了一个简洁的框架,使用简单的XML描述文件将Java Bean,Map实现和基本数据类型的包装
类(String,Integer等)映射成JDBC的PreparedStatement。以下流程描述了SQL Maps的高层生命周期
:
将一个对象作为参数(对象可以是Java Bean,Map实现和基本类型的包装类),参数对象将为SQL修改语
句和查询语句设定参数值。
1) 执行mapped statement。这是SQL Maps最重要的步骤。SQL Map框架将创建一个PreparedStatement实
例,用参数对象为PreparedStatement实例设定参数,执行PreparedStatement并从ResultSet中创建结果
对象。
2) 执行SQL的更新数据语句时,返回受影响的数据行数。执行查询语句时,将返回一个结果对象或对象
的集合。和参数对象一样,结果对象可以是Java Bean,Map实现和基本数据类型的包装类。
下面是使用SqlMapClient的示例代码:
//
// autocommit simple query --these are just examples...not patterns
//
Employee emp = (Employee) sqlMap.queryForObject("getEmployee", new Integer(1));
//
// transaction --these are just examples...not patterns
//
try {
sqlMap.startTransaction()
Employee emp2 = new Employee();
// ...set emp2 data
Integer generatedKey = (Integer) sqlMap.insert ("insertEmployee", emp2);
emp2.setFavouriteColour ("green");
sqlMap.update("updateEmployee", emp2);
sqlMap.commitTransaction();
} finally {
sqlMap.endTransaction();
}
//
// session --these are just examples...not patterns
//
try {
SqlMapSession session = sqlMap.openSession()
session.startTransaction()
Employee emp2 = new Employee();
// ...set emp2 data
Integer generatedKey = (Integer) session.insert ("insertEmployee", emp2);
emp2.setFavouriteColour ("green");
session.update("updateEmployee", emp2);
session.commitTransaction();
} finally {
try {
session.endTransaction();
} finally {
session.close();
}
// Generally your session scope would be in a wider context and therefore the
// ugly nested finally block above would not be there. Realize that sessions
// MUST be closed if explicitly opened (via openSession()).
}
//
// batch --these are just examples...not patterns
//
try {
sqlMap.startTransaction()
List list = (Employee) sqlMap.queryForList("getFiredEmployees", null);
sqlMap.startBatch ();
for (int i=0, n=list.size(); i < n; i++) {
sqlMap.delete ("deleteEmployee", list.get(i));
}
sqlMap.executeBatch();
sqlMap.commitTransaction();
} finally {
sqlMap.endTransaction();
}