这里是用mybatis-spring的SqlSessionFactoryBean当作的入口
1.解析spring的配置
不过很多参数都是spring中来处理了,所以mybatis-spring没有先parse而是先加载了配置文件
依次是
typeAliasesPackage
typeAliases
Plugins
typeHandlersPackage
typeHandlers
typeAliases
相当于加载了上面的typeAliases,plugins,typeHandlers
然后typeAliases put到TYPE_ALIASES供查询时调用类型转换
Plugins
拦截器也private final List
这里用的ArrayList所以是自顶向下按照顺序执行的
typeHandlers
Typehandler 也是put到private final Map<>??>, Map
HashMap<>??>, Map
首先抽象一个sql语句类:
[java] view plain copy
public abstract class abstractsqlstatementnode implements isqlstatement {
protected list
@override
public void appendsql(isqlstatement sql) {
sqlstatements.add(sql);
}
@override
public string getsql(object object) {
stringbuilder sb = new stringbuilder();
for (isqlstatement stmt : sqlstatements) {
sb.append(stmt.getsql(object));
}
return sb.tostring().trim();
}
}
然后是文本sql:
[java] view plain copy
public class plainsqlnode extends abstractsqlstatementnode {
private final string sql;
public plainsqlnode(string sql) {
this.sql = sql;
}
@override
public string getsql(object object) {
return sql;
}
@override
public string tostring() {
return sql;
}
}
以mybatis xml中
[java] view plain copy
public class ifsqlnode extends abstractsqlstatementnode {
private final string test;
public ifsqlnode(string test) {
this.test = test;
}
public string gettest() {
return test;
}
@override
public string getsql(object object) {
try {
boolean b = (boolean) ognl.getvalue(test, object, boolean.type);
return b ? super.getsql(object) : "";
}
catch (ognlexception e) {
throw new sqlsyntaxexception(e);
}
}
}
再增加一个include标签例
[java] view plain copy
public class includesqlnode extends abstractsqlstatementnode {
private final tablenode node;
private final string refid;
public includesqlnode(tablenode node, string refid) {
this.node = node;
this.refid = refid;
}
@override
public string getsql(object object) {
sqlnode sqlnode = node.getsqlnode(refid);
return sqlnode.getsql(object);
}
}
其它的xml标签类似,完成最终的sql
调用abstractsqlstatementnode.getsql方法,参数为客户端传入参数
xml例子如下:
[html] view plain copy
根据是否传入了name,即可成功执行出最终的sql
select * from xt_org where bdelete<>1 and name=#{name} limit #{offset}, #{rows}
再解析sql得到,并提出参数
select * from xt_org where bdelete<>1 and name=? limit ?,?
即可生成最终的preparestatement
一只被吓到的猫