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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值