关于XML和Java文件间的数据流转
Closed this issue · 1 comments
sfq121 commented
您好,请问CodeFuse-Query支持Java-xml间的数据流转吗?如果采用mybaties框架,CodeFuse-Query框架支撑Java字符串 user 到对应的xml中 #{user}的映射吗?
ValKmjolnir commented
CodeFuse-Query 支持多语言之间互相联查,在抽取的时候你需要对抽取的项目使用-lang java xml来进行抽取。
假设我们有一个 mybatis 生成的 resultMap 如下:
<resultMap id="BaseDO" type="com.xx.dao.ExampleDO">
<!--
This element is automatically generated by MyBatis Generator, do not modify.
-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="identifier" jdbcType="VARCHAR" property="identifier" />
</resultMap>则我们可以用如下代码实现一个getDOClassFromResultMap,从而将 xml 中的 DOClass 信息与 java 中抽取的 Class 信息对应起来,以方便接下来的查询:
// script
use coref::java::*
use coref::xml::*
fn default_xml_db() -> XmlDB { return XmlDB::load("coref_xml_src.db") }
fn default_java_db() -> JavaDB { return JavaDB::load("coref_java_src.db") }
schema DBElement extends XmlElement {}
impl DBElement {
// find XmlElement with name "resultMap"
pub fn __all__(db: XmlDB) -> *Self {
for (x in XmlElement(db)) {
if (x.getElementName() = "resultMap") {
yield DBElement { ..x }
}
}
}
// get attribute "type" from XmlElement "resultMap"
pub fn getType(self) -> string {
for (a in self.getAttribute()) {
if (a.getName() = "type") {
return a.getValue()
}
}
}
}
// if DBElement's type name equals to Java Class name, then collect this Class info
fn getDOClassFromResultMap() -> *Class {
for (c in Class(default_java_db()), e in DBElement(default_xml_db())) {
if (c.getQualifiedName() = e.getType()) {
yield c
}
}
}
// example query, just get the class name, you could do other queries
query do_class
from c in getDOClassFromResultMap()
select c.getQualifiedName() as do_class_name问题中所提到的查询也可以以此为基础通过类似的方法解决。