<T> T getMapper(Class<T> type)
您提到的插入(insert)、更新(update)、删除(delete)和查询(select)方法对于一些操作来说确实很强大,但它们也比较冗长、不具备类型安全性,并且对于IDE和单元测试的帮助并不如它们本应该有的那样。在上面的“入门”部分,我们已经看到了使用Mapper的示例。
使用Mapper类执行映射语句是更常见的一种方式。Mapper类实际上是一个包含方法定义的接口,这些方法与SqlSession的方法相对应。以下示例展示了一些方法签名及其与SqlSession的对应关系。
public interface AuthorMapper {
// (Author) selectOne("selectAuthor", 5);
Author selectAuthor(int id);
// (List<Author>) selectList("selectAuthors")
List<Author> selectAuthors();
// (Map<Integer,Author>) selectMap("selectAuthors", "id")
@MapKey("id")
Map<Integer, Author> selectAuthors();
// insert("insertAuthor", author)
int insertAuthor(Author author);
// updateAuthor("updateAuthor", author)
int updateAuthor(Author author);
// delete("deleteAuthor", 5)
int deleteAuthor(int id);
}
?简而言之,每个Mapper方法的签名应该与它所关联的SqlSession方法相匹配,但不包含String类型的参数ID。相反,方法名必须与映射的语句ID相匹配。
另外,返回类型必须与单个结果的预期结果类型匹配,或者是多个结果或游标的数组或集合。所有常见的类型都受支持,包括:基本类型、Map、POJO和JavaBean。
注意:Mapper接口不需要实现任何接口或扩展任何类,只要方法签名可以用于唯一确定相应的映射语句即可。
注意:Mapper接口可以扩展其他接口。当使用XML绑定到Mapper接口时,请确保语句位于适当的命名空间中。另外,唯一的限制是在层次结构中不能有两个接口具有相同的方法签名(无论如何,这都是一个不好的做法)。
您可以向Mapper方法传递多个参数。如果这样做,它们默认会以“param”的字面量加上它们在参数列表中的位置进行命名,例如:#{param1},#{param2}等。如果您想更改参数的名称(仅限多个参数),则可以在参数上使用@Param("paramName")注解。
您还可以向方法传递RowBounds实例来限制查询结果。