mybatis_3源码阅读日记_配置解析过程

简单的Mybatis应用

每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以又通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件加载配置信息,然后创建SqlSessionFactory。先看下面的例子
主程序:

package org.apache.test.model;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.UUID;

@Slf4jp
ublic class MybatisTest {
    public static void main(String[] args) throws IOException {
        String resource = "resources\\mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = sqlSessionFactory.openSession();
        UUID uuid = UUID.randomUUID();
        // 插入记录
        session.insert("org.apache.test.model.User.insert", new User(uuid, "songhongwei", 28, 250000));
        // 提交事务
        session.commit();
        // 通过xml方式查询数据
        User user = session.selectOne("org.apache.test.model.User.selectUser", uuid.toString());
        log.info("User is {}", user);
        //通过mapper接口的方式查询数据
        user = session.getMapper(UserMapper.class).selectOne(uuid.toString());
        log.info("User is {}", user);
    }
}

配置文件

<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeHandlers>
        <typeHandler handler="org.apache.ibatis.submitted.uuid_test.UUIDTypeHandler"></typeHandler>
    </typeHandlers>
    <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/mybatisdb?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="resources/UserMapper.xml"/>
        <mapper class="org.apache.test.model.UserMapper"/>
    </mappers>
</configuration>

Mapper文件

<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.apache.test.model.User">
    <select id="selectUser" resultType="org.apache.test.model.User">
        select * from User where id = #{id}
    </select>
    <insert id="insert" parameterType="org.apache.test.model.User">
        insert into user(id,name,age,salary)values (#{id},#{name},#{age},#{salary})
    </insert>
</mapper>

Mapper接口

package org.apache.test.model;

import org.apache.ibatis.annotations.Select;

/**
 * Description
 *
 * @author s19744
 * @time 2021:01:05 2021/1/5-10:50
 * @package_name org.apache.test.model
 **/
public interface UserMapper {
    @Select("select * from user where id = #{id}")
    User selectOne(String id);
}

程序如果不出错将输出,并在数据库中插入一条记录

 INFO [main] - User is {"id":c646ac00-0976-444b-9700-4609226b0151,"name":"songhongwei","age":28,"salary":250000.0}
 
 INFO [main] - User is {"id":c646ac00-0976-444b-9700-4609226b0151,"name":"songhongwei","age":28,"salary":250000.0}

配置解析过程

从上述代码可以看出,SqlSessionFactoryBuilder是一个关键的入口类,其中承担了mybatis配置文件的加载,解析,内部构建等职责。

 String resource = "resources\\mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);

Resources.getResourceAsStream(resource)读取文件

public static InputStream getResourceAsStream(String resource) throws IOException {
    return getResourceAsStream(null, resource);
  }
  
public static InputStream getResourceAsStream(ClassLoader loader, String resource) throws IOException {
    InputStream in = classLoaderWrapper.getResourceAsStream(resource, loader);
    if (in == null) {
      throw new IOException("Could not find resource " + resource);
    }
    return in;
  }
  
public InputStream getResourceAsStream(String resource, ClassLoader classLoader) {
    return getResourceAsStream(resource, getClassLoaders(classLoader));
  }
  InputStream getResourceAsStream(String resource, ClassLoader[] classLoader) {
    for (ClassLoader cl : classLoader) {
      if (null != cl) {

        // try to find the resource as passed
        InputStream returnValue = cl.getResourceAsStream(resource);

        // now, some class loaders want this leading "/", so we'll add it and try again if we didn't find the resource
        if (null == returnValue) {
          returnValue = cl.getResourceAsStream("/" + resource);
        }

        if (null != returnValue) {
          return returnValue;
        }
      }
    }
    return null;
  }

总结:主要是通过ClassLoader.getResourceAsStream()方法获取指定的classpath路径下的Resource
时序图:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值