三、主要类源码分析
1、SqlMapConfigParser
解析XML文件之前,先生成了SqlMapConfigParser对象的实例。SqlMapConfigParser configParser = new SqlMapConfigParser();
查看该对象的构造方法,其中的主要操作:
a、生成了SqlMapExecutorDelegate对象的实例,该对象从名字可以看出是个代理类,以后ibatis对事务和增删改查的操作,都要通过此类进行 处理。
b、registerDefaultTypeAliases(),该方法是通过Alias别名的方式,定义了一些以后用到的对象。
c、addSqlMapConfigNodelets()。sqlmapconfig根节点。sqlMapConfig标签。
addSettingsNodelets()。sqlmapconfig二级节点,settings标签。可以设置session、request大小等参数。
addTransactionManagerNodelets()。sqlmapconfig二级节点,transactionManager标签。设置事务。
addSqlMapNodelets()。sqlmapconfig二级节点,sqlMap标签。通过resource或者url属性设置sqlmap文件路径。
这些方法的目的是将ibatis配置文件中所有可能出现的配置路径保存到NodeletParser中的letMap实例对象里。当NodeletParser递归解析到这层节点时,path路径与letMap中的key匹配,就调用add方法中的匿名内部类的process()方法处理该节点。2、NodeletParser
a、createDocument(Readerreader)。该方法采用JAXP的DOM接口解析XML,将整个XML文件读取到内存中,并且以树形结构保存。
b、process(Nodenode, Pathpath)。逐层对Ducument对象进行解析,每解析一层就在path中增加一层路径。
c、processNodelet(Nodenode, StringpathString)。通过pathString获取当前解析的路径,判断该路径是否在letmap中。如果在说明该节点为XML规定节点,需要对该节点进行继续操作。操作时调用addXXXXXNodeletes()方法中的process()方法处理。
3、SqlMapParser
a、当解析到的节点path路径为/sqlMapConfig/sqlMap时,说明该节点为ibatis的sqlmap文件。此时需要调用SqlMapParser类对该节点继续解析。
b、addSqlMapNodelets()。sqlmap文件根节点。
addSqlNodelets()。sqlmap文件二级节点,sql标签。
addTypeAliasNodelets()。sqlmap文件二级节点,typeAlias标签。
addCacheModelNodelets()。sqlmap文件二级节点,cacheModel标签。用来解析缓存。
addParameterMapNodelets()。sqlmap文件二级节点,parameterMap标签。用来设置入参,一般调用存储过程时会使用。该对象最终会保存在SqlMapExecutorDelegate类的parameterMaps对象中,key为id,value为对象。
addResultMapNodelets()。sqlmap 文件二级节点,resultMap标签。设置sql返回的结果集。该对象最终会保存在SqlMapExecutorDelegate类的resultMaps对象中,key为id,value为对象。
addStatementNodelets()。sqlmap文件二级节点,insert、update、delete、select标签。
c、通过NodeletParser类进行处理。
4、SqlStatementParser
a、parseGeneralStatement(Node node, GeneralStatement statement)。负责具体解析insert、update、delete、select标签。将当前状态标签的入参解析后保存到statement对象的ParameterMap或ParameterClass中,取决于入参是以类的形式还是以map形式传入。将当前状态标签的返回结果解析后保存到ResultMap中。
b、processSqlStatement(Node n, GeneralStatement statement)。负责解析状态标签中的sql语句,并且保存到statement对象的sql属性中。