目录

  • 简介
  • MappedStatement是如何被加载的?
  • 源码流程

简介

MappedStatement 对象是对xml文件sql的封装, 包含很多属性 :

public final class MappedStatement {

      //mapper配置文件名,如:UserMapper.xml
	  private String resource;
	  // 全局配置
	  private Configuration configuration;
	  // 对象<select> 中的id值
	  private String id;
	  //尝试影响驱动程序每次批量返回的结果行数和这个设置值相等
	  private Integer fetchSize;
	  //等待数据库返回请求结果的秒数,超时将会抛出异常
	  private Integer timeout;
	  //参数可选值为STATEMENT、PREPARED或CALLABLE,这会让MyBatis分别使用Statement、PreparedStatement或CallableStatement与数据库交互,默认值为PREPARED
	  private StatementType statementType;
	  //结果类型。参数可选值为FORWARD_ONLY、SCROLL_SENSITIVE或SCROLL_INSENSITIVE
	  private ResultSetType resultSetType;
	  //表示解析出来的SQL
	  private SqlSource sqlSource;
	  //缓存
	  private Cache cache;
	  //引用通过< parameterMap >标签定义的参数映射。(该属性已经废弃)
	  private ParameterMap parameterMap;
	  //用于引用通过< resultMap >标签配置的实体属性与数据库字段之间建立的结果集的映射
	  private List<ResultMap> resultMaps;
	  //用于控制是否刷新缓存。如果将其设置为true,则任何时候只要语句被调用,都会导致本地缓存和二级缓存被清空,默认值为false
	  private boolean flushCacheRequired;
	  //是否使用二级缓存。如果将其设置为true,则会导致本条语句的结果被缓存在MyBatis的二级缓存中,对应标签,该属性的默认值为true
	  private boolean useCache;
	  private boolean resultOrdered;
	  //sql语句的类型,如select、update、delete、insert
	  private SqlCommandType sqlCommandType;
	  private KeyGenerator keyGenerator;
	  private String[] keyProperties;
	  private String[] keyColumns;
	  //是否包含嵌套查询
	  private boolean hasNestedResultMaps;
	  //数据库ID,用来区分不同环境
	  private String databaseId;
	  private Log statementLog;
	  private LanguageDriver lang;
	  private String[] resultSets;
  }

在test类中想调用mapper层需要什么步骤_开发语言

MappedStatement是如何被加载的?

MappedStatement集合存储在configuration中, 接下来从源码角度分析, MappedStatement是如何加载到configuration中的,

源码流程

在test类中想调用mapper层需要什么步骤_开发语言_02


进入springboot的自动装配类, 会构建SqlSessionFactoryBean对象, 其中就有一个configuration对象,

在138行被构建

在test类中想调用mapper层需要什么步骤_mybatis_03


扫描指定路径下的所有xml文件

进入getObject()方法


633行 : 方法中解析了所有的xml文件, 最后构建出MappedStatement对象集合

在test类中想调用mapper层需要什么步骤_数据库_04


在test类中想调用mapper层需要什么步骤_开发语言_05


在test类中想调用mapper层需要什么步骤_xml文件_06


在test类中想调用mapper层需要什么步骤_xml文件_07


在test类中想调用mapper层需要什么步骤_数据库_08


加入到configuration中

其中大部分的代码逻辑都是对xml文件进行解析, 感兴趣的可以自己分析一下