mybatis源码分析-mybatis配置阶段的执行流程分析

发布时间:2022-08-18 18:29

mybatis源码分析-mybatis配置阶段的执行流程分析

hello world

看源码到底怎么去看,我总结的是要有目的的去看源码。例如mybatis,我们在github拉下来源码后发现一堆代码,没头没尾无从下手。但是如果我们先写一个Demo,来分析这个demo的每一步到底干了什么,就好分析了。这也就是为啥学习一门新技术都需要先学习怎么使用。

创建一个maven项目,引入mybatis的依赖
<dependency>
    <groupId>org.mybatisgroupId>
    <artifactId>mybatisartifactId>
    <version>3.4.6version>
dependency>
项目目录结构

mybatis源码分析-mybatis配置阶段的执行流程分析_第1张图片

创建一个实体类和对应的mapper接口
/** 实体类 */
public class File {
    private Integer id;
    private Integer parentId;
    private String name;
    private Integer isFolder;
    .... 省略get/set
}

/** mapper接口 */
public interface FileMapper {
    List<File> selectList();
}
mapper.xml

一段很简单的sql语句,就是查询全部的file文件,我已经提前在数据库中插入了几条数据。数据库就不展示了,很简单就这几个字段。



<mapper namespace="org.mybatis.internal.example.mapper.FileMapper">
    <select id="selectList" resultType="org.mybatis.internal.example.pojo.File">
        select id,parent_id parentId, name, is_folder isFolder from file;
    select>
mapper>
在resource文件夹下创建一个myabtis-config.xml全局配置文件


<configuration>
    <properties>
        <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true"/>
        <property name="username" value="root"/>
        <property name="password" value="root"/>
    properties>
    
    <typeAliases>




        <package name="org.mybatis.internal.example.pojo"/>
    typeAliases>


    <environments default="development2">
        <environment id="development">
            <transactionManager type="JDBC"/>

            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="root"/>
                <property name="password" value="root"/>
            dataSource>
        environment>
        <environment id="development2">
            <transactionManager type="JDBC"/>

            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            dataSource>
        environment>
    environments>
    <databaseIdProvider type="DB_VENDOR">
        <property name="SQL Server" value="sqlserver"/>
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle" />
    databaseIdProvider>





    
    <mappers>
        <package name="org.mybatis.internal.example.mapper"/>
    mappers>






configuration>
现在创建main方法继续测试
public class MybatisHelloWorld {
    // 配置阶段
        // 得到mybatis 配置类的文件路径
        String resource = "mybatis/Configuration.xml";
        Reader reader = null;
        SqlSession session = null;
        try{
            Yaml yml = new Yaml();
            LinkedHashMap map = yml.loadAs(MybatisHelloWorld.class.getClassLoader().getResourceAsStream("config.yml"), LinkedHashMap.class);
            System.out.println(map);
            Map dataSourceMap = (Map)map.get("dataSource");
            System.out.println(dataSourceMap.get("username"));
            // 通过Resources.getResourceAsReader 得到配置文件的字节流
            reader = Resources.getResourceAsReader(resource);
            // 这里的Properties 和配置文件Configuration.xml 里面的一致,使用Java配置可以实现动态的properties
            Properties properties = new Properties();
//            properties.setProperty("username", dataSourceMap.get("username") + "");

            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader,properties);
            // 执行SQL阶段
            // 得到一个session连接
            session = sqlSessionFactory.openSession();
            FileMapper fileMaper = session.getMapper(FileMapper.class);
            List<File> fileList = fileMaper.selectList();
        	list.forEach(System.out::println);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            session.commit();
            session.close();
        }
       
}

源码分析阶段

这段代码中核心的代码只有四句代码,这四句我把整个mybatis 从配置到执行sql语句得到想要的结果 分为两个阶段:

  • 配置阶段
  • 执行阶段

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号