关于Mybatis中MapperProxy的深入

为了方便研读,先搭建一个简单的SSM项目(本文不做赘述),然后完成一套流程,下面已增加insert为例。

1. 先给出关键代码

public class PersonDto {

    private Long id;

    private String name;
   
   ......... 构造、get、set
}

为了方便演示,先建一个简单的实体类

@Mapper
public interface PersonMapper {

    int insertPerson(PersonDto personDto) throws Exception;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.balls.mapper.PersonMapper">

    <insert id="insertPerson" parameterType="com.balls.dto.PersonDto">
        INSERT
        INTO PERSON(ID, NAME)
        VALUES(#{id}, #{name})
    </insert>

</mapper>

编写mapper接口和对应的xml

@RestController
@RequestMapping(value = "/personController")
public class PersonController {

    @Resource
    private PersonMapper personMapper;

    @RequestMapping(value = "/{id}/{name}/insert.do", method = RequestMethod.GET)
    public int gets(@PathVariable Long id, @PathVariable String name) throws Exception {
        int result = 0;
        result = personMapper.insertPerson(new PersonDto(id, "white"));
        return
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Mybatis MapperProxy 的 invoke 方法是一个用来执行 SQL 语句的方法。它通过反射来调用接口声明的方法,并将参数传递给 SQL 语句,然后执行该 SQL 语句并返回结果。 invoke 方法的作用是将接口方法的调用转化为对底层数据库的调用。 ### 回答2: MybatisMapperProxyMybatis框架用于代理Mapper接口的类,它的invoke方法是用来处理Mapper接口的方法调用的。 MapperProxy的invoke方法会接收到代理对象的方法调用,并且包装成一个MapperMethod对象,然后通过SqlSession的selectOne、selectList、update、insert和delete等方法来执行SQL语句。 在invoke方法,首先会判断方法是否为Object类的方法(如toString、hashCode等),如果是,则直接调用代理对象的相应方法。 接下来,会从configuration获取到对应的MapperMethod对象,并且将方法调用相关的参数传递给MapperMethod对象的execute方法。 MapperMethod的execute方法会根据方法调用的类型(查询、更新、插入或删除),调用相应的SQL语句执行方法。 在执行SQL语句之前,还会对参数进行处理。对于查询方法,会根据方法参数是否含有RowBounds和ResultHandler参数,来决定是否使用分页查询和结果处理器。 执行SQL语句后,会根据返回结果的类型,调用相应的处理方法。对于查询方法,会判断是否需要延迟加载结果,如果需要,则封装成代理对象返回。 最后,在invoke方法,会根据MapperMethod的返回类型,将执行结果返回给调用者。 总的来说,MybatisMapperProxy的invoke方法主要是根据方法的调用类型,来获取对应的MapperMethod对象,并且将方法调用的参数传递给MapperMethod对象的execute方法,最后返回执行结果给调用者。 ### 回答3: MybatisMapperProxy是一个动态代理类,用于实现Mapper接口的方法调用。其核心方法是invoke方法。 invoke方法首先判断被调用的方法是否为Object类的方法,如果是,则直接调用原始对象的方法。这是为了避免代理对象自身的方法调用被拦截。 接着,invoke方法根据被调用的方法所属的类和方法名,从MapperRegistry获取对应的MappedStatement对象。MappedStatement包含了定义在Mapper接口方法上的注解信息,以及与之对应的SQL语句。 然后,invoke方法根据MappedStatement的配置信息,决定执行查询、插入、更新、删除等具体操作。 在执行操作前,invoke方法会利用MapperMethod对象解析方法参数,并将参数与SQL语句的占位符进行匹配,生成完整的SQL语句。 接下来,invoke方法会调用SqlSession的相关方法,执行SQL语句,并将执行结果返回给调用者。 最后,invoke方法会根据MapperMethod的配置信息,将返回结果进行适配,转化为最终的返回值。 值得一提的是,MybatisMapperProxy是基于JDK动态代理实现的,它将Mapper接口方法的调用转发给SqlSession对象进行处理。这样的设计使得Mybatis能够实现面向接口编程,并将代码的SQL语句与Java逻辑进行解耦。 总之,MybatisMapperProxy的invoke方法是实现Mapper接口方法调用的核心逻辑,通过动态代理在运行时生成代理对象,并通过SqlSession完成具体的数据库操作。它为Mybatis提供了强大的灵活性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值