首页 > 其他分享 >关于 mybatis mapper 的实现思路

关于 mybatis mapper 的实现思路

时间:2024-12-04 22:12:54浏览次数:6  
标签:mapper 调用 实例 class InvocationHandler mybatis 思路 public cls

问题:在定义 Mapper 接口的时候往往通过创建一个自定义的接口来继承 Mapper<T> 接口,没有实际的实现类,那么 mybatis 是如何进行调用的呢?

答案:mybatis 在内部还是通过 JDK Proxy 的形式进行了方法调用,但是不需要自己去实现接口。

通常来说 JDK Proxy 通过通过 InvocationHandler 实例去调用目标方法(反射调用),InvocationHandler实例内部会持有目标对象,但是在 Mybatis 中并没有真实的实例类,只是持有了 XxxMapper.class,后续在 InvocationHandler.invoke 方法中可以根据 XxxMapper.class 的信息(接口名,注解信息)去寻找 xml 配置,或者直接使用注解上的 sql 语句,来直接 sql 调用。

 

代码示例如下:

Mapper类和自定义Mpper接口类

public interface Mapper<T> {
    T selectById(Integer id);
}
public class Student {
}
public interface StudentMapper extends Mapper<Student> {
}

核心代理类

package com.test.root.base.proxy.mapper;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class MapperProxy<T> implements InvocationHandler {

    private Class<T> cls;

    public MapperProxy(Class<T> cls) {
        this.cls = cls;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if (method.getName().equals("selectById")) {
            // 后续可以获取 StudentMapper 然后获取 StudentMapper extends Mapper<Student> 中的Student
            // 在 mybatis 中,再从 xml 或者接口的注解里面获取语句信息
            System.out.println("do selectById");
        }
        return null;
    }

    public T getProxy() {
        // JDK 代理的实现逻辑就是,通过 InvocationHandler 实例去调用目标方法(反射调用),InvocationHandler 实例内部可以持有目标实例类。
        // Mybatis 在此处并没有真实的实例类,只是持有了接口的class,通过方法和class里面的具体的泛型类去构造sql调用,而并没有调用具体的目标实例。
        // 这个就是之前一直困恼我的地方了!
        return (T) Proxy.newProxyInstance(cls.getClassLoader(), new Class[]{cls}, this);
    }
}

测试类

package com.test.root.base.proxy.mapper;

public class MapperProxyTest {

    public static void main(String[] args) {
        MapperProxy<StudentMapper> mapperProxy = new MapperProxy<>(StudentMapper.class);
        StudentMapper studentMapper = mapperProxy.getProxy();
        studentMapper.selectById(1);
    }

}

 

标签:mapper,调用,实例,class,InvocationHandler,mybatis,思路,public,cls
From: https://www.cnblogs.com/baokang/p/18587318

相关文章

  • 技术框架中MyBatis参数传递的学习
    MyBatis参数传递总结MyBatis参数传递#{}方式情况一:Mapper映射器接口方法参数只有一个且为基本类型接口方法:publicList<UserEntity>selectUserByAge(intage);映射结果:<selectid="selectUserByAge"resultMap="userResultMap">select*fromtb_userwhereag......
  • SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)
    SpringBoot连接多数据源MySQL、SqlServer等(MyBatisPlus测试)在实际的项目开发中,我们往往需要同时连接多个数据源对数据进行处理。本文将详细介绍在SpringBoot下配合MybatisPlus如何连接多数据源,实例将会使用连接MySQL、SqlServer进行测试,可自行根据思路供自行连接Oracle、Po......
  • LLM大模型: CV领域常见attention思路变种及其作用(二)
    attention机制的效果非凡,但本身也是有缺陷的:Q*K矩阵的复杂度高达O(n^2);如果用在CV领域,还涉及到如下问题:局部性、全局性稀疏性多尺度问题 为了更好地把attention机制应用于CV,上述的几个问题是需要解决的!1、DilateFormer:Multi-ScaleDilatedTransformerforV......
  • mybatis集成篇(二)--Springboot集成mybatis
    前言随着Spring框架越来越成熟,推出的Springboot使用也越来越广,Mybatis随其自然地适配Springboot。Springboot集成Mybatis使用application.yml配置mybatis:mapper-locations:classpath:./mapper/*Mapper.xmlconfiguration:map-underscore-to-camel-case:tru......
  • 谷歌开发者高风险复盘分析思路分享
    出现高风险的各阶段:1.注册好账户,还未创建app2.已创建app,但是还未提交aab的包3.已创建app,并且已提交谷歌审核4.审核了几天,高风险了5.app上架以后更风险了(1周内)6.app上架一段时间以后高风险了(1个月以上)针对以上情况我们分析一下:1.注册好账户,还未创建app。这......
  • Jackson ObjectMapper - 指定对象属性的序列化顺序
    注释很有用,但在任何地方应用起来都会很痛苦。您可以配置整个 ObjectMapper 以这种方式工作当前杰克逊版本:objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true)较旧的杰克逊版本:objectMapper.configure(SerializationConfig.Feature.SORT_PROPERTIE......
  • 一种轻量分表方案-MyBatis拦截器分表实践
    作者:京东零售张均杰背景部门内有一些亿级别核心业务表增速非常快,增量日均100W,但线上业务只依赖近一周的数据。随着数据量的迅速增长,慢SQL频发,数据库性能下降,系统稳定性受到严重影响。本篇文章,将分享如何使用MyBatis拦截器低成本的提升数据库稳定性。 业界常见方案针对冷数......
  • ctfshow 信息搜集web入门思路
    (web2)js前台拦截无法使用f12打开代码可以使用ctrl+u或者在网站前面加上view-source:或者使用bp进行抓包(web4)robots.txt中可能包含着信息(web5)phps源码泄露 index.phps(web6)源码泄露www.zip泄露(web7)/.git/源文件泄露(web8)index.php.swplinux在使用vim进行编......
  • MyBatis属性,设置,类型别名
    1、属性(properties)设置好的属性可以在整个配置文件中用来替换需要动态配置的属性值。比如:<dataSourcetype="POOLED"><propertyname="driver"value="${driver}"/><propertyname="url"value="${url}"/><propertyname=&q......
  • mybatis 批量插入数据
    由于导入excel插入数据,遍历方式插入数据非常慢,所以修改成批量插入数据,代码如下:批量插入配置类@RepositorypublicclassBatchData{@AutowiredprivateSqlSessionTemplatesqlSessionTemplate;publicvoidsaveList(Stringstatement,List<?extendsObject>d......