中易网

如何解析Mybatis xml文件中配置的sql

答案:1  悬赏:30  
解决时间 2021-02-10 13:58
如何解析Mybatis xml文件中配置的sql
最佳答案
首先抽象一个SQL语句类:

[java] view plain copy
public abstract class AbstractSQLStatementNode implements ISQLStatement {

protected List sqlStatements = new ArrayList<>();

@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

SELECT * FROM XT_ORG WHERe BDELETe<>1 AND NAME=#{name} LIMIT #{OFFSET}, #{ROWS}


根据是否传入了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
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
1978年4月29日生的是什么星座
本初传播设计经营部在哪里啊,我有事要去这个
小鱼鲜排档这个地址在什么地方,我要处理点事
问一下哈飞小霸王车,提速没有尽,五档车轰隆
爱尚折扣内购会的流程是什么样的?
长春南路西二巷/长沙路(路口)在哪里啊,我有
铝塑门窗地址在哪,我要去那里办事
有范吗什么意思
家里到底装多少插座才合理
德州经济开发区以后的房价走势
如何做君子
巴蜀骨王麻辣烫环科园店这个地址在什么地方,
石家庄金融类资格证考试在哪,想问基金从业资
DNF地龙之魂宝珠怎么得 地龙之魂宝珠怎么样
根志堂骨病健康中心地址有知道的么?有点事想
推荐资讯
对一个女生来说亲脸和亲嘴是很大区别吗
PowerVR GX6250和T880 MP4对比哪个强,高通
充电慢有可能是主板坏了吗
四隆花园酒店我想知道这个在什么地方
富临宝城地址在什么地方,想过去办事
三维和四维有什么区别?
华海盛世怎么去啊,有知道地址的么
鸿峰公寓我想知道这个在什么地方
今年16岁,我因为手臂弯了,做完手臂矫正手术
广平镇卫生院牙科地址有知道的么?有点事想过
佳能MF3110一体机为什么红灯老是闪?查了没有
美颜阁化妆地址在哪,我要去那里办事
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?