Mybatis对mapper的加载流程深入讲解

yizhihongxing

下面是对"Mybatis对mapper的加载流程深入讲解"的详细讲解:

1、Mybatis mapper的概念

Mapper是Mybatis的一个核心概念,是连接Mybatis和JDBC的重要桥梁。Mybatis将SQL语句和映射规则分离出来,提供了mapper对SQL语句的注解和XML配置文件的支持,使得我们可以在mapper中定义SQL和对应的Java映射。

2、Mybatis mapper的加载流程

Mybatis将SQL语句和映射规则分离出来,开发者可以通过XML配置文件或Java注解的形式定义mapper文件。在应用程序中,mapper文件需要被加载进Mybatis框架中,这个过程就是Mybatis mapper的加载流程。下面是Mybatis mapper的加载流程:

  1. 配置文件加载(mybatis-config.xml或configLocation)
    Mybatis在启动的时候首先需要加载mybatis-config.xml或configLocation指定的配置文件,从配置文件中获取相关的信息,比如数据源、类型别名、插件、mapper文件等。
  2. 映射文件加载(mapper.xml)
    Mybatis框架会扫描mapper.xml配置文件中的所有namespace,将namespace和映射器解析到内存中,后续将基于这些映射器来执行SQL语句。
  3. Mapper注册(MapperRegistry)
    加载mapper.xml文件的时候,Mybatis框架根据mapper.xml文件中的namespace来生成一个MapperProxyFactory工厂类,并将MapperProxyFactory工厂类注册到MapperFactoryRegistry中。Mybatis框架会将所有MapperProxyFactory工厂类放在MapperFactoryRegistry中,以便后续进行调用。
  4. Mapper接口获取(MapperRegistry)
    在MapperRegistry中根据Mapper接口的class对象来获取对应的MapperProxyFactory工厂类,如果没有则新建一个MapperProxyFactory工厂类。
  5. Mapper代理对象获取(SqlSession.getMapper)
    在获取Mapper接口的代理对象的时候,Mybatis框架会根据Mapper接口的class对象构造父接口InvocationHandler的实现类MapperProxy,并使用JDK的动态代理技术构造Mapper接口的代理对象,并返回代理对象给应用程序。

3、Mybatis mapper加载流程示例

<!--mapper.xml配置文件-->
<mapper namespace="com.example.UserMapper">
    <select id="findUserById" parameterType="int" resultMap="userResultMap">
        select * from user where id = #{id}
    </select>
</mapper>
//用户Mapper接口
public interface UserMapper {
    User findUserById(int id);
}
//应用程序
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.findById(1);

以上代码演示了Mybatis mapper的加载过程:

  1. 加载mapper.xml文件的namespace为"com.example.UserMapper"的mapper配置。
  2. 将mapper配置文件中的SQL语句解析成为相应的MappedStatement对象,并注册到Configuration中。
  3. 创建Mapper接口的代理对象,并将该代理对象返回给应用程序。

再看一个注解的例子:

@Mapper
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    User findById(@Param("id") int id);
}

在使用注解的方式时,Mybatis mapper的加载过程大致如下:

  1. Mybatis框架扫描应用程序中所有的Mapper接口注解,将所有包含@Mapper注解的Mapper接口生成对应的MapperProxyFactory工厂类。
  2. Mybatis框架将所有MapperProxyFactory工厂类放在MapperFactoryRegistry中,以便后续进行调用。
  3. 通过SqlSession.getMapper方法获取Mapper接口的代理对象时,Mybatis框架会根据Mapper接口的class对象构造父接口InvocationHandler的实现类MapperProxy,并使用JDK的动态代理技术构造Mapper接口的代理对象,并返回代理对象给应用程序。

总结:Mybatis mapper的加载流程是非常复杂的一项工作,需要将XML配置文件和Java注解里的mapper文件中的SQL语句解析成MappedStatement对象,并注册到Configuration中。这样就可以通过SqlSession.getMapper获取到Mapper接口的代理对象,并可以调用mapper中定义的方法了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Mybatis对mapper的加载流程深入讲解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Android 仿微信小程序入口动画

    下面是关于“Android 仿微信小程序入口动画”的完整攻略: 背景介绍 最近微信小程序入口动画特别火,很多开发者都想学习实现这个动画效果,本文将介绍如何使用Android实现这个动画效果。 实现步骤 首先,我们需要在布局文件中添加一个LinearLayout,这个LinearLayout是用来放置小程序入口动画的。 xml <LinearLayout…

    Java 2023年5月23日
    00
  • 微信小程序模板消息推送的两种实现方式

    微信小程序的模板消息可以让开发者向用户发送特定的消息,提醒用户进行相关操作等。模板消息的推送可以有两种实现方式,分别是通过微信后台的服务接口进行推送和通过开发者自行实现后端服务器进行推送。 通过微信后台的服务接口进行推送 该方式需要先进行微信公众号的设置并获取相关的服务接口信息,具体实现步骤如下: 登录微信公众平台,进入开发-开发者工具-接口测试页; 选择模…

    Java 2023年5月23日
    00
  • Java lambda表达式与泛型整理总结

    本文主要介绍Java lambda表达式与泛型的相关概念,包括基本语法、使用场景和示例。使用Markdown语法进行排版,方便阅读。 Java lambda表达式 基本语法 Lambda表达式是JDK 1.8中引入的新特性,简化了编写匿名内部类的过程。其基本语法如下: (parameters) -> expression 或 (parameters) …

    Java 2023年5月26日
    00
  • tomcat共享多个web应用会话的实现方法

    实现多个Web应用共享会话的方法有很多,而在Tomcat中,也存在不同的实现方式。下面将详细讲解几种可行的方案。 方案一:使用Tomcat的内置共享会话功能 Tomcat自身具备相应的共享会话功能,可以通过修改配置文件来启用该功能。首先,在Tomcat安装目录下找到conf/context.xml文件,在其中添加以下配置: <Valve classNa…

    Java 2023年6月15日
    00
  • Java Spring分别实现定时任务方法

    Java Spring 是一个开源的全栈轻量级应用框架,可以通过 Spring 框架实现定时任务即在指定时间轮询执行某个任务或在固定时间执行某个任务。下面详细介绍一下 Java Spring 分别实现定时任务的方法: 1. Spring Schedule 注解方式 这种方法主要使用在方法上添加注解,从而使得方法在特定的时间点或者时间间隔执行。 在Spring…

    Java 2023年6月1日
    00
  • 深入理解Java中HashCode方法

    深入理解Java中HashCode方法 HashCode方法的概念和作用 HashCode是Java中的一个重要方法,它返回一个对象的hash值,即对象在内存中的地址的一个唯一标识符。在Java中,Hashtable、HashMap、HashSet等基于Hash算法实现的数据结构会使用对象的HashCode来确定对象在集合中的位置。因此,HashCode方法…

    Java 2023年5月26日
    00
  • Java的JSTL标签库详解

    Java的JSTL标签库详解 什么是JSTL JSTL是Java服务器标准标签库的简称,它是在Java Web开发中常用的JSP标签扩展库。JSTL的主要作用是为JSP页面提供扩展标签集,它们封装了常用的JSP页面动作,比如条件语句、循环语句等,可以让我们开发Web应用更加简单、高效、可维护。 JSTL的分类 JSTL根据其功能分为五个类型: Core 标签…

    Java 2023年5月26日
    00
  • Java+MySQL实现学生信息管理系统源码

    Java+MySQL实现学生信息管理系统 本文将介绍如何使用Java和MySQL数据库实现一个简单的学生信息管理系统,并提供完整的源码和演示。 准备工作 为了使用Java和MySQL实现学生信息管理系统,需要先进行以下准备工作: 安装Java开发环境(JDK) 安装MySQL数据库 安装Java连接MySQL的驱动程序(JDBC驱动) 在这里以Windows…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部