前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >你研究过MyBatis源码?

你研究过MyBatis源码?

作者头像
田维常
发布2024-05-11 14:08:35
570
发布2024-05-11 14:08:35
举报

你好,我是田哥

前两天,一个朋友去面试,面试官问:说一下MyBatis动态代理原理?

主要还是他的简历上写了:深入研究过MyBatis源码

可是,这位朋友并没有看过,就只是背过一些八股文,面试者回答还是够优秀。

咱们不多说了,开始正题吧。

MyBatis是一个ORM工具,封装了JDBC的操作,简化业务编程。Mybatis在web工程中,与Spring集成,提供业务读写数据库的能力。

另外,市面上关于ORM框架很多,从我身边的朋友反馈来看,使用率:

MyBatis > MyBatis-Plus > JPA > Hibernate>其他

我们还是按照老规矩,从demo案例开始。

使用步骤

引入依赖

采用Maven包依赖管理,mybatis-3.5.5版本;同时需要数据库连接驱动

代码语言:javascript
复制
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.5</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>
配置文件

配置文件配置数据库连接源,及映射文件。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <!-- 数据库连接方式 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost/user" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!-- 注册表映射文件 -->
    <mappers>
        <mapper resource="mybatis/User.xml"/>
    </mappers>

</configuration>
接口定义

定义实体:

代码语言:javascript
复制
@Data
public class User {

    private String username;
    private String password; 
}

接口定义

代码语言:javascript
复制
public interface UserMapper {
    List<User> queryUser();
}

定义映射文件

代码语言:javascript
复制
<?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.xiongxin.mybatis.mapper.UserMapper">

    <select id="queryUser" resultType="com.xiongxin.mybatis.entity.User">
        select * from tbl_user
    </select>

</mapper>
加载执行
代码语言:javascript
复制
public class TestMain {

    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        //加载 mybatis 的配置文件(它也加载关联的映射文件)
        Reader reader = Resources.getResourceAsReader(resource);
        //构建 sqlSession 的工厂
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //创建能执行映射文件中 sql 的 sqlSession
        SqlSession session = sessionFactory.openSession();
        UserMapper userMapper = session.getMapper(UserMapper.class);
        List<User> users = userMapper.queryUser();
        System.out.println(JSON.toJSONString(users));
    }

}
---------------------------------
..consule print..
[{"password":"password","username":"xiongxin"}]

到这里,这个Mybatis的使用环节结束。

整个实现过程中,我们并未编写Mapper的实现类,框架是如何在无实现类的场景下实现接口方法返回的呢?

这里就不得不说到接口的动态代理方法了。

原理解析

请看下面这张图:

层次结构

SqlSession接口的实现中,获取Mapper的代理实现类

使用了JDK动态代理的功能

代理类执行方法调用

方法调用中执行MethodInvoker

最终执行execue方法。

获取返回结果Result。

我对MyBatis进行了深入的研究,以及形成文档形式,请看下面这个思维导图:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java后端技术全栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用步骤
    • 引入依赖
      • 配置文件
        • 接口定义
          • 加载执行
          • 原理解析
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档