翻译:iBATIS 3.0 草案——使用标注进行配置

Posted on 2007-06-29 13:35 Tommy Jian 阅读(1293) 评论(1)  编辑  收藏 所属分类: iBATIS

使用标注进行配置

   标注现在已经很流行了,许多人选择它作为XML的替代来进行元数据编程。标注中不应该包含配置信息,而iBATIS通过XML来进行的工作也不光是配置。

   那么什么是配置,什么又不是呢?目前,iBATIS的XML文件包含了三方面:

  • 配置信息
  • 元数据信息
  • 代码

   当您把环境设置改变后,您同时也需要更改配置,例如数据库连接配置、事务管理配置等等。当您将应用分发到不同的数据库,而且也使用了一些专有的SQL语句后,配置中可能还要包含SQL方言的一些配置信息。在iBATIS 3.0中我们可以将这些信息包含进去,因此,您需要针对多种方言进行编码(当然这是手工的),为它们命名,并将它们配置到适当的位置。配置信息不应该被包含在Java源文件中。

   元数据信息包括诸如结果映射、参数映射和缓存模型之类的信息。这些信息控制iBATIS如何映射您的数据以及这些映射的具体表现。

   编码包括SQL以及动态的SQL语句。

   那么标注应该承担什么样的职责呢?

   一般情况下,只有元数据信息比较适合使用标注来描述。配置应该通过属性文件或者XML文件来实现。编码也只能通过Java文件或者XML文件来实现。更进一步看,标注只能用来描述相对较简单的元数据信息。有时,标注(特别是在Java中)也会使事情变得更加复杂,使代码更加晦涩难懂。

   因为上面的原因,所以我推荐只将标注作为约定配置的替代配置。这就是说,使用这种配置方式可以达到一定的效果,但是也仅仅限于此。

   再一次强调,C#的Attribute在某些方面要强于Java的标注:

  • 支持多行字符串,这使得内嵌SQL编码令人感到愉快
  • 支持使用同一标注多次,而在Java中则需要通过集合标注来实现
  • 支持顺序和命名参数,这使得代码变得更加简明扼要

   下面这个例子展示了如何使用Java中的标注来完成配置:

//
// Simple select, string concatenation, inline results(!) and inline parameters
//
@Select("SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) " +
"FROM EMPLOYEE")
List selectAllEmployees();
//
// Alternative syntax using an array of strings instead of string concatenation...can be "smarter" than concatenation
//
@Select({"SELECT #id(EMP_ID:NUMERIC), #firstName(FIRST_NAME:VARCHAR), #lastName(LAST_NAME:VARCHAR) ",
"FROM EMPLOYEE",
"WHERE EMP_ID = @id"})
Employee selectEmployee(int id);
//
// Inserts look as you might expect. We can use getGeneratedKeys to get autogen key values, selectkey still supported
//
@Insert({"INSERT INTO EMPLOYEE (EMP_ID, FIRST_NAME, LAST_NAME)",
"VALUES (@id, @firstName, @lastName)"})
void insertEmployee(Employee emp);
//
// Nothing special about update
//
@Update({"UPDATE EMPLOYEE SET",
"EMP_ID=@id(NUMERIC:IN), FIRST_NAME=@firstName(VARCHAR:IN), LAST_NAME=@lastName(VARCHAR:IN)"})
void updateEmployee(Employee emp);
//
// Delete is obvious.
//
@Delete("DELETE EMPLOYEE WHERE EMP_ID = @id")
void deleteEmployee(int id);

   下面这个例子要更加复杂一些,像这种使用了如此多的标注的情况就应该考虑使用XML文件来进行配置。这种情况下,我想象标注能够提供一切功能,即XML中实现的功能通过标注也能完成。然而,我们还是建议您在面对复杂的情况时使用XML来进行配置。或许某些人不是特别在意使用XML配置,所以我们为他们提供了标注配置方式。

//
// complex stuff
//
@ResultClass (Company.class)
@ConstructorResults({
@Result(property="id", column="C.COMP_ID"),
@Result(property="name", column="C.NAME")
})
@PropertyResults({
@Result(property="departments.id", column="D.DEPT_ID"),
@Result(property="departments.name", column="D.NAME"),
@Result(property="departments.employee.id", column="E.EMP_ID"),
@Result(property="departments.employee.firstName", column="E.FIRST_NAME"),
@Result(property="departments.employee.lastName", column="E.LAST_NAME")
})
@Collections ({
@Collection(type=Department.class, property="departments", groupBy="id"),
@Collection(type=Employee.class, property="departments.employees", groupBy="departments.id")
})
@Select("SELECT #id, #name, " +
"#departments.id, #departments.name, " +
"#departments.employees.id, #departments.employees.firstName, " +
"#departments.employees.lastName " +
"FROM COMPANY C, DEPARTMENT D, EMPLOYEE E " +
"WHERE D.DEPT_ID = E.DEPT_ID " +
"AND C.COMP_ID = D.COMP_ID")
List selectAllCompaniesWithJoin();
/*
* NESTED QUERIES
*/
@ResultClass (Company.class)
@FieldResults({
@Result(property="id", column="COMP_ID"),
@Result(property="name", column="NAME")
})
@PropertyResults({
@Result(property="departments",
nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getDepartmentsForCompany", parameters="id"))
})
@Select("SELECT #id, #name FROM COMPANY C ")
List selectAllCompaniesWithNestedQueries();
@ResultClass (Department.class)
@PropertyResults({
@Result(property="id", column="DEPT_ID"),
@Result(property="name", column="NAME"),
@Result(property="employees",
nestedQuery=@QueryMethod(type=CompanyMapper.class, methodName="getEmployeesForDeparment", parameters="id"))
})
@Select("SELECT #id, #name FROM DEPARTMENT WHERE COMP_ID = @id ")
List getDepartmentsForCompany(int id);
@ResultClass (Employee.class)
@PropertyResults({
@Result(property="id", column="EMP_ID"),
@Result(property="firstName", column="FIRST_NAME"),
@Result(property="lastName", column="LAST_NAME")
})
@Select("SELECT #id, #firstName, #lastName FROM EMPLOYEE WHERE EMP_ID = @id ")
List getEmployeesForDepartment(int id);

Feedback

# re: 翻译:iBATIS 3.0 草案——使用标注进行配置  回复  更多评论   

2007-06-30 08:06 by alfaromeo
看上去和workshop的DB控件很像啊

只有注册用户登录后才能发表评论。


网站导航: