iBATIS 3 内的新特性:将 iBATIS 用作应用程序内的一种持久框架
2010-04-07 00:00:00 来源:WEB开发网在 Automobile mapper 的 XML 配置中,resultMap 元素用来映射 model_year 数据库列与 Automobile 对象上的 year 字段。这个映射相当简单,可以在注释内进行,只要使用为该列赋别名的 SQL 特性就可以了,这个特性可由在 @Select 注释内定义的 SQL 完成。
AutomobileMapper 接口内的 Select 注释将 selectAutomobile 方法映射到用来根据给定值从 automobiles 表选择一个记录的 SQL。这个值被指定为实参的 id 参数并被作为 #{id} 包括在这个 SQL 语句内,正如其在 XML 配置中那样。使用 Java 接口映射这些 SQL 方法的一个极大的好处是 feedbac 会以编译时错误的形式出现在 Java 编辑器中。这样一来,我们就可以确认这些方法均能返回正确的类型,而 XML 配置通常需要先执行代码才能找到错误。
此外,iBATIS 3 现在还支持接口继承,允许对 Java 接口进行优化以减少代码重复。
iBATIS 文档中有这样的一个提示,即对于较小且较为简单的项目,注释可以更为简单和易读。不过,较 XML 配置而言,注释的功能相对有限。若项目中包含复杂的对象或复杂的数据库结构,请考虑使用 XML 配置,而不是 Java 注释。
其他的 API 变更
iBATIS 的基于注释的配置要求实例化也要稍微不同。我们不再使用 Reader 类来读取 XML 配置,而是要向 Configuration 对象添加映射程序,如清单 9 所示。
清单 9. 使用了注释配置的新 Java 代码
package com.ibm.developerWorks.examples.ibatis;
// snipped imports
public class Main {
// snipped constants declarations--didn't change
// new method for creating data source
private static DataSource createDataSource() { EmbeddedDataSource
dataSource = new org.apache.derby.jdbc.EmbeddedDataSource();
dataSource.setDatabaseName("/tmp/MyDB"); return dataSource; }
@SuppressWarnings("static-access")
private static Options createOptions() {
// snipped... no changes
}
private static SqlSessionFactory createSqlMapper() throws
IOException { DataSource datasource = createDataSource();
TransactionFactory transaction = new JdbcTransactionFactory();
Configuration configuration = new Configuration(new Environment
("development", transaction, datasource)); configuration
.addMapper(AutomobileMapper.class);
return new SqlSessionFactoryBuilder().build(configuration);
}
public static void main(final String[] args) {
Options options = createOptions();
try {
CommandLine cmd = new GnuParser().parse(options, args);
SqlSession session = createSqlMapper().openSession();
AutomobileMapper mapper = session.getMapper(AutomobileMapper.class);
try {
if (cmd.hasOption(CREATE)) {
System.out.println("Creating the objects in the database...");
// Create the automobiles
mapper.insertAutomobile(new Automobile
(1, "Toyota", "Tercel", 1993));
mapper.insertAutomobile(new Automobile
(2, "Honda", "CR-V", 2000));
mapper.insertAutomobile( new Automobile(3,
"Chevrolet", "Impala", 1964));
mapper.insertAutomobile(new Automobile(4, "Dodge", "Pickup", 1946));
session.commit();
} else if (cmd.hasOption(SHOW)) {
Automobile auto = mapper.selectAutomobile( Integer.parseInt(cmd.getOptionValue(SHOW)));
if (auto == null) {
System.out.println("No matching results found!");
} else {
System.out.println(auto);
}
} else if (cmd.hasOption(DELETE)) {
mapper.deleteAll();
session.commit();
} else {
System.out.println("Doing nothing.");
}
} finally {
session.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
更多精彩
赞助商链接