mybatis源码深度解析

本文深入剖析mybatis源码,详细解释SqlSessionFactory的构建过程,包括从mybatis-config.xml配置文件解析到创建SqlSessionFactory对象,以及SqlSession如何获取Mapper并执行SQL的原理。内容涉及XMLConfigBuilder、XMLMapperBuilder、Executor类型的SimpleExecutor、CachingExecutor、BatchExecutor和ReuseExecutor,以及一级缓存和二级缓存的工作机制。
摘要由CSDN通过智能技术生成
一.mybatis测试代码
  1. maven配置文件
<dependencies>
       <!-- 单元测试相关依赖 -->
       <dependency>
           <groupId>junit</groupId>
           <artifactId>junit</artifactId>
           <version>4.12</version>
           <scope>test</scope>
       </dependency>

       <!-- 日志相关依赖 -->
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.7.10</version>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-classic</artifactId>
           <version>1.1.2</version>
       </dependency>
       <dependency>
           <groupId>ch.qos.logback</groupId>
           <artifactId>logback-core</artifactId>
           <version>1.1.2</version>
       </dependency>

       <!-- mysql驱动 -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.17</version>
       </dependency>

       <!-- mybatis相关依赖 -->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.3</version>
       </dependency>

   	<dependency>
   		<groupId>cn.hutool</groupId>
   		<artifactId>hutool-all</artifactId>
   		<version>4.6.7</version>
   	</dependency>

       <!--lombok
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
           <version>1.18.10</version>
       </dependency>-->
   </dependencies>
  1. User实体类和UserMapper接口
public class User implements Serializable{

   private static final long serialVersionUID = 1L;

   private Integer id;

   private String userName;

   private String realName;

   private Byte sex;

   private String mobile;

   private String email;

   public Integer getId() {
   	return id;
   }

   public void setId(Integer id) {
   	this.id = id;
   }

   public String getUserName() {
   	return userName;
   }

   public void setUserName(String userName) {
   	this.userName = userName;
   }

   public String getRealName() {
   	return realName;
   }

   public void setRealName(String realName) {
   	this.realName = realName;
   }

   public Byte getSex() {
   	return sex;
   }

   public void setSex(Byte sex) {
   	this.sex = sex;
   }

   public String getMobile() {
   	return mobile;
   }

   public void setMobile(String mobile) {
   	this.mobile = mobile;
   }

   public String getEmail() {
   	return email;
   }

   public void setEmail(String email) {
   	this.email = email;
   }

   @Override
   public String toString() {
   	return "User [id=" + id + ", userName=" + userName + ", realName=" + realName + ", sex=" + sex + ", mobile="
   			+ mobile + ", email=" + email + "]";
   }

}
public interface UserMapper {

   @Select("select * from user where id = #{id}")
   User findById(Integer id);
   
   User findById1(Integer id);
}
  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>

   <properties resource="application.properties"/>

   <settings>
   	<setting name="logImpl" value="SLF4J" />
       <setting name="mapUnderscoreToCamelCase" value="true"/>
       <setting name="cacheEnabled" value="true"/>
   </settings>


   <!--配置environment环境 -->
   <environments default="development">
       <!-- 环境配置1,每个SqlSessionFactory对应一个环境 -->
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="UNPOOLED">
               <property name="driver" value="${jdbc_driver}"/>
               <property name="url" value="${jdbc_url}"/>
               <property name="username" value="${jdbc_username}"/>
               <property name="password" value="${jdbc_password}"/>
           </dataSource>
       </environment>

   </environments>

   <!-- 映射文件,指定mapper.xml的位置,有四种方式(详情可以看官网:https://mybatis.org/mybatis-3/configuration.html) -->
   <mappers>
       <mapper resource="mapper/UserMapper.xml"/>
   </mappers>

</configuration> 
  1. 测试类
package com.mybatis.lx;

import java.io.IOException;
import java.io.InputStream;

import javax.sql.DataSource;

import org.apache.ibatis.datasource.pooled.PooledDataSource;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.junit.Before;
import org.junit.Test;

import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

public class MybatisTest {

   
   private SqlSessionFactory sqlSessionFactory;

   /****
    * 构建SqlSessionFactory
    * @throws IOException
    */
   @Before
   public void init() throws IOException {
       String resource = "mybatis-config.xml";
       InputStream inputStream = Resources.getResourceAsStream(resource);
       // 1.构建SqlSessionFactory
       sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
       inputStream.close();
   }


   /***
    * 
    */
   @Test
   public void quickStart1() {
       // 2.获取sqlSession
       SqlSession sqlSession = sqlSessionFactory.openSession();
       // 3.ִ调用selectOne方法获取返回值
       User user = sqlSession.selectOne("com.mybatis.lx.UserMapper.findById", 1);
       // 4.关闭session
       sqlSession.close();
      System.out.println(user.toString());
   }

   /***
    * mybatis一级缓存,sqlsession级别的缓存,不同的sqlSession不会共享缓存,数据本地缓存
    */
   @Test
   public void quickStart2() {
       // 2.获取sqlSession
       SqlSession sqlSession = sqlSessionFactory.openSession();
       // 3.获取mapper
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       // 4.调用mapper接口方法
       System.out.println("第一次调查询》》》");
       User user = mapper.findById(1);
       
       System.out.println("第二次查询》》》");
       User user2 = mapper.findById(1);
       
       //5.关闭session
       sqlSession.close();
       
       
       System.out.println(user.toString());
   }
   
   /**
    * 测试mybatis二级缓存,二级缓存时多个sqlSession共享同一个缓存,是全局缓存,可以以外部的redis等工具作为存储缓存的对象,需要自己实现一个Cache接口
    */
   @Test
   public void quickStart4() {
       // 2.获取sqlSession
       SqlSession sqlSession = sqlSessionFactory.openSession();
       // 3.获取mapper
       UserMapper mapper = sqlSession.getMapper(UserMapper.class);
       // 4.调用mapper接口方法
       System.out.printl
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值