Mybatis源码详细分析(最新最全)

目录

1、概述

2、项目搭建

3、源码分析

     3.1 SqlSessionFactory的构建

     3.2 SqlSession的获取

     3.3 动态代理获取Mapper对象

     3.4 通过Mapper的执行过程

4、总结


1、概述

        国内数据库访问层从之前火爆的Hibernate到现在绝大部分公司都用Mybatis,倒也不是说Mybatis比Hibernate优秀,看看现在Spring Data JPA底层的支持还是Hibernate,只是国内大小厂都投入到Mybatis的怀抱中,导致国内现在的Hibernate用的越来越少。所以很有必要深入了解一下Mybatis的源码,这样我们开发起来才会更加的得心应手。Mybatis的使用博主也用了三年多的时间,相比于Hibernate,Mybatis确实更容易上手,使用起来也更加的灵活。下面就从项目的搭建到源码分析一步一步深入了解Mybatis。

2、项目搭建

     项目的搭建我们可以参照官方文档,中文文档地址:官方文档。本次基于mybatis-3.5.6.jar版本搭建分析,不加入Spring的整合。参考官方文档,我们只需要创建mybatis-config.xml和mapper.xml文件以及对应的mapper接口。为了方便大家阅读,搭建源码如下:

   1、mybatis-config.xml

<?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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="mybatis/mapper/WxUserMapper.xml"/>
    </mappers>
</configuration>

2、WxUserMapper.xml

<?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="mapper.WxUserMapper">

    <resultMap id="wxUser" type="pojo.WxUser">
        <result column="user_id" property="userId" jdbcType="INTEGER" javaType="Integer"/>
        <result column="user_account" property="userAccount" jdbcType="VARCHAR" javaType="String"/>
        <result column="user_createtime" property="userCreatetime" jdbcType="TIMESTAMP"
                javaType="java.time.LocalDateTime"/>
    </resultMap>
    <sql id="userColumn">
        user_id,
        user_account,
        user_createtime
    </sql>
    <select id="getWxUserById" parameterType="java.lang.String" resultMap="wxUser">
        SELECT
        <include refid="userColumn"/>
        FROM `wx_user`
        where
        user_id = #{userId}
    </select>
</mapper>

3、WxUserMapper

public interface WxUserMapper {
    WxUser getWxUserById(String userId);
}

4、MybatisTest

public class MybatisTest {
    public static void main(String[] args) {
        try {
            String resource = "mybatis-config.xml";
            // 通过classLoader获取到配置文件
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            // 把配置文件和mapper文件封装到Configuration实体类
            SqlSessionFactory sqlSessionFactory = builder.build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();

            // 动态代理方式
            WxUserMapper mapper = sqlSession.getMapper(WxUserMapper.class);
            WxUser user = mapper.getWxUserById("8");
            System.out.println("通过动态代理返回结果" + user.getUserAccount());

            // 不用动态代理的方式直接statement获取查询
            WxUser u2 = sqlSession.selectOne("mapper.WxUserMapper.getWxUserById", "8");
            System.out.println("通过statement返回结果" + u2.getUserAccount());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、源码分析

     3.1 SqlSessionFactory的构建

        由于SqlSessionFactory初始化需要的参数比较多,所以Mybatis这里采用了构造者模式通过xml的方式实例化一个SqlSessionFactory对象。具体的属性和配置可以查看官方文档。通过查看SqlSessionFactoryBuilder的build方法分析源码,主要逻辑看代码注释(最好结合源码对

  • 14
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值