什么是Mapper代理开发?
在上一文章中我们提到,创建配置文件UserMapper。在main方法中,通过空间名称+sql的ID来获取配置文件需要执行的sql语句。
这样仍然会出现硬编码问题,一旦空间名称和sql语句太多,我们很难一一对应的找到所需要的语句,这样的会对后期维护增加成本。
所以我们采取Mapper代理开发的方法进行sql语句的执行。
1、创建和映射文件名相同的接口并且放在同一个目录下
需要注意的是,我们不可以直接变动配置文件的目录,要想将xml配置文件放在同一目录下,我们需要在配置文件包下创建同名目录,将配置文件移动进去。
请注意:次路径需要用“/”来表示目录层级,不可以使用“.”
2、设置UserMapper的名称空间为Mapper接口的全限定名。
即<mapper namesapce="XXXXX">
<!--
namespace:名称空间
-->
<mapper namespace="com.tsj.mapper.UserMapper">
<!-- id是注解语句的唯一标识,同时resulType是返回值的数据类型-->
<select id="selectAll" resultType="com.tsj.pojo.user">
select * from tb_user;
</select>
</mapper>
3、在接口中定义抽象方法
方法名就是sql语句中的id,方法的参数类型和sql语句的返回值类型保持一致。
package com.tsj.pojo.mapper;
import com.tsj.pojo.user;
import java.util.List;
public interface UserMapper {
//返回list集合,可以查询到很多个user对象。
//如果想要查询一个对象,那么返回值也可以是一个user
List<user> selectAll ();
}
4、main方法里编码实现sql
//3.1获取UserMapper接口的代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<user> users = mapper.selectAll();
System.out.println(users);
代码大概执行流程:
1、获取sqlsession对象
2、通过sqlsession获取接口的代理对象
3、在当前目录下有一个同名的映射文件,找到了同名的xml中的sql语句
4、使用mapper代理调用接口中的方法,每一个方法名就对应xml中sql语句的id,接着就可以获取对应的sql语句了。
5、根据接口中方法的参数,来确定返回值。
其实在底层执行的依然是sqlSession.selectList()。
<mappers>
<!--Mapper映射文件-->
<!--mapper resource="com/tsj/mapper/UserMapper.xml"/-->
<!-- Mapper代理方式-->
<package name="com.tsj.mapper"/>
</mappers>