mybatis執行過程梳理(2)——讀取sql語句,生成sql語句——執行,得到結果,組裝到結果集中

1,讀取配置文件,生成連接
2,讀取sql語句,生成sql語句——執行,得到結果,組裝到結果集中


2,讀取sql語句,生成sql語句 ——執行,得到結果,組裝到結果集中

SqlSession session = SqlsessionFactory.openSession();
UserMapper mapper = session.getMapper(UserMapper.class);
User user = mapper.selectById(1);
SqlSession session = SqlsessionFactory.openSession();
User user = session.selectOne("org.mybatis.example.UserMapper.selectById",1);

這裏寫的比較簡單,詳細的Mybatis寫法,可以參考https://www.cnblogs.com/hellokitty1/p/5216025.html

在DefaultSqlSession中,getMapper() 方法最終返回一個根據提供的接口的代理類,來執行其方法

public <T> T getMapper(Class<T> type) {
        return this.configuration.getMapper(type, this);
    }

在Configuration類中,getMapper是通過調用一些的方法,最終通過反射建立接口的代理

public <T> T getMapper(Class<T> type, SqlSession sqlSession) {
        return this.mapperRegistry.getMapper(type, sqlSession);
    }

在SqlSession接口中,主要方法有:selectOne,selectList,selectMap,selectCursor,insert,update,delete,commit,rollback
選擇類的selectOne,selectMap,selectList,根據不同的參數也重載了幾個方法,但是最終都指向了selectList()方法
selectOne在selectList的結果集中判斷,長度必須是1,就返回get(0),否則報錯
selectMap就是把List結果集中的數據包裝成Map

public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
        List var5;
        try {
            MappedStatement ms = this.configuration.getMappedStatement(statement);
            var5 = this.executor.query(ms, this.wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
        } catch (Exception var9) {
            throw ExceptionFactory.wrapException("Error querying database.  Cause: " + var9, var9);
        } finally {
            ErrorContext.instance().reset();
        }

        return var5;
    }

selectCursor是關於遊標的,我目前也不明白,以後研究吧。
insert,update,delete是三個修改數據庫的,由於他們最終執行都是executor.update(),所有三者重載的所有方法最終都指向了update方法。

public int update(String statement, Object parameter) {
        int var4;
        try {
            this.dirty = true;
            MappedStatement ms = this.configuration.getMappedStatement(statement);
            var4 = this.executor.update(ms, this.wrapCollection(parameter));
        } catch (Exception var8) {
            throw ExceptionFactory.wrapException("Error updating database.  Cause: " + var8, var8);
        } finally {
            ErrorContext.instance().reset();
        }

        return var4;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章