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; } }
接口UserDao
public interface UserDao { List<User> findUser(); }
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>
二 通过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的操作


浙公网安备 33010602011771号