引言
在Java Server理解与实践 ——Spring集成Mybatis中,笔者简要地介绍了Mybatis框架。
Mybatis框架极大地简化了ORM,让使用者自定义sql语句,再将查询结果映射到Java类中,其中很关键的一部分就是,将用户写的sql语句(以xml或者注解形式)解析成数据库可执行的sql语句。
本文将会介绍这整个的解析过程。
Sql解析架构
本文将以一下的注解定义为例,剖析整个解析过程。
@Select({
"<script>",
"SELECT account",
"FROM user",
"WHERE id IN",
"<foreach item='item' index='index' collection='list'",
"open='(' separator=',' close=')'>",
"#{item}",
"</foreach>",
"</script>"})
List<String> selectAccountsByIds(@Param("list") int[] ids);
Sql解析其实分成了两部分,第一部分是将注解/xml中定义的sql语句转化成内存中的MappedStatement,也就是将script部分转化成内存中的MappedStatement,这部分发生在Mybatis初始化的时候,第二部分则是根据MappedStatement以及传入的参数,生成可以直接执行的sql语句,这部分发生在mapper函数被调用的时候。
从注解/xml 定义到MappedStatement
首先,我们要明白什么是MappedStatement,先来看看MappedStatment的类定义。
public final class MappedStatement {
private String resource; //来源,一般为文件名或者是注解的类名
private Configuration configuration; //Mybatis的全局唯一Configuration
private String id; //标志符,可以用于缓存
private Integer fetchSize; //每次需要查询的行数(可选)
private Integer timeout;