mybatis-查询过程

基本的查询过程:

sqlsession--->executor---->statementhandler---->statement----->db

InputStream resourceAsStream = Resources.getResourceAsStream("testMybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> selectList = sqlSession.selectList("com.nxz.dao.UserDao.query");

1、sqlsession.selectList()方法

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

2、executor.query   ---》baseExecutor中的query方法

  @Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {BoundSql boundSql = ms.getBoundSql(parameter);CacheKey key = createCacheKey(ms, parameter, rowBounds, boundSql);return query(ms, parameter, rowBounds, resultHandler, key, boundSql);}@SuppressWarnings("unchecked")@Overridepublic <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {ErrorContext.instance().resource(ms.getResource()).activity("executing a query").object(ms.getId());if (closed) {throw new ExecutorException("Executor was closed.");}if (queryStack == 0 && ms.isFlushCacheRequired()) {clearLocalCache();}List<E> list;try {queryStack++;list = resultHandler == null ? (List<E>) localCache.getObject(key) : null;if (list != null) {handleLocallyCachedOutputParameters(ms, key, parameter, boundSql);} else {list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql);}} finally {queryStack--;}if (queryStack == 0) {for (DeferredLoad deferredLoad : deferredLoads) {deferredLoad.load();}// issue #601deferredLoads.clear();if (configuration.getLocalCacheScope() == LocalCacheScope.STATEMENT) {// issue #482clearLocalCache();}}return list;}private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException {List<E> list;localCache.putObject(key, EXECUTION_PLACEHOLDER);try {list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql);} finally {localCache.removeObject(key);}localCache.putObject(key, list);if (ms.getStatementType() == StatementType.CALLABLE) {localOutputParameterCache.putObject(key, parameter);}return list;}

3、doQuery会到对应的执行器实现类中找对应方法(simpleExecutor、batchExecutor、ReuseExecutor)

  @Overridepublic <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {Statement stmt = null;try {Configuration configuration = ms.getConfiguration();//创建statementhandler实例的时候回通过RoutingStatementHandler根据不同的类型类创建(statement,prepared、callable三种类型),这个类型可在mapper.xml sql中配置,默认prepared,即preparedStatementHandlerStatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);stmt = prepareStatement(handler, ms.getStatementLog());return handler.<E>query(stmt, resultHandler);} finally {closeStatement(stmt);}}
  private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {Statement stmt;Connection connection = getConnection(statementLog);stmt = handler.prepare(connection, transaction.getTimeout());handler.parameterize(stmt);return stmt;}

<select id="findAllStudents" resultMap="StudentResult" statementType="STATEMENT">SELECT * FROM STUDENTS
</select>

posted @ 2018-06-12 23:44 犇犇丶 阅读(...) 评论(...) 编辑 收藏

mybatis-查询过程相关推荐

  1. mybatis mysql Dao_Dao模式创建mybatis项目过程

    Java EE框架 1.表现层 springMVC 2.粘合剂 spring(IOC/控制反转 AOP/面向切面编程 DI/依赖注入) 3.持久层 mybatis Dao模式创建mybatis项目过程 ...

  2. mybatis初始化过程

    mybatis初始化过程 mybatis初始化如下: //加载配置文件 InputStream resourceAsStream = Resources.getResourceAsStream(&qu ...

  3. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  4. mybatis查询mysql数据库很慢_mybatis查询大量数据库

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  5. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  6. java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...

    这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...

  7. 【转】DNS查询过程

    DNS查询过程 DNS的查询过程是指在客户端通过DNS服务器将一个IP地址转换为一个FQDN(Fully Qualified Domain Name,完全合格的域名),或将一个FQDN转化为一个IP地 ...

  8. 不敢相信,相同 SQL 下 Mybatis 查询结果和数据库竟然不一样!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | jianshu.com/p/7c569ca68 ...

  9. MySQL查询过程及Scheme设计与数据类型优化

    MySQL查询过程 我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的.一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的 ...

  10. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询

    最近有个需求,要修改现有存储结构,涉及查询条件和查询效率的考量,看了几篇索引和HBase相关的文章,回忆了相关知识,结合项目需求,说说自己的理解和总结. 总体目录如下,上篇介绍了前3小节,分析了索引为 ...

最新文章

  1. 曹长树:江湖小虾米的侠客行——我的大数据能力修炼得道之路 | 提升之路系列...
  2. c语言折半查找法_C语言学习|选择法排序及折半查找法查找
  3. matlab积分与绘图
  4. 直播 | 同源共流:一个优化框架统一与解释图神经网络
  5. 新事务不能登记到指定的事务处理器中异常的处理----MSDTC的正确配置
  6. 台式机电脑配置单_2020年电脑配置单重点硬件参考
  7. 文件上传至将File转换成MultiPartFile
  8. glob在php中的意思,PHP函数glob介绍
  9. 在XIB里面关于@property,@synthesize,release,dealloc的怪现象
  10. RN和React路由详解及对比
  11. 07.用户控件弹窗提示后页面显示不正常;
  12. java web filter 入口_springboot 通过@WebFilter(urlPatterns )配置Filter过滤路径
  13. linux mysql数据库升级_Linux升级mysql到5.7
  14. ssm-学子商城-项目第一天
  15. 种子填充算法c语言代码实现,OpenGL绘图实例三之种子填充算法
  16. iOS | OC 面向对象的编程
  17. QQ互联--个人资料提交审核
  18. 嵌入式arm(一)学ARM要掌握的预备知识(本篇文章持续更新)
  19. 从团队协作与主题解读ios主流思维导图软件
  20. Python:同花顺全数据接口

热门文章

  1. 指定应用程序网络连接_总结Java开发Web应用程序应该理解的几个知识点
  2. PHP函数库之BC高精确度函数库
  3. java thread sleep 效率_Thread.sleep(0):线程休眠0秒有什么意义!
  4. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
  5. macos 安装python3.8 版本_用python安装cutadapt程序
  6. eclipse android开发环境搭建_聊聊Spring boot2.X开发环境搭建和基本开发
  7. SecurityContextPersistenceFilter和SecurityContextHolder的作用
  8. AWS 基础服务学习
  9. 自动刷新_AutoRefresh插件:开启页面自动刷新!
  10. python是脚本语言、需要编译器编译执行_使用Notepad++编译运行C/C++/Python程序