目录
- 简介
- 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;
}
MappedStatement是如何被加载的?
MappedStatement集合存储在configuration中, 接下来从源码角度分析, MappedStatement是如何加载到configuration中的,
源码流程
进入springboot的自动装配类, 会构建SqlSessionFactoryBean对象, 其中就有一个configuration对象,
在138行被构建
扫描指定路径下的所有xml文件
进入getObject()方法
633行 : 方法中解析了所有的xml文件, 最后构建出MappedStatement对象集合
加入到configuration中
其中大部分的代码逻辑都是对xml文件进行解析, 感兴趣的可以自己分析一下