Here are the examples of the java api org.apache.ibatis.parsing.XNode taken from open source projects. By voting up you can indicate which examples are most useful and appropriate.
72 Examples
19
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* <insert keyProperty="id" parameterType="Person" useGeneratedKeys="true" id="insert">
* INSERT INTO person (name, age, phone, email, address)
* VALUES(#{name},#{age},#{phone},#{email},#{address})
* </insert>
*
* <select resultMap="base" id="list">
* <include refid="Base_List"/>
* <if test="iid != null">
* and id = #{iid,jdbcType=INTEGER}
* </if>
* </select>
*
* @param list
* @param requiredDatabaseId
*/
private void buildStatementFromContext(List<XNode> list, String requiredDatabaseId) {
for (XNode context : list) {
// 动态 sql 解析
final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderreplacedistant, context, requiredDatabaseId);
try {
// 解析
statementParser.parseStatementNode();
} catch (IncompleteElementException e) {
configuration.addIncompleteStatement(statementParser);
}
}
}
19
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private String processNestedResultMappings(XNode context, List<ResultMapping> resultMappings, Clreplaced<?> enclosingType) throws Exception {
if ("replacedociation".equals(context.getName()) || "collection".equals(context.getName()) || "case".equals(context.getName())) {
if (context.getStringAttribute("select") == null) {
validateCollection(context, enclosingType);
ResultMap resultMap = resultMapElement(context, resultMappings, enclosingType);
return resultMap.getId();
}
}
return null;
}
19
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 resultMap 标签
*
* @param list
* @throws Exception
*/
private void resultMapElements(List<XNode> list) throws Exception {
for (XNode resultMapNode : list) {
try {
resultMapElement(resultMapNode);
} catch (IncompleteElementException e) {
// ignore, it will be retried
}
}
}
19
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private ResultMap resultMapElement(XNode resultMapNode) throws Exception {
return resultMapElement(resultMapNode, Collections.emptyList(), null);
}
19
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private boolean databaseIdMatchesCurrent(String id, String databaseId, String requiredDatabaseId) {
if (requiredDatabaseId != null) {
return requiredDatabaseId.equals(databaseId);
}
if (databaseId != null) {
return false;
}
if (!this.sqlFragments.containsKey(id)) {
return true;
}
// skip this fragment if there is a previous one with a not null databaseId
XNode context = this.sqlFragments.get(id);
return context.getStringAttribute("databaseId") == null;
}
18
Source : MybatisJpaXMLScriptBuilder.java
with Apache License 2.0
from zhouxx
with Apache License 2.0
from zhouxx
/**
* @author Clinton Begin
* @author Zhou Xiaoxiang
*/
public clreplaced MybatisJpaXMLScriptBuilder extends BaseBuilder {
private final XNode context;
private boolean isDynamic;
private final Clreplaced<?> parameterType;
private final Map<String, MybatisJpaXMLScriptBuilder.NodeHandler> nodeHandlerMap = new HashMap<String, MybatisJpaXMLScriptBuilder.NodeHandler>();
public MybatisJpaXMLScriptBuilder(Configuration configuration, XNode context) {
this(configuration, context, null);
}
public MybatisJpaXMLScriptBuilder(Configuration configuration, XNode context, Clreplaced<?> parameterType) {
super(configuration);
this.context = context;
this.parameterType = parameterType;
initNodeHandlerMap();
}
private void initNodeHandlerMap() {
nodeHandlerMap.put("trim", new MybatisJpaXMLScriptBuilder.TrimHandler());
nodeHandlerMap.put("where", new MybatisJpaXMLScriptBuilder.WhereHandler());
nodeHandlerMap.put("set", new MybatisJpaXMLScriptBuilder.SetHandler());
nodeHandlerMap.put("foreach", new MybatisJpaXMLScriptBuilder.ForEachHandler());
nodeHandlerMap.put("if", new MybatisJpaXMLScriptBuilder.IfHandler());
nodeHandlerMap.put("choose", new MybatisJpaXMLScriptBuilder.ChooseHandler());
nodeHandlerMap.put("when", new MybatisJpaXMLScriptBuilder.IfHandler());
nodeHandlerMap.put("otherwise", new MybatisJpaXMLScriptBuilder.OtherwiseHandler());
nodeHandlerMap.put("bind", new MybatisJpaXMLScriptBuilder.BindHandler());
}
public SqlSource parseScriptNode() {
MixedSqlNode rootSqlNode = parseDynamicTags(context);
SqlSource sqlSource = null;
// 这里跟原来的不一样
if (isDynamic) {
sqlSource = new MybatisJpaDynamicSqlSource(configuration, rootSqlNode, parameterType);
} else {
sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
}
return sqlSource;
}
protected MixedSqlNode parseDynamicTags(XNode node) {
List<SqlNode> contents = new ArrayList<SqlNode>();
NodeList children = node.getNode().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
XNode child = node.newXNode(children.item(i));
if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
String data = child.getStringBody("");
TextSqlNode textSqlNode = new TextSqlNode(data);
if (textSqlNode.isDynamic()) {
contents.add(textSqlNode);
isDynamic = true;
} else {
contents.add(new StaticTextSqlNode(data));
}
} else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
// issue #628
String nodeName = child.getNode().getNodeName();
MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler == null) {
throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
}
handler.handleNode(child, contents);
isDynamic = true;
}
}
return new MixedSqlNode(contents);
}
private interface NodeHandler {
void handleNode(XNode nodeToHandle, List<SqlNode> targetContents);
}
private clreplaced BindHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public BindHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
final String name = nodeToHandle.getStringAttribute("name");
final String expression = nodeToHandle.getStringAttribute("value");
final VarDeclSqlNode node = new VarDeclSqlNode(name, expression);
targetContents.add(node);
}
}
private clreplaced TrimHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public TrimHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String prefix = nodeToHandle.getStringAttribute("prefix");
String prefixOverrides = nodeToHandle.getStringAttribute("prefixOverrides");
String suffix = nodeToHandle.getStringAttribute("suffix");
String suffixOverrides = nodeToHandle.getStringAttribute("suffixOverrides");
TrimSqlNode trim = new TrimSqlNode(configuration, mixedSqlNode, prefix, prefixOverrides, suffix, suffixOverrides);
targetContents.add(trim);
}
}
private clreplaced WhereHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public WhereHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
WhereSqlNode where = new WhereSqlNode(configuration, mixedSqlNode);
targetContents.add(where);
}
}
private clreplaced SetHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public SetHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
SetSqlNode set = new SetSqlNode(configuration, mixedSqlNode);
targetContents.add(set);
}
}
private clreplaced ForEachHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public ForEachHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String collection = nodeToHandle.getStringAttribute("collection");
String item = nodeToHandle.getStringAttribute("item");
String index = nodeToHandle.getStringAttribute("index");
String open = nodeToHandle.getStringAttribute("open");
String close = nodeToHandle.getStringAttribute("close");
String separator = nodeToHandle.getStringAttribute("separator");
ForEachSqlNode forEachSqlNode = new ForEachSqlNode(configuration, mixedSqlNode, collection, index, item, open, close, separator);
targetContents.add(forEachSqlNode);
}
}
private clreplaced IfHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public IfHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String test = nodeToHandle.getStringAttribute("test");
IfSqlNode ifSqlNode = new IfSqlNode(mixedSqlNode, test);
targetContents.add(ifSqlNode);
}
}
private clreplaced OtherwiseHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public OtherwiseHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
targetContents.add(mixedSqlNode);
}
}
private clreplaced ChooseHandler implements MybatisJpaXMLScriptBuilder.NodeHandler {
public ChooseHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
List<SqlNode> whenSqlNodes = new ArrayList<SqlNode>();
List<SqlNode> otherwiseSqlNodes = new ArrayList<SqlNode>();
handleWhenOtherwiseNodes(nodeToHandle, whenSqlNodes, otherwiseSqlNodes);
SqlNode defaultSqlNode = getDefaultSqlNode(otherwiseSqlNodes);
ChooseSqlNode chooseSqlNode = new ChooseSqlNode(whenSqlNodes, defaultSqlNode);
targetContents.add(chooseSqlNode);
}
private void handleWhenOtherwiseNodes(XNode chooseSqlNode, List<SqlNode> ifSqlNodes, List<SqlNode> defaultSqlNodes) {
List<XNode> children = chooseSqlNode.getChildren();
for (XNode child : children) {
String nodeName = child.getNode().getNodeName();
MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler instanceof MybatisJpaXMLScriptBuilder.IfHandler) {
handler.handleNode(child, ifSqlNodes);
} else if (handler instanceof MybatisJpaXMLScriptBuilder.OtherwiseHandler) {
handler.handleNode(child, defaultSqlNodes);
}
}
}
private SqlNode getDefaultSqlNode(List<SqlNode> defaultSqlNodes) {
SqlNode defaultSqlNode = null;
if (defaultSqlNodes.size() == 1) {
defaultSqlNode = defaultSqlNodes.get(0);
} else if (defaultSqlNodes.size() > 1) {
throw new BuilderException("Too many default (otherwise) elements in choose statement.");
}
return defaultSqlNode;
}
}
}
18
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
private void clearMapperdMap(List<XNode> list, String namespace) {
for (XNode parameterMapNode : list) {
String id = parameterMapNode.getStringAttribute("id");
configuration.getMappedStatementNames().remove(namespace + "." + id);
}
}
18
Source : XMLScriptBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* @author Clinton Begin
*/
public clreplaced XMLScriptBuilder extends BaseBuilder {
private final XNode context;
private final Clreplaced<?> parameterType;
private final Map<String, NodeHandler> nodeHandlerMap = new HashMap<>();
private boolean isDynamic;
public XMLScriptBuilder(Configuration configuration, XNode context) {
this(configuration, context, null);
}
/**
* xml 脚本 构建
*
* @param configuration
* @param context
* @param parameterType
*/
public XMLScriptBuilder(Configuration configuration, XNode context, Clreplaced<?> parameterType) {
super(configuration);
this.context = context;
this.parameterType = parameterType;
initNodeHandlerMap();
}
/**
* 动态sql 标签
*/
private void initNodeHandlerMap() {
nodeHandlerMap.put("trim", new TrimHandler());
nodeHandlerMap.put("where", new WhereHandler());
nodeHandlerMap.put("set", new SetHandler());
nodeHandlerMap.put("foreach", new ForEachHandler());
nodeHandlerMap.put("if", new IfHandler());
nodeHandlerMap.put("choose", new ChooseHandler());
nodeHandlerMap.put("when", new IfHandler());
nodeHandlerMap.put("otherwise", new OtherwiseHandler());
nodeHandlerMap.put("bind", new BindHandler());
}
/**
* 格式化 标签数据
* @return
*/
public SqlSource parseScriptNode() {
// <select resultMap="BaseResultMap" parameterType="java.lang.Integer" id="selectByPrimaryKey">
//
// select
// </select>
// select * from hs_sell
MixedSqlNode rootSqlNode = parseDynamicTags(context);
SqlSource sqlSource;
if (isDynamic) {
// 动态sql
sqlSource = new DynamicSqlSource(configuration, rootSqlNode);
} else {
// 静态sql
sqlSource = new RawSqlSource(configuration, rootSqlNode, parameterType);
}
return sqlSource;
}
/**
* <b>动态sql 的核心方法!!!</b>
* <trim suffixOverrides="," prefix="(" suffix=")">
* <if test="userId != null">
* USER_ID,
* </if>
* <if test="goodId != null">
* GOOD_ID,
* </if>
* <if test="price != null">
* PRICE,
* </if>
* <if test="size != null">
* `SIZE`,
* </if>
* <if test="companyId != null">
* COMPANY_ID,
* </if>
* <if test="groupId != null">
* GROUP_ID,
* </if>
* <if test="version != null">
* VERSION,
* </if>
* <if test="deleted != null">
* DELETED,
* </if>
* <if test="createUser != null">
* CREATE_USER,
* </if>
* <if test="createTime != null">
* CREATE_TIME,
* </if>
* <if test="updateUser != null">
* UPDATE_USER,
* </if>
* <if test="updateTime != null">
* UPDATE_TIME,
* </if>
* <if test="workOrderId != null">
* WORK_ORDER_ID,
* </if>
* </trim>
* @param node
* @return
*/
protected MixedSqlNode parseDynamicTags(XNode node) {
List<SqlNode> contents = new ArrayList<>();
NodeList children = node.getNode().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
XNode child = node.newXNode(children.item(i));
if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
// 如果不包含其他标签或者是纯文本节点
// data 是替换后sql文本
String data = child.getStringBody("");
TextSqlNode textSqlNode = new TextSqlNode(data);
if (textSqlNode.isDynamic()) {
contents.add(textSqlNode);
isDynamic = true;
} else {
// 直接添加
contents.add(new StaticTextSqlNode(data));
}
} else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
// issue #628
// 动态标签处理逻辑
String nodeName = child.getNode().getNodeName();
// if 等标签
NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler == null) {
throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
}
/**
* 动态标签处理 {@link TrimHandler}
*/
handler.handleNode(child, contents);
isDynamic = true;
}
}
return new MixedSqlNode(contents);
}
private interface NodeHandler {
void handleNode(XNode nodeToHandle, List<SqlNode> targetContents);
}
private clreplaced BindHandler implements NodeHandler {
public BindHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
final String name = nodeToHandle.getStringAttribute("name");
final String expression = nodeToHandle.getStringAttribute("value");
final VarDeclSqlNode node = new VarDeclSqlNode(name, expression);
targetContents.add(node);
}
}
/**
* trim 标签解析
*/
private clreplaced TrimHandler implements NodeHandler {
public TrimHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String prefix = nodeToHandle.getStringAttribute("prefix");
String prefixOverrides = nodeToHandle.getStringAttribute("prefixOverrides");
String suffix = nodeToHandle.getStringAttribute("suffix");
String suffixOverrides = nodeToHandle.getStringAttribute("suffixOverrides");
TrimSqlNode trim = new TrimSqlNode(configuration, mixedSqlNode, prefix, prefixOverrides, suffix, suffixOverrides);
targetContents.add(trim);
}
}
private clreplaced WhereHandler implements NodeHandler {
public WhereHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
WhereSqlNode where = new WhereSqlNode(configuration, mixedSqlNode);
targetContents.add(where);
}
}
private clreplaced SetHandler implements NodeHandler {
public SetHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
SetSqlNode set = new SetSqlNode(configuration, mixedSqlNode);
targetContents.add(set);
}
}
private clreplaced ForEachHandler implements NodeHandler {
public ForEachHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String collection = nodeToHandle.getStringAttribute("collection");
String item = nodeToHandle.getStringAttribute("item");
String index = nodeToHandle.getStringAttribute("index");
String open = nodeToHandle.getStringAttribute("open");
String close = nodeToHandle.getStringAttribute("close");
String separator = nodeToHandle.getStringAttribute("separator");
ForEachSqlNode forEachSqlNode = new ForEachSqlNode(configuration, mixedSqlNode, collection, index, item, open, close, separator);
targetContents.add(forEachSqlNode);
}
}
private clreplaced IfHandler implements NodeHandler {
public IfHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
String test = nodeToHandle.getStringAttribute("test");
IfSqlNode ifSqlNode = new IfSqlNode(mixedSqlNode, test);
targetContents.add(ifSqlNode);
}
}
private clreplaced OtherwiseHandler implements NodeHandler {
public OtherwiseHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
MixedSqlNode mixedSqlNode = parseDynamicTags(nodeToHandle);
targetContents.add(mixedSqlNode);
}
}
private clreplaced ChooseHandler implements NodeHandler {
public ChooseHandler() {
// Prevent Synthetic Access
}
@Override
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
List<SqlNode> whenSqlNodes = new ArrayList<>();
List<SqlNode> otherwiseSqlNodes = new ArrayList<>();
handleWhenOtherwiseNodes(nodeToHandle, whenSqlNodes, otherwiseSqlNodes);
SqlNode defaultSqlNode = getDefaultSqlNode(otherwiseSqlNodes);
ChooseSqlNode chooseSqlNode = new ChooseSqlNode(whenSqlNodes, defaultSqlNode);
targetContents.add(chooseSqlNode);
}
private void handleWhenOtherwiseNodes(XNode chooseSqlNode, List<SqlNode> ifSqlNodes, List<SqlNode> defaultSqlNodes) {
List<XNode> children = chooseSqlNode.getChildren();
for (XNode child : children) {
String nodeName = child.getNode().getNodeName();
NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler instanceof IfHandler) {
handler.handleNode(child, ifSqlNodes);
} else if (handler instanceof OtherwiseHandler) {
handler.handleNode(child, defaultSqlNodes);
}
}
}
private SqlNode getDefaultSqlNode(List<SqlNode> defaultSqlNodes) {
SqlNode defaultSqlNode = null;
if (defaultSqlNodes.size() == 1) {
defaultSqlNode = defaultSqlNodes.get(0);
} else if (defaultSqlNodes.size() > 1) {
throw new BuilderException("Too many default (otherwise) elements in choose statement.");
}
return defaultSqlNode;
}
}
}
18
Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* @author Clinton Begin
*/
public clreplaced XMLStatementBuilder extends BaseBuilder {
private final MapperBuilderreplacedistant builderreplacedistant;
private final XNode context;
private final String requiredDatabaseId;
public XMLStatementBuilder(Configuration configuration, MapperBuilderreplacedistant builderreplacedistant, XNode context) {
this(configuration, builderreplacedistant, context, null);
}
/**
* @param configuration 解析到的 configuration
* @param builderreplacedistant
* @param context 当前的 select|insert|update|delete
* @param databaseId
*/
public XMLStatementBuilder(Configuration configuration, MapperBuilderreplacedistant builderreplacedistant, XNode context, String databaseId) {
super(configuration);
this.builderreplacedistant = builderreplacedistant;
this.context = context;
this.requiredDatabaseId = databaseId;
}
/**
* context => <insert keyProperty="id" parameterType="Person" useGeneratedKeys="true" id="insert">
* INSERT INTO person (name, age, phone, email, address)
* VALUES(#{name},#{age},#{phone},#{email},#{address})
* </insert>
*/
public void parseStatementNode() {
// 获取id属性
String id = context.getStringAttribute("id");
String databaseId = context.getStringAttribute("databaseId");
if (!databaseIdMatchesCurrent(id, databaseId, this.requiredDatabaseId)) {
return;
}
// 获取当前 <select insert delete update > 名称
String nodeName = context.getNode().getNodeName();
// 判断sql语句的类型
SqlCommandType sqlCommandType = SqlCommandType.valueOf(nodeName.toUpperCase(Locale.ENGLISH));
boolean isSelect = sqlCommandType == SqlCommandType.SELECT;
boolean flushCache = context.getBooleanAttribute("flushCache", !isSelect);
boolean useCache = context.getBooleanAttribute("useCache", isSelect);
boolean resultOrdered = context.getBooleanAttribute("resultOrdered", false);
// Include Fragments before parsing
// <include > 解析
// TODO: 2019/12/17 include 标签
XMLIncludeTransformer includeParser = new XMLIncludeTransformer(configuration, builderreplacedistant);
includeParser.applyIncludes(context.getNode());
// <select resultMap="base" id="list">
// <if test="iid != null">
// and id = #{iid,jdbcType=INTEGER}
// </if>
// </select>
// 请求类型
String parameterType = context.getStringAttribute("parameterType");
// 别名中心注册获取
Clreplaced<?> parameterTypeClreplaced = resolveClreplaced(parameterType);
String lang = context.getStringAttribute("lang");
LanguageDriver langDriver = getLanguageDriver(lang);
// Parse selectKey after includes and remove them.
processSelectKeyNodes(id, parameterTypeClreplaced, langDriver);
// Parse the SQL (pre: <selectKey> and <include> were parsed and removed)
KeyGenerator keyGenerator;
// 生成一个id
String keyStatementId = id + SelectKeyGenerator.SELECT_KEY_SUFFIX;
keyStatementId = builderreplacedistant.applyCurrentNamespace(keyStatementId, true);
if (configuration.hasKeyGenerator(keyStatementId)) {
keyGenerator = configuration.getKeyGenerator(keyStatementId);
} else {
keyGenerator = context.getBooleanAttribute("useGeneratedKeys", configuration.isUseGeneratedKeys() && SqlCommandType.INSERT.equals(sqlCommandType)) ? Jdbc3KeyGenerator.INSTANCE : NoKeyGenerator.INSTANCE;
}
// 语言驱动: org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
// 创建sql源
SqlSource sqlSource = langDriver.createSqlSource(configuration, context, parameterTypeClreplaced);
StatementType statementType = StatementType.valueOf(context.getStringAttribute("statementType", StatementType.PREPARED.toString()));
// 标签获取
Integer fetchSize = context.getIntAttribute("fetchSize");
Integer timeout = context.getIntAttribute("timeout");
String parameterMap = context.getStringAttribute("parameterMap");
String resultType = context.getStringAttribute("resultType");
Clreplaced<?> resultTypeClreplaced = resolveClreplaced(resultType);
String resultMap = context.getStringAttribute("resultMap");
String resultSetType = context.getStringAttribute("resultSetType");
ResultSetType resultSetTypeEnum = resolveResultSetType(resultSetType);
if (resultSetTypeEnum == null) {
resultSetTypeEnum = configuration.getDefaultResultSetType();
}
String keyProperty = context.getStringAttribute("keyProperty");
String keyColumn = context.getStringAttribute("keyColumn");
String resultSets = context.getStringAttribute("resultSets");
builderreplacedistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClreplaced, resultMap, resultTypeClreplaced, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, resultSets);
}
/**
* @param id crud 标签id
* @param parameterTypeClreplaced 请求参数类型
* @param langDriver 语言驱动
*/
private void processSelectKeyNodes(String id, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver) {
List<XNode> selectKeyNodes = context.evalNodes("selectKey");
if (configuration.getDatabaseId() != null) {
parseSelectKeyNodes(id, selectKeyNodes, parameterTypeClreplaced, langDriver, configuration.getDatabaseId());
}
parseSelectKeyNodes(id, selectKeyNodes, parameterTypeClreplaced, langDriver, null);
removeSelectKeyNodes(selectKeyNodes);
}
/**
* @param parentId crud 标签ID
* @param list 子集
* @param parameterTypeClreplaced 参数类型
* @param langDriver
* @param skRequiredDatabaseId
*/
private void parseSelectKeyNodes(String parentId, List<XNode> list, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String skRequiredDatabaseId) {
for (XNode nodeToHandle : list) {
String id = parentId + SelectKeyGenerator.SELECT_KEY_SUFFIX;
String databaseId = nodeToHandle.getStringAttribute("databaseId");
if (databaseIdMatchesCurrent(id, databaseId, skRequiredDatabaseId)) {
parseSelectKeyNode(id, nodeToHandle, parameterTypeClreplaced, langDriver, databaseId);
}
}
}
/**
* @param id
* @param nodeToHandle
* @param parameterTypeClreplaced
* @param langDriver
* @param databaseId
*/
private void parseSelectKeyNode(String id, XNode nodeToHandle, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String databaseId) {
String resultType = nodeToHandle.getStringAttribute("resultType");
Clreplaced<?> resultTypeClreplaced = resolveClreplaced(resultType);
StatementType statementType = StatementType.valueOf(nodeToHandle.getStringAttribute("statementType", StatementType.PREPARED.toString()));
String keyProperty = nodeToHandle.getStringAttribute("keyProperty");
String keyColumn = nodeToHandle.getStringAttribute("keyColumn");
boolean executeBefore = "BEFORE".equals(nodeToHandle.getStringAttribute("order", "AFTER"));
// defaults
boolean useCache = false;
boolean resultOrdered = false;
KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE;
Integer fetchSize = null;
Integer timeout = null;
boolean flushCache = false;
String parameterMap = null;
String resultMap = null;
ResultSetType resultSetTypeEnum = null;
SqlSource sqlSource = langDriver.createSqlSource(configuration, nodeToHandle, parameterTypeClreplaced);
SqlCommandType sqlCommandType = SqlCommandType.SELECT;
builderreplacedistant.addMappedStatement(id, sqlSource, statementType, sqlCommandType, fetchSize, timeout, parameterMap, parameterTypeClreplaced, resultMap, resultTypeClreplaced, resultSetTypeEnum, flushCache, useCache, resultOrdered, keyGenerator, keyProperty, keyColumn, databaseId, langDriver, null);
id = builderreplacedistant.applyCurrentNamespace(id, false);
MappedStatement keyStatement = configuration.getMappedStatement(id, false);
configuration.addKeyGenerator(id, new SelectKeyGenerator(keyStatement, executeBefore));
}
private void removeSelectKeyNodes(List<XNode> selectKeyNodes) {
for (XNode nodeToHandle : selectKeyNodes) {
nodeToHandle.getParent().getNode().removeChild(nodeToHandle.getNode());
}
}
private boolean databaseIdMatchesCurrent(String id, String databaseId, String requiredDatabaseId) {
if (requiredDatabaseId != null) {
return requiredDatabaseId.equals(databaseId);
}
if (databaseId != null) {
return false;
}
id = builderreplacedistant.applyCurrentNamespace(id, false);
if (!this.configuration.hreplacedtatement(id, false)) {
return true;
}
// skip this statement if there is a previous one with a not null databaseId
// issue #2
MappedStatement previous = this.configuration.getMappedStatement(id, false);
return previous.getDatabaseId() == null;
}
/**
* 默认的 {@link LanguageDriver} {@link LanguageDriverRegistry#setDefaultDriverClreplaced(java.lang.Clreplaced)}
*
* @param lang
* @return
*/
private LanguageDriver getLanguageDriver(String lang) {
Clreplaced<? extends LanguageDriver> langClreplaced = null;
if (lang != null) {
langClreplaced = resolveClreplaced(lang);
}
return configuration.getLanguageDriver(langClreplaced);
}
}
18
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 sql 标签
* <sql id="Base_List">
* name,age,phone,email,address
* </sql>
*
* @param list
*/
private void sqlElement(List<XNode> list, String requiredDatabaseId) {
for (XNode context : list) {
String databaseId = context.getStringAttribute("databaseId");
// 获取 id
String id = context.getStringAttribute("id");
id = builderreplacedistant.applyCurrentNamespace(id, false);
if (databaseIdMatchesCurrent(id, databaseId, requiredDatabaseId)) {
sqlFragments.put(id, context);
}
}
}
18
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private void parseConfiguration(XNode root) {
try {
// issue #117 read properties first
propertiesElement(root.evalNode("properties"));
typeAliasesElement(root.evalNode("typeAliases"));
pluginElement(root.evalNode("plugins"));
objectFactoryElement(root.evalNode("objectFactory"));
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
reflectionFactoryElement(root.evalNode("reflectionFactory"));
settingsElement(root.evalNode("settings"));
// read it after objectFactory and objectWrapperFactory issue #631
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
17
Source : MybatisJpaLanguageDriver.java
with Apache License 2.0
from zhouxx
with Apache License 2.0
from zhouxx
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
MybatisJpaXMLScriptBuilder builder = new MybatisJpaXMLScriptBuilder(configuration, script, parameterType);
return builder.parseScriptNode();
}
17
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
/**
* 清理selectKey
*
* @param list
* @param namespace
*/
private void cleanKeyGenerators(List<XNode> list, String namespace) {
for (XNode context : list) {
String id = context.getStringAttribute("id");
configuration.getKeyGeneratorNames().remove(id + SelectKeyGenerator.SELECT_KEY_SUFFIX);
configuration.getKeyGeneratorNames().remove(namespace + "." + id + SelectKeyGenerator.SELECT_KEY_SUFFIX);
}
}
17
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
/**
* 清理parameterMap
*
* @param list
* @param namespace
*/
private void cleanParameterMap(List<XNode> list, String namespace) {
for (XNode parameterMapNode : list) {
String id = parameterMapNode.getStringAttribute("id");
configuration.getParameterMaps().remove(namespace + "." + id);
}
}
17
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
/**
* 清理sql节点缓存
*
* @param list
* @param namespace
*/
private void cleanSqlElement(List<XNode> list, String namespace) {
for (XNode context : list) {
String id = context.getStringAttribute("id");
configuration.getSqlFragments().remove(id);
configuration.getSqlFragments().remove(namespace + "." + id);
}
}
17
Source : VelocityLanguageDriver.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
return new VelocitySqlSource(configuration, script.getStringBody(""));
}
17
Source : XMLLanguageDriver.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 创建{@link SqlSource}
*
* @param configuration The MyBatis configuration
* @param script XNode parsed from a XML file
* @param parameterType input parameter type got from a mapper method or specified in the parameterType xml attribute. Can be null.
* @return
*/
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
XMLScriptBuilder builder = new XMLScriptBuilder(configuration, script, parameterType);
return builder.parseScriptNode();
}
17
Source : RawLanguageDriver.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
@Override
public SqlSource createSqlSource(Configuration configuration, XNode script, Clreplaced<?> parameterType) {
SqlSource source = super.createSqlSource(configuration, script, parameterType);
checkIsNotDynamic(source);
return source;
}
17
Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* @param parentId crud 标签ID
* @param list 子集
* @param parameterTypeClreplaced 参数类型
* @param langDriver
* @param skRequiredDatabaseId
*/
private void parseSelectKeyNodes(String parentId, List<XNode> list, Clreplaced<?> parameterTypeClreplaced, LanguageDriver langDriver, String skRequiredDatabaseId) {
for (XNode nodeToHandle : list) {
String id = parentId + SelectKeyGenerator.SELECT_KEY_SUFFIX;
String databaseId = nodeToHandle.getStringAttribute("databaseId");
if (databaseIdMatchesCurrent(id, databaseId, skRequiredDatabaseId)) {
parseSelectKeyNode(id, nodeToHandle, parameterTypeClreplaced, langDriver, databaseId);
}
}
}
17
Source : XMLStatementBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private void removeSelectKeyNodes(List<XNode> selectKeyNodes) {
for (XNode nodeToHandle : selectKeyNodes) {
nodeToHandle.getParent().getNode().removeChild(nodeToHandle.getNode());
}
}
17
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* <discriminator javaType="">
* <case value=""></case>
* </discriminator>
*
* @param context
* @param resultType
* @param resultMappings
* @return
* @throws Exception
*/
private Discriminator processDiscriminatorElement(XNode context, Clreplaced<?> resultType, List<ResultMapping> resultMappings) throws Exception {
// 简单的数据获取 赋值
String column = context.getStringAttribute("column");
String javaType = context.getStringAttribute("javaType");
String jdbcType = context.getStringAttribute("jdbcType");
String typeHandler = context.getStringAttribute("typeHandler");
Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
Map<String, String> discriminatorMap = new HashMap<>();
for (XNode caseChild : context.getChildren()) {
String value = caseChild.getStringAttribute("value");
String resultMap = caseChild.getStringAttribute("resultMap", processNestedResultMappings(caseChild, resultMappings, resultType));
discriminatorMap.put(value, resultMap);
}
return builderreplacedistant.buildDiscriminator(resultType, column, javaTypeClreplaced, jdbcTypeEnum, typeHandlerClreplaced, discriminatorMap);
}
17
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 <cache-ref namespace=""/> 标签的属性
*
* @param context
*/
private void cacheRefElement(XNode context) {
if (context != null) {
// 向全局配置设置 CacheRef
configuration.addCacheRef(builderreplacedistant.getCurrentNamespace(), context.getStringAttribute("namespace"));
// 构造
CacheRefResolver cacheRefResolver = new CacheRefResolver(builderreplacedistant, context.getStringAttribute("namespace"));
try {
// 解析
Cache cache = cacheRefResolver.resolveCacheRef();
} catch (IncompleteElementException e) {
// 初始化是没有内容走这一步
configuration.addIncompleteCacheRef(cacheRefResolver);
}
}
}
17
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 objectWrapperFactory 标签
* <objectWrapperFactory type="org.apache.ibatis.reflection.wrapper.DefaultObjectWrapperFactory"/>
*
* @param context
* @throws Exception
*/
private void objectWrapperFactoryElement(XNode context) throws Exception {
if (context != null) {
// 获取 objectWrapperFactory 标签 type 的值
String type = context.getStringAttribute("type");
// 别名 mao 中获取
ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
// 在 configuration 设置
configuration.setObjectWrapperFactory(factory);
}
}
17
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private void parseConfiguration(XNode root) {
try {
// issue #117 read properties first
// 加载 properties 标签
propertiesElement(root.evalNode("properties"));
// 加载 setting 标签
Properties settings = settingsAsProperties(root.evalNode("settings"));
// vfs 虚拟文件相关属性
loadCustomVfs(settings);
// 日志实现类
loadCustomLogImpl(settings);
// 加载 typeAliases 标签
typeAliasesElement(root.evalNode("typeAliases"));
// 加载 plugins 标签
pluginElement(root.evalNode("plugins"));
// 加载 objectFactory 标签
objectFactoryElement(root.evalNode("objectFactory"));
// 加载 objectWrapperFactory 标签
objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
// 加载 reflectorFactory 标签
reflectorFactoryElement(root.evalNode("reflectorFactory"));
// 设置 settings 标签的属性值放入 configuration 中
// 不明白为什么放在下面,应该放在 loadCustomLogImpl 方法之后. 可读性会更好
settingsElement(settings);
// read it after objectFactory and objectWrapperFactory issue #631
environmentsElement(root.evalNode("environments"));
databaseIdProviderElement(root.evalNode("databaseIdProvider"));
typeHandlerElement(root.evalNode("typeHandlers"));
mapperElement(root.evalNode("mappers"));
} catch (Exception e) {
throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
}
}
17
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 reflectorFactory 标签
* <reflectorFactory type="org.apache.ibatis.reflection.DefaultReflectorFactory"/>
*
* @param context
* @throws Exception
*/
private void reflectorFactoryElement(XNode context) throws Exception {
if (context != null) {
// 获取 reflectorFactory 标签 type 的值
String type = context.getStringAttribute("type");
// 别名 mao 中获取
ReflectorFactory factory = (ReflectorFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
// 在 configuration 设置
configuration.setReflectorFactory(factory);
}
}
17
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private void reflectionFactoryElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
ReflectorFactory factory = (ReflectorFactory) resolveClreplaced(type).newInstance();
configuration.setReflectorFactory(factory);
}
}
17
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private void objectWrapperFactoryElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
ObjectWrapperFactory factory = (ObjectWrapperFactory) resolveClreplaced(type).newInstance();
configuration.setObjectWrapperFactory(factory);
}
}
16
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
private void clearResultMap(XNode xNode, String namespace) {
for (XNode resultChild : xNode.getChildren()) {
if ("replacedociation".equals(resultChild.getName()) || "collection".equals(resultChild.getName()) || "case".equals(resultChild.getName())) {
if (resultChild.getStringAttribute("select") == null) {
configuration.getResultMapNames().remove(resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
configuration.getResultMapNames().remove(namespace + "." + resultChild.getStringAttribute("id", resultChild.getValueBasedIdentifier()));
if (resultChild.getChildren() != null && !resultChild.getChildren().isEmpty()) {
clearResultMap(resultChild, namespace);
}
}
}
}
}
16
Source : MybatisMapperRefresh.java
with GNU Affero General Public License v3.0
from zhouhuan751312
with GNU Affero General Public License v3.0
from zhouhuan751312
/**
* 清理resultMap
*
* @param list
* @param namespace
*/
private void cleanResultMap(List<XNode> list, String namespace) {
for (XNode resultMapNode : list) {
String id = resultMapNode.getStringAttribute("id", resultMapNode.getValueBasedIdentifier());
configuration.getResultMapNames().remove(id);
configuration.getResultMapNames().remove(namespace + "." + id);
clearResultMap(resultMapNode, namespace);
}
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 parameterMap 标签的内容
* <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
* <parameter property="name" resultMap="base"/>
* </parameterMap>
*
* @param list
*/
private void parameterMapElement(List<XNode> list) {
for (XNode parameterMapNode : list) {
// 获取标签属性值
String id = parameterMapNode.getStringAttribute("id");
String type = parameterMapNode.getStringAttribute("type");
// 到别名map中注册
Clreplaced<?> parameterClreplaced = resolveClreplaced(type);
// 获取下级标签 parameter 的属性值
List<XNode> parameterNodes = parameterMapNode.evalNodes("parameter");
List<ParameterMapping> parameterMappings = new ArrayList<>();
for (XNode parameterNode : parameterNodes) {
// 遍历下级节点获取属性
String property = parameterNode.getStringAttribute("property");
String javaType = parameterNode.getStringAttribute("javaType");
String jdbcType = parameterNode.getStringAttribute("jdbcType");
String resultMap = parameterNode.getStringAttribute("resultMap");
String mode = parameterNode.getStringAttribute("mode");
String typeHandler = parameterNode.getStringAttribute("typeHandler");
Integer numericScale = parameterNode.getIntAttribute("numericScale");
ParameterMode modeEnum = resolveParameterMode(mode);
Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
ParameterMapping parameterMapping = builderreplacedistant.buildParameterMapping(parameterClreplaced, property, javaTypeClreplaced, jdbcTypeEnum, resultMap, modeEnum, typeHandlerClreplaced, numericScale);
parameterMappings.add(parameterMapping);
}
builderreplacedistant.addParameterMap(id, parameterClreplaced, parameterMappings);
}
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 创建一个 {@link ResultMapping}
* <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
* <id column="ID" jdbcType="VARCHAR" property="id"/>
* <result column="age" jdbcType="INTEGER" property="age"/>
* <collection property="name" jdbcType="VARCHAR"/>
* </resultMap>
*
* @param context
* @param resultType
* @param flags
* @return
* @throws Exception
*/
private ResultMapping buildResultMappingFromContext(XNode context, Clreplaced<?> resultType, List<ResultFlag> flags) throws Exception {
String property;
if (flags.contains(ResultFlag.CONSTRUCTOR)) {
property = context.getStringAttribute("name");
} else {
property = context.getStringAttribute("property");
}
// 获取标签属性
String column = context.getStringAttribute("column");
String javaType = context.getStringAttribute("javaType");
String jdbcType = context.getStringAttribute("jdbcType");
String nestedSelect = context.getStringAttribute("select");
String nestedResultMap = context.getStringAttribute("resultMap", processNestedResultMappings(context, Collections.emptyList(), resultType));
String notNullColumn = context.getStringAttribute("notNullColumn");
String columnPrefix = context.getStringAttribute("columnPrefix");
String typeHandler = context.getStringAttribute("typeHandler");
String resultSet = context.getStringAttribute("resultSet");
String foreignColumn = context.getStringAttribute("foreignColumn");
boolean lazy = "lazy".equals(context.getStringAttribute("fetchType", configuration.isLazyLoadingEnabled() ? "lazy" : "eager"));
Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaType);
Clreplaced<? extends TypeHandler<?>> typeHandlerClreplaced = resolveClreplaced(typeHandler);
JdbcType jdbcTypeEnum = resolveJdbcType(jdbcType);
// 构造一个 resultMap
return builderreplacedistant.buildResultMapping(resultType, property, column, javaTypeClreplaced, jdbcTypeEnum, nestedSelect, nestedResultMap, notNullColumn, columnPrefix, typeHandlerClreplaced, flags, resultSet, foreignColumn, lazy);
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
protected void validateCollection(XNode context, Clreplaced<?> enclosingType) {
if ("collection".equals(context.getName()) && context.getStringAttribute("resultMap") == null && context.getStringAttribute("javaType") == null) {
MetaClreplaced metaResultType = MetaClreplaced.forClreplaced(enclosingType, configuration.getReflectorFactory());
String property = context.getStringAttribute("property");
if (!metaResultType.hreplacedetter(property)) {
throw new BuilderException("Ambiguous collection type for property '" + property + "'. You must specify 'javaType' or 'resultMap'.");
}
}
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 mapper 标签
* <mapper resource="com/huifer/mybatis/mapper/PersonMapper.xml"/>
* <mapper namespace="com.huifer.mybatis.mapper.PersonMapper">
* <p>
* <cache-ref namespace="com.huifer.mybatis.mapper.PersonMapper"/>
* <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
* <id column="ID" jdbcType="VARCHAR" property="id"/>
* <result column="age" jdbcType="INTEGER" property="age"/>
* </resultMap>
*
* <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
* <parameter property="name" resultMap="base"/>
* </parameterMap>
* <sql id="Base_List">
* name,age,phone,email,address
* </sql>
* <insert id="insert" parameterType="Person" keyProperty="id"
* useGeneratedKeys="true">
* INSERT INTO person (name, age, phone, email, address)
* VALUES(#{name},#{age},#{phone},#{email},#{address})
* </insert>
* </mapper>
*
* @param context
*/
private void configurationElement(XNode context) {
try {
// 获取 namespace 属性
String namespace = context.getStringAttribute("namespace");
if (namespace == null || namespace.equals("")) {
throw new BuilderException("Mapper's namespace cannot be empty");
}
// 直接设置 namespace 属性不做其他操作普通的 setter 方法
builderreplacedistant.setCurrentNamespace(namespace);
// <cache-ref namespace="com.huifer.mybatis.mapper.PersonMapper"/>
cacheRefElement(context.evalNode("cache-ref"));
// <cache blocking="" eviction="" flushInterval="" readOnly="" size="" type=""/>
cacheElement(context.evalNode("cache"));
// <parameterMap id="hc" type="com.huifer.mybatis.enreplacedy.PersonQuery">
parameterMapElement(context.evalNodes("/mapper/parameterMap"));
// <resultMap id="base" type="com.huifer.mybatis.enreplacedy.Person">
resultMapElements(context.evalNodes("/mapper/resultMap"));
// <sql id="Base_List">
// name,age,phone,email,address
// </sql>
sqlElement(context.evalNodes("/mapper/sql"));
// 解析 select|insert|update|delete 标签
buildStatementFromContext(context.evalNodes("select|insert|update|delete"));
} catch (Exception e) {
throw new BuilderException("Error parsing Mapper XML. The XML location is '" + resource + "'. Cause: " + e, e);
}
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 constructor 标签
*
* @param resultChild
* @param resultType
* @param resultMappings
* @throws Exception
*/
private void processConstructorElement(XNode resultChild, Clreplaced<?> resultType, List<ResultMapping> resultMappings) throws Exception {
List<XNode> argChildren = resultChild.getChildren();
for (XNode argChild : argChildren) {
List<ResultFlag> flags = new ArrayList<>();
flags.add(ResultFlag.CONSTRUCTOR);
if ("idArg".equals(argChild.getName())) {
flags.add(ResultFlag.ID);
}
resultMappings.add(buildResultMappingFromContext(argChild, resultType, flags));
}
}
16
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析
* <cache blocking="" eviction="" flushInterval="" readOnly="" size="" type=""/>
* 具体缓存策略查看{@link org.apache.ibatis.cache.decorators} 下的类
* 获取每个属性构造成 {@link Cache}
*
* @param context
*/
private void cacheElement(XNode context) {
if (context != null) {
// org.apache.ibatis.cache.impl.PerpetualCache 默认缓存实现
String type = context.getStringAttribute("type", "PERPETUAL");
// 添加到别名,或者从别名中获取
Clreplaced<? extends Cache> typeClreplaced = typeAliasRegistry.resolveAlias(type);
// 緩存策略 LRU 最近最少使用的:移除最长时间不被使用的对象。
String eviction = context.getStringAttribute("eviction", "LRU");
Clreplaced<? extends Cache> evictionClreplaced = typeAliasRegistry.resolveAlias(eviction);
// 刷新时间 单位 毫秒
Long flushInterval = context.getLongAttribute("flushInterval");
// 引用数量
Integer size = context.getIntAttribute("size");
// 只读
boolean readWrite = !context.getBooleanAttribute("readOnly", false);
//
boolean blocking = context.getBooleanAttribute("blocking", false);
// <properties> 下级属性
Properties props = context.getChildrenAsProperties();
// 构造 cache
builderreplacedistant.useNewCache(typeClreplaced, evictionClreplaced, flushInterval, size, readWrite, blocking, props);
}
}
16
Source : XMLIncludeTransformer.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
private Node findSqlFragment(String refid, Properties variables) {
refid = PropertyParser.parse(refid, variables);
refid = builderreplacedistant.applyCurrentNamespace(refid, true);
try {
XNode nodeToInclude = configuration.getSqlFragments().get(refid);
return nodeToInclude.getNode().cloneNode(true);
} catch (IllegalArgumentException e) {
throw new IncompleteElementException("Could not find SQL statement to include with refid '" + refid + "'", e);
}
}
16
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 typeHandler
* 最终调用方法:{@link TypeHandlerRegistry#register(java.lang.reflect.Type, org.apache.ibatis.type.JdbcType, org.apache.ibatis.type.TypeHandler)}
*
* <typeHandlers>
* <!-- <package name="com.huifer.mybatis.handler"/>-->
* <typeHandler jdbcType="VARCHAR" javaType="String" handler="com.huifer.mybatis.handler.TestTypeHandler"/>
* </typeHandlers>
*
* @param parent
*/
private void typeHandlerElement(XNode parent) {
if (parent != null) {
for (XNode child : parent.getChildren()) {
if ("package".equals(child.getName())) {
// 获取 package 的 name 属性
String typeHandlerPackage = child.getStringAttribute("name");
// 注册
typeHandlerRegistry.register(typeHandlerPackage);
} else {
// 获取 javaType 属性值
String javaTypeName = child.getStringAttribute("javaType");
// 获取 jdbcType 属性值
String jdbcTypeName = child.getStringAttribute("jdbcType");
// 获取 handler 属性值
String handlerTypeName = child.getStringAttribute("handler");
// org.apache.ibatis.type.TypeAliasRegistry.TypeAliasRegistry 构造方法中有默认的
// 从别名中获取
Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaTypeName);
JdbcType jdbcType = resolveJdbcType(jdbcTypeName);
Clreplaced<?> typeHandlerClreplaced = resolveClreplaced(handlerTypeName);
if (javaTypeClreplaced != null) {
if (jdbcType == null) {
typeHandlerRegistry.register(javaTypeClreplaced, typeHandlerClreplaced);
} else {
typeHandlerRegistry.register(javaTypeClreplaced, jdbcType, typeHandlerClreplaced);
}
} else {
typeHandlerRegistry.register(typeHandlerClreplaced);
}
}
}
}
}
16
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 别名加载
* <typeAliases>
* <!-- <package name="com.huifer.mybatis.enreplacedy"/>-->
* <typeAlias type="com.huifer.mybatis.enreplacedy.Person" alias="Person"/>
* </typeAliases>
*
* @param parent
*/
private void typeAliasesElement(XNode parent) {
if (parent != null) {
for (XNode child : parent.getChildren()) {
if ("package".equals(child.getName())) {
// 解析 package 标签
String typeAliasPackage = child.getStringAttribute("name");
configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
} else {
// 解析 typeAliases 标签
String alias = child.getStringAttribute("alias");
String type = child.getStringAttribute("type");
try {
// 将 type 中的全类名解析成字节码
Clreplaced<?> clazz = Resources.clreplacedForName(type);
// 别名注册
if (alias == null) {
typeAliasRegistry.registerAlias(clazz);
} else {
// 向 typeAliases put(别名名称,字节码)
typeAliasRegistry.registerAlias(alias, clazz);
}
} catch (ClreplacedNotFoundException e) {
throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
}
}
}
}
}
16
Source : DynamicTableLanguageDriver.java
with MIT License
from gexiangdong
with MIT License
from gexiangdong
@Override
public SqlSource createSqlSource(Configuration configuration, XNode xNode, Clreplaced<?> parameterType) {
logger.trace("createSqlSource({}, XNode: {}, {}", configuration, xNode, parameterType);
return super.createSqlSource(configuration, xNode, parameterType);
}
16
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private void typeAliasesElement(XNode parent) {
if (parent != null) {
for (XNode child : parent.getChildren()) {
if ("package".equals(child.getName())) {
String typeAliasPackage = child.getStringAttribute("name");
configuration.getTypeAliasRegistry().registerAliases(typeAliasPackage);
} else {
String alias = child.getStringAttribute("alias");
String type = child.getStringAttribute("type");
try {
Clreplaced<?> clazz = Resources.clreplacedForName(type);
if (alias == null) {
typeAliasRegistry.registerAlias(clazz);
} else {
typeAliasRegistry.registerAlias(alias, clazz);
}
} catch (ClreplacedNotFoundException e) {
throw new BuilderException("Error registering typeAlias for '" + alias + "'. Cause: " + e, e);
}
}
}
}
}
16
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private void typeHandlerElement(XNode parent) throws Exception {
if (parent != null) {
for (XNode child : parent.getChildren()) {
if ("package".equals(child.getName())) {
String typeHandlerPackage = child.getStringAttribute("name");
typeHandlerRegistry.register(typeHandlerPackage);
} else {
String javaTypeName = child.getStringAttribute("javaType");
String jdbcTypeName = child.getStringAttribute("jdbcType");
String handlerTypeName = child.getStringAttribute("handler");
Clreplaced<?> javaTypeClreplaced = resolveClreplaced(javaTypeName);
JdbcType jdbcType = resolveJdbcType(jdbcTypeName);
Clreplaced<?> typeHandlerClreplaced = resolveClreplaced(handlerTypeName);
if (javaTypeClreplaced != null) {
if (jdbcType == null) {
typeHandlerRegistry.register(javaTypeClreplaced, typeHandlerClreplaced);
} else {
typeHandlerRegistry.register(javaTypeClreplaced, jdbcType, typeHandlerClreplaced);
}
} else {
typeHandlerRegistry.register(typeHandlerClreplaced);
}
}
}
}
}
15
Source : XMLMapperBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* @param resultMapNode
* @param enclosingType
* @return
*/
protected Clreplaced<?> inheritEnclosingType(XNode resultMapNode, Clreplaced<?> enclosingType) {
if ("replacedociation".equals(resultMapNode.getName()) && resultMapNode.getStringAttribute("resultMap") == null) {
String property = resultMapNode.getStringAttribute("property");
if (property != null && enclosingType != null) {
MetaClreplaced metaResultType = MetaClreplaced.forClreplaced(enclosingType, configuration.getReflectorFactory());
return metaResultType.getSetterType(property);
}
} else if ("case".equals(resultMapNode.getName()) && resultMapNode.getStringAttribute("resultMap") == null) {
return enclosingType;
}
return null;
}
15
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 dataSourceElement 标签
* <dataSource type="POOLED">
* <property name="driver" value="com.mysql.jdbc.Driver"/>
* <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
* <property name="username" value="root"/>
* <property name="preplacedword" value="root"/>
* </dataSource>
*
* @param context
* @return
* @throws Exception
*/
private DataSourceFactory dataSourceElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
Properties props = context.getChildrenAsProperties();
// org.apache.ibatis.session.Configuration.Configuration()
DataSourceFactory factory = (DataSourceFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
// PooledDataSourceFactory -> UnpooledDataSourceFactory
factory.setProperties(props);
return factory;
}
throw new BuilderException("Environment declaration requires a DataSourceFactory.");
}
15
Source : HierarchicalXMLConfigBuilder.java
with GNU Lesser General Public License v3.0
from Alfresco
with GNU Lesser General Public License v3.0
from Alfresco
private DataSourceFactory dataSourceElement(XNode context) throws Exception {
if (context != null) {
String type = context.getStringAttribute("type");
Properties props = context.getChildrenAsProperties();
DataSourceFactory factory = (DataSourceFactory) resolveClreplaced(type).newInstance();
factory.setProperties(props);
return factory;
}
throw new BuilderException("Environment declaration requires a DataSourceFactory.");
}
14
Source : MybatisJpaXMLScriptBuilder.java
with Apache License 2.0
from zhouxx
with Apache License 2.0
from zhouxx
protected MixedSqlNode parseDynamicTags(XNode node) {
List<SqlNode> contents = new ArrayList<SqlNode>();
NodeList children = node.getNode().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
XNode child = node.newXNode(children.item(i));
if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
String data = child.getStringBody("");
TextSqlNode textSqlNode = new TextSqlNode(data);
if (textSqlNode.isDynamic()) {
contents.add(textSqlNode);
isDynamic = true;
} else {
contents.add(new StaticTextSqlNode(data));
}
} else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
// issue #628
String nodeName = child.getNode().getNodeName();
MybatisJpaXMLScriptBuilder.NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler == null) {
throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
}
handler.handleNode(child, contents);
isDynamic = true;
}
}
return new MixedSqlNode(contents);
}
14
Source : XMLScriptBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* <b>动态sql 的核心方法!!!</b>
* <trim suffixOverrides="," prefix="(" suffix=")">
* <if test="userId != null">
* USER_ID,
* </if>
* <if test="goodId != null">
* GOOD_ID,
* </if>
* <if test="price != null">
* PRICE,
* </if>
* <if test="size != null">
* `SIZE`,
* </if>
* <if test="companyId != null">
* COMPANY_ID,
* </if>
* <if test="groupId != null">
* GROUP_ID,
* </if>
* <if test="version != null">
* VERSION,
* </if>
* <if test="deleted != null">
* DELETED,
* </if>
* <if test="createUser != null">
* CREATE_USER,
* </if>
* <if test="createTime != null">
* CREATE_TIME,
* </if>
* <if test="updateUser != null">
* UPDATE_USER,
* </if>
* <if test="updateTime != null">
* UPDATE_TIME,
* </if>
* <if test="workOrderId != null">
* WORK_ORDER_ID,
* </if>
* </trim>
* @param node
* @return
*/
protected MixedSqlNode parseDynamicTags(XNode node) {
List<SqlNode> contents = new ArrayList<>();
NodeList children = node.getNode().getChildNodes();
for (int i = 0; i < children.getLength(); i++) {
XNode child = node.newXNode(children.item(i));
if (child.getNode().getNodeType() == Node.CDATA_SECTION_NODE || child.getNode().getNodeType() == Node.TEXT_NODE) {
// 如果不包含其他标签或者是纯文本节点
// data 是替换后sql文本
String data = child.getStringBody("");
TextSqlNode textSqlNode = new TextSqlNode(data);
if (textSqlNode.isDynamic()) {
contents.add(textSqlNode);
isDynamic = true;
} else {
// 直接添加
contents.add(new StaticTextSqlNode(data));
}
} else if (child.getNode().getNodeType() == Node.ELEMENT_NODE) {
// issue #628
// 动态标签处理逻辑
String nodeName = child.getNode().getNodeName();
// if 等标签
NodeHandler handler = nodeHandlerMap.get(nodeName);
if (handler == null) {
throw new BuilderException("Unknown element <" + nodeName + "> in SQL statement.");
}
/**
* 动态标签处理 {@link TrimHandler}
*/
handler.handleNode(child, contents);
isDynamic = true;
}
}
return new MixedSqlNode(contents);
}
14
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 加载 setting 标签
*
* <settings>
* <setting name="cacheEnabled" value="true"/>
* </settings>
*
* @param context
* @return
*/
private Properties settingsAsProperties(XNode context) {
if (context == null) {
// 返回一个空的 Properties
return new Properties();
}
Properties props = context.getChildrenAsProperties();
// Check that all settings are known to the configuration clreplaced
MetaClreplaced metaConfig = MetaClreplaced.forClreplaced(Configuration.clreplaced, localReflectorFactory);
for (Object key : props.keySet()) {
if (!metaConfig.hreplacedetter(String.valueOf(key))) {
throw new BuilderException("The setting " + key + " is not known. Make sure you spelled it correctly (case sensitive).");
}
}
return props;
}
14
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 记载 plugins 标签内容
* <plugins>
* <plugin interceptor="com.huifer.mybatis.plugins.TestPlugin">
* <property name="testPlugins" value="tPl"/>
* </plugin>
* </plugins>
*
* @param parent
* @throws Exception
*/
private void pluginElement(XNode parent) throws Exception {
if (parent != null) {
for (XNode child : parent.getChildren()) {
// <plugin interceptor="com.huifer.mybatis.plugins.TestPlugin"> 获取 interceptor 值
String interceptor = child.getStringAttribute("interceptor");
// 获取plugin 下面的 property 标签数据
Properties properties = child.getChildrenAsProperties();
Interceptor interceptorInstance = (Interceptor) resolveClreplaced(interceptor).getDeclaredConstructor().newInstance();
interceptorInstance.setProperties(properties);
configuration.addInterceptor(interceptorInstance);
}
}
}
14
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 environments 标签
* <environments default="development">
* <environment id="development">
* <transactionManager type="JDBC"/>
* <dataSource type="POOLED">
* <property name="driver" value="com.mysql.jdbc.Driver"/>
* <property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
* <property name="username" value="root"/>
* <property name="preplacedword" value="root"/>
* </dataSource>
* </environment>
* </environments>
*
* @param context
* @throws Exception
*/
private void environmentsElement(XNode context) throws Exception {
if (context != null) {
if (environment == null) {
// environment 初始化的是就是空
environment = context.getStringAttribute("default");
}
for (XNode child : context.getChildren()) {
// 获取 environment 的 id
String id = child.getStringAttribute("id");
if (isSpecifiedEnvironment(id)) {
// 解析 transactionManager
// JdbcTransaction
TransactionFactory txFactory = transactionManagerElement(child.evalNode("transactionManager"));
// 解析 dataSource
DataSourceFactory dsFactory = dataSourceElement(child.evalNode("dataSource"));
// 获取数据库
DataSource dataSource = dsFactory.getDataSource();
// 构建
Environment.Builder environmentBuilder = new Environment.Builder(id).transactionFactory(txFactory).dataSource(dataSource);
// 在 configuration 设置
configuration.setEnvironment(environmentBuilder.build());
}
}
}
}
14
Source : XMLConfigBuilder.java
with Apache License 2.0
from huifer
with Apache License 2.0
from huifer
/**
* 解析 objectFactory 标签
* <objectFactory type="com.huifer.mybatis.factory.TestObjectFactory">
* <property name="data" value="100"/>
* </objectFactory>
*
* @param context
* @throws Exception
*/
private void objectFactoryElement(XNode context) throws Exception {
if (context != null) {
// 获取标签 objectFactory 中的 type 属性
String type = context.getStringAttribute("type");
Properties properties = context.getChildrenAsProperties();
// 去别名 MAP 中获取实例
ObjectFactory factory = (ObjectFactory) resolveClreplaced(type).getDeclaredConstructor().newInstance();
// 设置属性值
factory.setProperties(properties);
// 在 configuration 中放入该工厂
configuration.setObjectFactory(factory);
}
}
See More Examples