动态代理的功能:
- 通过拦截器方法回调,对目标target方法进行增强。
- 动态代理还有”投鞭断流“的霸权,连目标target都不要的使用方式。
自动映射器Mapper自己实现
定义pojo
1 | package com.justxzm.proxy; |
定义接口
1 | package com.justxzm.proxy; |
定义代理类
1 | package com.justxzm.proxy; |
测试代码
1 | package com.justxzm.proxy; |
1 | ID:1001 |
这便是Mybatis自动映射器Mapper的底层实现原理。
自动映射器Mapper源码分析
编写一个测试类
1 | public static void main(String[] args) { |
Mapper接口
1 | public interface StudentMapper { |
MapperProxy.java
org.apache.ibatis.binding.MapperProxy.java部分源码。
1 | public class MapperProxy<T> implements InvocationHandler, Serializable { |
MapperProxyFactory.java
org.apache.ibatis.binding.MapperProxyFactory.java部分源码。
1 | public class MapperProxyFactory<T> { |
这便是Mybatis使用动态代理之投鞭断流。
问题(重要)
接口Mapper内的方法能重载(overLoad)吗? 类似下面:
1 | public User getUserById(Integer id); |
Answer:不能。
原因:在投鞭断流时,Mybatis使用package+Mapper+method全限名作为key,去xml内寻找唯一sql来执行的。
类似:key=x.y.UserMapper.getUserById,那么,重载方法时将导致矛盾。对于Mapper接口,Mybatis禁止方法重载(overLoad)。