MyBatis接口编程模拟

本文通过一个Java动态代理的例子展示了如何实现接口方法的调用,并解释了MyBatis中使用动态代理的过程。包括创建代理类、调用方法及执行SQL等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要自己用动态代理模拟了为什么接口能直接调用方法。与此同时参考了其他资料,补充给出了源码在动态代理过程中的一些其他元素

接口:

public interface ICommand {
	public List<Command> queryCommandList();
}

SqlSession:

public class SqlSession{
	public<T> T getMapper(Class<T> c){
		System.out.println("通过接口的Class从代理工厂Map取出对应的代理工厂");
		System.out.println("通过代理工厂实例化一个代理类");
		System.out.println("用这个代理类生成一个代理实例返回出去");
		InvocationHandler handler=new MapperProxy();
		return (T)Proxy.newProxyInstance(c.getClassLoader(),new Class[]{c}, handler);		
	}
}

MapperProxy:

public class MapperProxy implements InvocationHandler {
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("通过接口与method获取对应的配置文件中的信息:");
		System.out.println("接口名称.方法名==namespace.id");
		System.out.println("通过配置文件中的信息获取SQL语句的类型");
		System.out.println("根据SQL语句类型调用sqlSession对应的增删改查方法");
		System.out.println("当SQL语句类型是查询时");
		System.out.println("根据返回值的类型是List、Map、Object");
		System.out.println("分别调用selectList、selectMap、selectOne方法");
		List<Object> list =Arrays.asList(new Object[]{"hello","world"});		
		return list;
	}

}
测试类:

public class Test {
	public static void main(String[] args) {
		System.out.println("加载配置信息……");
		System.out.println("通过加载配置信息加载一个代理工厂Map:");
		System.out.println("这个Map存放的是接口Class与对应的代理工厂");
		SqlSession sqlSession=new SqlSession();
		ICommand icommand=sqlSession.getMapper(ICommand.class);
		List<Command> queryCommandList = icommand.queryCommandList();
		System.out.println(queryCommandList.toString());
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值