Mybatis底层调用过程源码分析(基于sqlsession增删改查)

一 概述

a  mybatis正常一条select查询有两种方式实现

  1 通过sqlsession.selectList调用

  2 通过sqlsession.getMapper()代理实现

 当然mybatis默认开启二级缓存,不开启二级缓存可以在配置文件配置

  <setting name="cacheEnabled" value="true"/>

b 所需基本类的创建

  User实体类创建

  

public class User {
    
    private String name;
    private int   age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    
    
}
View Code

  接口UserDao

  

public interface UserDao {
    
    List<User> findUser();
}
View Code

  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.dp.ssm.dao.UserDao">


    <select id="findUser" resultType="com.dp.ssm.entity.User">
        select * from user  
    </select>
    


</mapper>
View Code

 

二 通过sqlsession.selectList方式源码分析

    (1) 首先DefaultSqlSession调用selectList     

        SqlSessionFactory  sqlSessionFactory=new  SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));
        SqlSession sqlSession=sqlSessionFactory.openSession();
        List<User> list=sqlSession.selectList("com.dp.ssm.dao.UserDao.findUser");    

    (2)进入DefaultSqlSession的selectList方法    

    

       MappedStatement里面封装了UserMapper中select查询用户标签的所有信息包括sql

  (3)  进入CachingExecutor,首先根据传入的命名空间拿到sql,生成缓存key在调用,从缓存中取数据,如果没有取到,继续调用CachingExecutor中的属性SimpleExecutor的query方法.因为SimpleExecutor又继承

    BaseExecutor类,进入到BaseExecutor的query方法. (此处用到了装饰模式\模板模式)

    

      

  (4)  进入BaseExecutor,先从一级缓存中获取数据,拿不到直接查询数据库

    

  (5)查询数据库.下面就是熟悉的jdbc的操作

    

posted @ 2021-02-22 14:26  StrangerIt  阅读(183)  评论(0)    收藏  举报