mybatis支持定制化sql和储存过程和高级映射的持久层框架。它简化了程序员的操作,避免了几乎所有的JDBC代码以及手动设置参数和获取结果集。下面就开启Mybatis动态sql解析之旅。
在上一篇mybatis hello world文章中,我们可以看到mybatis把动态sql与jdbc以及框架配置分别了出来。分别为配置文件BlogMapper.xml与mybatis-config.xml。mybatis的所有功能都是围绕着这两个配置文件来的。今天我们就来探究一下mybatis中是如何保存BlogMapper.xml并动态把它解析成执行数据库操作的sql的。
1、MappedStatement
MappedStatement类在Mybatis框架中用于表示XML文件中一个sql语句节点,即一个<select />、<update />或者<insert />等标签。mybatis框架会在初始化的时候读取这个配置文件。将其中的sql语句节点解析成一个个的MappedStatement对象。
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="org.mybatis.example.BlogMapper"><selectid="selectBlog"resultType="org.mybatis.example.Blog">
select * from Blog where id = #{id}
</select></mapper>123456789
mybatis对上面这个文件进行解析之后,会注册一个MappedStatement就是id为selectBlog这个xml片段。可以通过Configuration中的getMappedStatement(String id)来获取。为了避免id重复,mybatis以namespace为前缀,然后加上节点本身的id值。如果要想在Configuration中获取到这个MappedStatement就需要id是org.mybatis.example.BlogMapper.selectBlog。
打开MappedStatement对象的源码,看一下其中的私有属性。
private String resource;
private Configuration configuration;
private String id;
private Integer fetchSize;
private Integer timeout;
private StatementType statementType;
private ResultSetType resultSetType;
private SqlSource sqlSo