下面是对"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的加载流程:
- 配置文件加载(mybatis-config.xml或configLocation)
Mybatis在启动的时候首先需要加载mybatis-config.xml或configLocation指定的配置文件,从配置文件中获取相关的信息,比如数据源、类型别名、插件、mapper文件等。 - 映射文件加载(mapper.xml)
Mybatis框架会扫描mapper.xml配置文件中的所有namespace,将namespace和映射器解析到内存中,后续将基于这些映射器来执行SQL语句。 - Mapper注册(MapperRegistry)
加载mapper.xml文件的时候,Mybatis框架根据mapper.xml文件中的namespace来生成一个MapperProxyFactory工厂类,并将MapperProxyFactory工厂类注册到MapperFactoryRegistry中。Mybatis框架会将所有MapperProxyFactory工厂类放在MapperFactoryRegistry中,以便后续进行调用。 - Mapper接口获取(MapperRegistry)
在MapperRegistry中根据Mapper接口的class对象来获取对应的MapperProxyFactory工厂类,如果没有则新建一个MapperProxyFactory工厂类。 - 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的加载过程:
- 加载mapper.xml文件的namespace为"com.example.UserMapper"的mapper配置。
- 将mapper配置文件中的SQL语句解析成为相应的MappedStatement对象,并注册到Configuration中。
- 创建Mapper接口的代理对象,并将该代理对象返回给应用程序。
再看一个注解的例子:
@Mapper
public interface UserMapper {
@Select("select * from user where id = #{id}")
User findById(@Param("id") int id);
}
在使用注解的方式时,Mybatis mapper的加载过程大致如下:
- Mybatis框架扫描应用程序中所有的Mapper接口注解,将所有包含@Mapper注解的Mapper接口生成对应的MapperProxyFactory工厂类。
- Mybatis框架将所有MapperProxyFactory工厂类放在MapperFactoryRegistry中,以便后续进行调用。
- 通过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技术站