本篇文章,可乐将为大家介绍通过接口代理的方式去执行SQL操作。话不多说,直接上图:

其实无论哪种方式,我们最终是需要找到对应的 SQL 语句,接口代理的方式就是通过 【包名.方法名】 的方式,去找到 xxxMapper.xml 文件中的 SQL 语句。

很明显,通过动态代理的方式,我们能够实现该功能。下面,可乐将为大家手撸一个 Mybatis 的接口代理。

1、创建接口

package com.itcoke.mapperproxy;

import com.itcoke.bean.Person;

public interface PersonMapper {

    Person selectPersonById(Long pid);
}

2、创建代理类

package com.itcoke.mapperproxy;

import org.apache.ibatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class MapperProxyHandler implements InvocationHandler {
private SqlSession sqlSession;
private Class<?> targetInterface; public MapperProxyHandler(SqlSession sqlSession,Class<?> targetInterface){
this.sqlSession = sqlSession;
this.targetInterface = targetInterface;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
String className = targetInterface.getName();
String methodName = method.getName();
String statement = className + "." + methodName; return sqlSession.selectOne(statement,args[0]);
}
}

3、创建代理工厂类

package com.itcoke.mapperproxy;

import java.lang.reflect.Proxy;

public class MapperProxyFactory {
private Class<?> targetInterface; public MapperProxyFactory(Class<?> targetInterface){
this.targetInterface = targetInterface;
} public Object newInstance(MapperProxyHandler handler){
return Proxy.newProxyInstance(targetInterface.getClassLoader(),
new Class[]{targetInterface},
handler);
}
}

4、创建测试类

package com.itcoke.mapperproxy;

import com.itcoke.bean.Person;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; public class MapperProxyTest { public static void main(String[] args) {
// 1、获取目标接口对象
Class<?> targetInterface = PersonMapper.class;
// 2、获取 SqlSession 对象
SqlSession sqlSession = getSqlSession();
MapperProxyHandler proxyHandler = new MapperProxyHandler(sqlSession,targetInterface);
MapperProxyFactory mapperProxyFactory = new MapperProxyFactory(PersonMapper.class);
PersonMapper personMapper = (PersonMapper)mapperProxyFactory.newInstance(proxyHandler);
Person person = personMapper.selectPersonById(1L);
System.out.println(person);
} public static SqlSession getSqlSession() {
//定义mybatis全局配置文件
String resource = "mybatis-config.xml";
//加载 mybatis 全局配置文件
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sessionFactory.openSession();
}
}

5、总结

其实 Mybatis 内部实现方式大体上和上面差不多,在加入一些类型处理器,其实就是一个简易版本的 Mybatis

最新文章

  1. Modify Branding of FreeCAD
  2. android ContentObserver
  3. linux memory
  4. 抽象工厂模式(Abstract Factory)
  5. C++中的初始化
  6. .NET 条件查询实现--类似网上商城宝贝搜索
  7. checkbox、select、radio的设置与获取
  8. prim模板
  9. MVC jsonModelBuilder
  10. vue学习之指令简写以及事件笔记
  11. 1.ElasticSearch介绍及基本概念
  12. sql0001
  13. Tomcat安装教程
  14. SQA计划
  15. Android 源码编译之旅
  16. HDU 1247 - Hat’s Words - [字典树水题]
  17. 身份证号码 正则表达式 jquery
  18. 第6章—渲染web视图—SpringMVC+Thymeleaf 处理表单提交
  19. onethink封装arclist调用文章列表!
  20. [uwp]自定义Behavior之随意拖动

热门文章

  1. 桌面小部件AppWidgetProvider简单分析
  2. node溢出
  3. Java流程控制06——break continue
  4. C++ //多继承语法 C++中允许一个类继承多个类
  5. 网安日记④之搭建域环境(domain)并且配置域
  6. elsa-core——1.Hello World:Console
  7. dubbo学习实践(4)之Springboot整合Dubbo及Hystrix服务熔断降级
  8. HandlerInterceptor与WebRequestInterceptor的异同
  9. Docker与k8s的恩怨情仇(八)——蓦然回首总览Kubernetes
  10. 在 CSS 中表示颜色的hex code方法和rgb方法