MyBatis源码初识一 SqlSessionFactoryBuilder

mybatis中文文档

mybatis-3.5.6中文文档地址

快速启动

实体类

@Data
public class User implements  Serializable{
    private Long id ;
    private String userName ;
    private Date createTime;
}

mapper接口

public interface UserMapper {
    User selectById(Long id);
}

UserMapper.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="com.my.mapper.UserMapper">

    <resultMap id="result" type="User">
        <id column="id" jdbcType="BIGINT" property="id"/>
        <result column="user_name" jdbcType="VARCHAR" property="userName"/>
        <result column="create_time" jdbcType="DATE" property="createTime"/>
    </resultMap>
    <select id="selectById" resultMap="result">
        select id,user_name,create_time from user
        <where>
            <if test="param1>0">
                and id=#{param1}
            </if>
        </where>
    </select>
</mapper>

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>
    <properties resource="db.properties"></properties>

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <typeAliases>
        <package name="com.my.entity"/>
    </typeAliases>
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${mysql.driverClass}"/>
                <property name="url" value="${mysql.jdbcUrl}"/>
                <property name="username" value="${mysql.user}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.my.mapper"/>
    </mappers>
</configuration>

db.properties

mysql.driverClass=com.mysql.jdbc.Driver
mysql.jdbcUrl=jdbc:mysql://地址/mybatis_test?characterEncoding=utf8
mysql.user=root
mysql.password=密码

启动类

public class Bootstrap {

    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = sqlSessionFactory.openSession();
        try {
            UserMapper mapper = session.getMapper(UserMapper.class);
            User user = mapper.selectById(1L);
            System.out.println(user.getUserName());
        } finally {
            session.close();
        }
    }
}

源码路程图

SqlSessionFactoryBuilder执行流程

总览图:

在这里插入图片描述

详细执行流程:

在这里插入图片描述

源码解析

构建SqlSessionFactory

调用new SqlSessionFactoryBuilder().build(reader);
执行下面代码:

public SqlSessionFactory build(Reader reader) {
  return build(reader, null, null);
}

继续调用

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
  try {
  	//创建xmlConfig构造器
    XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
    //parser.parse()解析成Configuration
    //根据Configuration构造SqlSessionFactory 
    return build(parser.parse());
  } ...
}

XMLConfigBuilder构造函数

public XMLConfigBuilder(Reader reader, String environment, Properties props) {
	//创建XPathParser,并且给XMLConfigBuilder属性赋值
  this(new XPathParser(reader, true, props, new XMLMapperEntityResolver()), environment, props);
}

XPathParser构造函数

public XPathParser(Reader reader, boolean validation, Properties variables, EntityResolver entityResolver) {
  commonConstructor(validation, variables, entityResolver);
  //将xml文件转成org.w3c.dom.Document
  this.document = createDocument(new InputSource(reader));
}

parser.parse()

public Configuration parse() {
	//如果解析过,抛异常
  if (parsed) {
    throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  parsed = true;
  //解析xml中configuration节点
  parseConfiguration(parser.evalNode("/configuration"));
  return configuration;
}

parseConfiguration

private void parseConfiguration(XNode root) {
  try {
  	//解析properties节点
    propertiesElement(root.evalNode("properties"));
    //解析settings节点
    Properties settings = settingsAsProperties(root.evalNode("settings"));
    loadCustomVfs(settings);
    //覆盖日志实现类
    loadCustomLogImpl(settings);
    //解析别名
    typeAliasesElement(root.evalNode("typeAliases"));
    //解析插件
    pluginElement(root.evalNode("plugins"));
    //解析对象工厂类,创建对象时通过此类创建
    objectFactoryElement(root.evalNode("objectFactory"));
    objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
    reflectorFactoryElement(root.evalNode("reflectorFactory"));
    //覆盖默认settings
    settingsElement(settings);
    //根据环境加载数据源
    environmentsElement(root.evalNode("environments"));
    //供应商
    databaseIdProviderElement(root.evalNode("databaseIdProvider"));
    //加载自定义typeHandlers
    typeHandlerElement(root.evalNode("typeHandlers"));
    //解析mapper.xml
    mapperElement(root.evalNode("mappers"));
  } catch (Exception e) {
    throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 学习阅读 MyBatis 码可以通过以下几个步骤来进行: 1. 了解 MyBatis 的基本概念和架构。MyBatis 是一个持久层框架,主要用于将 Java 应用程序与数据库进行交互。它的基本架构包括 SqlSessionFactory、SqlSession、Mapper 接口和 Mapper 映射文件等。 2. 安装并配置必要的工具。MyBatis 码使用 Java 语言编写,因此你需要安装 Java 开发环境 (JDK) 并配置相应的环境变量。此外,你还需要安装一个 IDE (如 IntelliJ IDEA、Eclipse 等),方便你阅读和调试码。 3. 下载并导入 MyBatis 码。你可以在 MyBatis 官方网站 (https://mybatis.org/) 或者 GitHub 上下载最新的 MyBatis 码。然后,使用你所选择的 IDE 将码导入到工程中。 4. 阅读 MyBatis 码。在阅读 MyBatis 码时,你可以先从 SqlSessionFactory、SqlSession 和 Mapper 接口开始,了解它们的作用和实现原理。然后,你可以继续阅读 Mapper 映射文件的解析和执行相关的码,以及 MyBatis 的缓存机制和插件系统等。 希望这些建议能帮助你阅读 MyBatis 码。 ### 回答2: 阅读MyBatis码需要按照一定的步骤和方法进行: 1.了解MyBatis的基本原理和架构:MyBatis是一个用于持久化数据的框架,核心原理是通过映射文件将Java对象和SQL语句进行映射。了解MyBatis的整体架构和主要组件,如SqlSessionFactory、SqlSession、Mapper和Executor等,有助于理清码的调用逻辑。 2.建立开发环境:首先需要安装Gradle或Maven等构建工具,并在本地环境中配置好Java、IDE和版本控制工具。然后从MyBatis的GitHub仓库中下载码,并导入到IDE工具中。 3.阅读码文档:MyBatis码中包含大量注释和文档说明,建议先仔细阅读相关的官方文档和码中的注释。这些文档和注释能够帮助理解MyBatis的设计思想、核心模块和具体实现细节。 4.跟踪关键方法:根据自己的需求和兴趣,选择一些关键的方法进行码分析。例如,可以从入口方法如SqlSessionFactoryBuilder的build()方法开始跟踪,逐步深入到SqlSession的实现过程,并追踪具体功能的实现方法,如Mapper接口的代理实现等。 5.调试和测试:利用IDE提供的调试功能,结合单元测试框架,对MyBatis码进行逐步调试和验证。通过调试可以更直观地了解代码运行流程、变量的变化以及方法的调用关系。 6.阅读相关文章和博客:MyBatis是一个非常成熟的开项目,有很多开发者对MyBatis进行了深入研究并发表了相关文章和博客。可以通过搜索相关的文章和博客,结合实际的码分析,进行更深入的了解与研究。 总之,阅读MyBatis码需要有一定的Java编程基础和数据库相关知,并需要花费较长时间和精力进行分析和理解。通过持续的学习和实践,逐渐掌握MyBatis码,才能更好地运用和定制该框架。 ### 回答3: 要阅读MyBatis码,一般可以按照以下步骤进行: 1. 下载码:首先需要从官方网站或GitHub上下载MyBatis码,并解压到本地。 2. 导入项目:利用常见的Java开发工具(如Eclipse、IntelliJ IDEA等),将MyBatis码作为一个普通的Java项目导入到IDE中。 3. 了解项目结构:浏览码目录结构,了解各个模块的职责和功能。主要关注的目录包括核心模块如Configuration、Executor等,以及与数据库交互的模块如Mapper、Session等。 4. 学习基本原理:通过查看MyBatis官方文档、阅读相关书籍或者参考在线教程,了解MyBatis的基本原理、核心概念和设计思路。熟悉MyBatis的工作流程和各个模块之间的交互方式。 5. 调试码:通过IDE的调试功能,可以设置断点并单步调试MyBatis码,深入了解代码执行流程和各个模块的调用关系。 6. 阅读码注释:MyBatis码中有丰富的注释,阅读注释可以更好地理解码的逻辑和功能。特别是重要的类、方法、接口等的注释,对于快速理解码非常有帮助。 7. 参考官方文档和社区资MyBatis官方提供了详细的文档,对于码解读和使用方法都有很好的指导作用。此外,MyBatis社区中也有很多相关资和讨论,可以查阅相关问题和解答,获取更多的帮助。 8. 实践和调试:结合自己的项目需求,尝试在MyBatis码的基础上扩展功能或解决问题。通过自己的实践和调试,更深入地理解MyBatis码和工作机制。 总之,阅读MyBatis码需要结合官方文档、在线资和自己的实践,有系统地学习和理解其中的原理和设计思路,并通过调试等方式深入码,才能更好地阅读和理解MyBatis码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值