动态代理开发
2020年11月5日大约 1 分钟约 444 字
1. 背景
一般创建 Web 工程时,从数据库取数据的逻辑会放置在 DAO(Date Access Object,数据访问对象)层。使用 MyBatis 开发 Web 工程时,通过 Mapper 动态代理机制,可以只编写数据交互的接口与其方法定义,以及对应的 Mapper 映射文件,具体的交互方法实现(即接口实现类)由 MyBatis 来完成,这样大大节省了开发 DAO 层的时间。
采用 MyBatis 的代理开发方式实现 DAO 层的开发,是现在的主流操作。Mapper 接口开发工作只需要编写 XxxMapper 接口(相当于 Dao 接口),然后 MyBatis 框架会根据接口定义自动创建 XxxMapper 接口的动态代理对象,以此实现相应开发要求。
2. 步骤
对于一个 DAO 层的 XxxMapper.java 的 interface 接口,实现 Mapper 代理的开发需要遵循以下规范:
- 相应的 XxxMapper.xml 配置文件中的 namespace 必须与 XxxMapper.java 接口的全限定名相同;
- XxxMapper.xml 配置文件中定义的每个 sql 语句的 id 必须与 XxxMapper.java 接口的方法名相同;
- XxxMapper.xml 配置文件中定义的每个 sql 语句的 parameterType 的类型必须与 XxxMapper.java 接口方法的输入参数类型相同;
- XxxMapper.xml 配置文件中定义的每个 sql 语句的 resultType 的类型必须与 XxxMapper.java 接口方法的输出参数类型相同;

此时便可通过 SqlSession 实例的 getMapper 方法创建相应的 XxxMapper 接口的动态代理对象:
@Test
public void testProxyDao() throws IOException {
InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
// 获得 MyBatis 框架生成的 UserMapper 接口的实现类
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findById(1);
System.out.println(user);
sqlSession.close();
}