ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

2mybatis-1条sql在mybatis的执行过程

2021-08-05 02:01:52  阅读:183  来源: 互联网

标签:MappedStatement resultHandler Object boundSql ms sql mybatis 2mybatis rowBounds


MapperProxy

Map<Method, MapperMethod> methodCache;

MapperMethod mapperMethod = cachedMapperMethod(method);
从methodCache获取mapper里的一个方法

return mapperMethod.execute(sqlSession, args);

MapperMethod

SqlCommand 封装了sql的类型,方法名
MethodSignature 方法的返回值、参数

Object execute(SqlSession sqlSession, Object[] args){...}
执行方法

Object param = method.convertArgsToSqlCommandParam(args);
解析方法参数

result = rowCountResult(sqlSession.insert(command.getName(), param));
解析方法结果

result = sqlSession.selectOne(command.getName(), param);
通过sqlSession执行方法

result = executeForMany(sqlSession, args);
执行List<结果>查询

Object executeForMany(SqlSession sqlSession, Object[] args) {..}

result = sqlSession.selectList(command.getName(), param);

DefaultSqlSession

public List selectList(String statement/** 这个类名+方法名+参数*/, Object parameter) {..}

return this.selectList(statement, parameter, RowBounds.DEFAULT);

public List selectList(String statement, Object parameter, RowBounds rowBounds) {...}

MappedStatement ms = configuration.getMappedStatement(statement);
从configuration中获取MappedStatement

return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
executor执行查询

CachingExecutor

public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) {...}

BoundSql boundSql = ms.getBoundSql(parameterObject);
在MappedStatement获取BoundSql

CacheKey key = createCacheKey(ms, parameterObject, rowBounds, boundSql);
创建CacheKey

return query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql){...}

Cache cache = ms.getCache();
在MappedStatement中查找是否有缓存

BaseExecutor

public List query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {...}

list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);
缓存中没有,从数据中查询

private List queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {...}

list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);
使用SimpleExecutor执行查询,并返回结果,
SimpleExecutor -》 StatementHandler(不同类型的StatementHandler)具体执行

SimpleExecutor

public List doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {...}

Configuration configuration = ms.getConfiguration();

StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
获取一个RoutingStatementHandler

stmt = prepareStatement(handler, ms.getStatementLog());
制作stmt

return handler.query(stmt, resultHandler);
在StatementHandler中执行jdbc的stmt,并返回查询结果

-finally closeStatement(stmt);
关闭statement

Configuration

protected final Map<String, MappedStatement> mappedStatements = new StrictMap("Mapped Statements collection");

public MappedStatement getMappedStatement(String id, boolean validateIncompleteStatements) {...}

return mappedStatements.get(id);//id是com.roncoo.eshop.inventory.mapper.UserMapper.findUserInfo
从全局Map mappedStatements获取MappedStatement

public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {...}

StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
创建一个RoutingStatementHandler

statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
这里也有拦截,new executor时给它增强类似,,返回一个增强过后的实例

MappedStatement

存放了一个mapper的元素信息,比如useCache、List resultMaps、参数等

StatementHandler

制作statement,返回给exector调用

RoutingStatementHandler

构造函数
根据不同的ms.getStatementType() STATEMENT、PREPARED、CALLABLE 创建SimpleStatementHandler/PreparedStatementHandler/CallableStatementHandler

PreparedStatementHandler

public List query(Statement statement, ResultHandler resultHandler) throws SQLException {...}

PreparedStatement ps = (PreparedStatement) statement;
在PreparedStatementHandler中获取PreparedStatement

ps.execute();
执行请求

return resultSetHandler. handleResultSets(ps);
返回结果

标签:MappedStatement,resultHandler,Object,boundSql,ms,sql,mybatis,2mybatis,rowBounds
来源: https://www.cnblogs.com/kltsee/p/15101477.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有