自带的selectList等api的方法名和传参无法自定义。接口绑定可以解决方法调用不灵活,参数传递不灵活的问题。需要提供与接口匹配的映射配置文件。
遵循特定规范
必要规范:
- 映射配置文件中, mapper的namespace属性必须和接口的全限定路径一致
<mapper namespace="InterfaceBinding.TestInterfaceBinding">
<select id="selAll" resultType="User">
select * from tb_users
</select>
</mapper>
- 操作数据库的标签的id属性必须和接口中对应方法的名称一致
public List<User> selAll();
可选规范:
选择遵循, 如果遵循,还可以进一步简化(在核心配置文件中可以使用package标签进行映射文件的统一扫描)。/resource/mapper与src/mapper在编译时会合并到类路径。
resource被mark as resource root。
- 映射文件的命名和接口命名一致
- 映射文件和接口放在同一个目录,可以分别放在/resource/mapper与src/mapper
在mybatis配置文件中直接开启mapper映射文件的扫描,指定扫描包的位置。
<mappers>
<!-- <mapper resource="UserMapper.xml" />-->
<!-- <mapper resource="InterfaceBind.xml"/>-->
<package name="mapper"/>
</mappers>
SqlSession对象中提供了一个方法, 用于获取接口类型的对象getMapper(接口的Class对象)。
TestInterfaceBinding mapper= sqlSession.getMapper(TestInterfaceBinding.class);
接口绑定方案中参数传递问题
- 可以传递简单类型
- 可以传递Map集合,只能通过key获取
- 可以传递POJO对象, 只能通过getter方法对应的属性获取
- 多值传递:
a) 不使用注解, 可以通过param1, param2, …或arg0, arg1, …的方式获取。
public User selByNamePwd(String username,String password);
<select id="selByNamePwd" resultType="User">
select * from tb_users where username=#{arg0} and password=#{arg1}
</select>
b) 使用注解, 使用@Param注解,由MyBatis将参数封装为Map集合, 可以通过key获取,也可以通过param1, param2,…获取, 不能通过arg0, arg1,…方式获取。
public User selByNamePassword(@Param("name") String username,@Param("pwd") String password);
<select id="selByNamePassword" resultType="User">
select * from tb_users where username=#{name} and password=#{pwd}
</select>