约定俗成
Clinton说:这一点是与我们以前所坚持的原则不相符合的。认识我的人都知道我基本上算是一个完美的人。但是如果我们从最佳实践的角度去考虑,我们必须在解决复杂问题的时候也使用尽量简单的解决方案。当然,那些不太喜欢约定俗成式配置的人可以忽略这种配置方式。但是我相信这是非常有用的,特别是对插入、删除和更新操作来说。使用这种配置方式,一些简单的查询也将从中受益。
默认情况下,iBATIS 3.0将使用约定俗成式的配置方式。Java 5的方法语义中已经包含了生成SQL、进行参数和结果映射足够的信息。例如:
Employee getEmployee (int id);
这些信息对于生成以下SQL已经足够了:
SELECT id, firstName, lastName FROM Employee WHERE id = ?
结果类型与方法的返回值类型是一致的。因为方法的返回值类型不是集合类型,所以我们知道正在处理“Select One”语义。表的名称被假定为与结果类型的名称一致。而查询参数就被假定为方法对应的参数。在使用其他的配置方式的时候,我们可以更改默认ID参数的配置。SQL语句中的各数据列假定与方法返回类型的同名属性一一对应,当然这些配置都是可以更改的。
集合类型也是以同样的方式工作:
List listAllEmployees ();
这个例子将产生以下SQL语句:
SELECT id, firstName, lastName FROM Employee
我们可以将这个例子叫做“Select Many”,因为这个方法返回了一个集合类型。我们知道Where子句为空,因为这个方法没有任何参数。
如果我们想使用参数式查询,我们可以这样来做:
List findEmployeesLike(Employee employee);
假设只有参数的lastName,而其他引用类型都为null值,原始类型都被设置为非法无意义的值(比如-1),我们将得到以下的SQL语句:
SELECT id, firstName, lastName FROM Employee WHERE lastName = 'Begin'
或者可以直接按参数来进行:
List findEmployeeByLastNameAndFirstName (String last, String first);
这将生成以下的SQL语句:
SELECT id, firstName, lastName FROM Employee WHERE lastName = 'Begin' AND firstName = 'Clinton'
因为C#支持参数名称的反射,所以C#对这种方法提供了更好的支持。形式上也变得相对清晰,当然实质是一样的:
// C#
IList FindEmployeesLike(string lastName, string firstName);
// And in C# 3.0, we can use anonymous types:
IList FindEmployeesLike(object obj);
//...
IList employees = mapper.FindEmployeesLike(new {LastName="Begin", FirstName="Clinton"});
更新操作也以相同的方式操作:
void insertEmployee (Employee emp);
void updateEmployee (Employee emp);
void deleteEmployee (Employee emp);
也可以自动接受集合参数:
int insertEmployee (List emps); // returns rows inserted
int updateEmployee (List emps); // returns rows updated
int deleteEmployee (List emps); // returns rows deleted
生成器相当的灵活,而且可以为大多数删除甚至更新操作生成一条SQL语句。