# -*- coding:utf-8 -*-
'''
Created on 2013-3-6
@author: naughty
'''
from com.domain.ConnectionPool import ConnectionPool
from com.domain.TypeAlias import TypeAliasCenter, TypeAliasBean
from com.pybatis.ClassPathList import classPathList
from xml.dom.expatbuilder import TEXT_NODE
import xml.dom.minidom
#===============================================================================
# 数据库连接池。这里只是产生了连接池。要想办法在应用关闭的时候把连接池中的链接全部关掉
#===============================================================================
globalConnectionPool = ConnectionPool('localhost', '', '', 'test')
#===============================================================================
# xml处理函数
#===============================================================================
def get_attrvalue(node, attrname):
'''
用来读取dom节点上的一个属性
'''
return node.getAttribute(attrname) if node else ''
def handleIsNotEmptyTag(isNotEmptyNode, inputObject):
'''
处理isNotEmpty节点。返回处理后得到的sql
'''
attr = get_attrvalue(isNotEmptyNode, 'property')
attrvalue = getattr(inputObject, attr)
if attrvalue != '':
children = isNotEmptyNode.childNodes
sql = ''
for child in children:
if child.nodeType == TEXT_NODE:
sql = sql + child.nodeValue
prepend = get_attrvalue(isNotEmptyNode, 'prepend')
return prepend + " " + sql
return ''
def handleIsPropertyAvailableTag(isPropertyAvailableNode, inputObject):
'''
处理isPropertyAvailable节点。返回处理后得到的sql
'''
sql = ''
#===========================================================================
# 找到property属性
#===========================================================================
attr = get_attrvalue(isPropertyAvailableNode, 'property')
#===========================================================================
# 如果有这个属性
#===========================================================================
if hasattr(inputObject, attr):
children = isPropertyAvailableNode.childNodes
for child in children:
if child.nodeType != child.TEXT_NODE:
if child.tagName == 'isEmpty':
sql = sql + handleIsEmptyTag(child, inputObject)
if child.tagName == 'isNotEmpty':
sql = sql + handleIsNotEmptyTag(child, inputObject)
if child.tagName == 'isNull':
sql = sql + handleIsNullTag(child, inputObject)
if child.tagName == 'isNotNull':
sql = sql + handleIsNotNullTag(child, inputObject)
return sql
else:
return ''
def handleIsEmptyTag(isEmptyNode, inputObject):
'''
处理isEmpty节点。返回处理后得到的sql
'''
attr = get_attrvalue(isEmptyNode, 'property')
attrvalue = getattr(inputObject, attr)
if attrvalue == '':
children = isEmptyNode.childNodes
sql = ''
for child in children:
if child.nodeType == TEXT_NODE:
sql = sql + child.nodeValue
prepend = get_attrvalue(isEmptyNode, 'prepend')
return prepend + " " + sql
return ''
def handleIsNotNullTag(isNotNullNode, inputObject):
'''
处理isNotNull节点。返回处理后得到的sql
'''
attr = get_attrvalue(isNotNullNode, 'property')
attrvalue = getattr(inputObject, attr)
if attrvalue != None:
children = isNotNullNode.childNodes
sql = ''
for child in children:
if child.nodeType == TEXT_NODE:
sql = sql + child.nodeValue
prepend = get_attrvalue(isNotNullNode, 'prepend')
return prepend + " " + sql
return ''
def handleIsNullTag(isNullNode, inputObject):
'''
处理isNull节点。返回处理后得到的sql
'''
attr = get_attrvalue(isNullNode, 'property')
attrvalue = getattr(inputObject, attr)
if attrvalue == None:
children = isNullNode.childNodes
sql = ''
for child in children:
if child.nodeType == TEXT_NODE:
sql = sql + child.nodeValue
prepend = get_attrvalue(isNullNode, 'prepend')
return prepend + " " + sql
return ''
def handleDynamicTag(dynamicNode, inputObject):
'''
处理动态sql部分。返回处理完的sql语句。inputParam是输入对象
'''
sql = ''
children = dynamicNode.childNodes
for child in children:
if child.nodeType != child.TEXT_NODE:
if child.tagName == 'isPropertyAvailable':
sql = sql + handleIsPropertyAvailableTag(child, inputObject)
if child.tagName == 'isNotNull':
sql = sql + handleIsNotNullTag(child, inputObject)
if child.tagName == 'isNull':
sql = sql + handleIsNullTag(child, inputObject)
if child.tagName == 'isEmpty':
sql = sql + handleIsEmptyTag(child, inputObject)
if child.tagName == 'isNotEmpty':
sql = sql + handleIsNotEmptyTag(child, inputObject)
else:
newstr = child.nodeValue.strip() if child.nodeValue.strip() != '' else ''
sql = sql + newstr
return sql
def parseTypeAlias(typeAliasElements, namespace):
'''
处理别名
'''
bean = TypeAliasBean()
for t in typeAliasElements:
alias = get_attrvalue(t, 'alias').strip()
classtype = get_attrvalue(t, 'type').strip()
bean.add(alias, classtype)
#===========================================================================
# 使用namespace作为别名的key
#===========================================================================
typeAliasCenter.addOrUpdate(namespace, bean)
def handleSelectXMLNode(xmlNode, inputObject):
'''
处理select查询xml。如果有dynamic标签,则要把dynamic标签的内容取出来做判断,并最终合并sql。由于dynamic的位置不确定,所以合并sql的时候需要慎重。
xmlNode:从xml中解析出来的select节点
inputObject:输入参数
'''
#===========================================================================
# 检查输入的对象是否和xml中规定的对象相符合,不符合则要抛出异常
#===========================================================================
#===========================================================================
# 在xml中,
# 1、如果是别名,找到别名对应的真正名字
# 2、如果不是别名,那么就使用当前的名字
#===========================================================================
namespace = inputObject.__module__ + "." + type(inputObject).__name__
typeAliasBean = typeAliasCenter.get(namespace)
#===========================================================================
# 取得参数类型
#===========================================================================
paramClass = get_attrvalue(xmlNode, 'parameterClass')
#===========================================================================
# 等于None说明没有别名。如果不等于None,说明是使用了别名。
#===========================================================================
if typeAliasBean.get(paramClass) != None:
alias = typeAliasBean.get(paramClass)
if namespace != alias:
raise Exception('input param type error.expect ' + alias + ' but get ' + namespace)
else:
if paramClass != namespace:
raise Exception('input param type error.expect ' + alias + ' but get ' + namespace)
PyBatis源码、测试文件
需积分: 10 180 浏览量
2013-03-12
16:33:40
上传
评论
收藏 14KB RAR 举报
imzoer
- 粉丝: 591
- 资源: 11
最新资源
- 猫咪和汤58.apk
- 浏览器.apk
- 基于matlab实现是一个matlab中的power system 中搭建的一个模型
- 基于JSP毕业设计-教学管理系统(源代码+论文).zip
- 基于JSP毕业设计-家政管理系统-毕业设计.zip
- 基于Python实现淘宝商品评论采集(含逆向)源代码
- 基于matlab实现多目标进化算法NSGAⅡ&Matlab讲解.rar
- 基于matlab实现多车辆车辆路径问题,用遗传算法编程,保证可用.rar
- 基于matlab实现多层极限学习机实现手写体识别,准确率超过99%.rar
- 基于matlab实现电力系统最优潮流程序,可以应用于电力市场下的最优潮流计算 适合电力系统专业的同仁使用.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈