From c54363bb4fc48741c2d89b1c94106c38e7417727 Mon Sep 17 00:00:00 2001 From: ce Date: Mon, 11 Feb 2019 15:23:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A8=A1=E6=9D=BF=E6=A6=82?= =?UTF-8?q?=E5=BF=B5=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ElementType.go | 9 ++++++++ GoMybatis.go | 2 +- GoMybatisTempleteDecoder.go | 37 +++++++++++++++++++++--------- TempleteDecoder.go | 5 ++-- example/Example_ActivityMapper.xml | 1 + 5 files changed, 40 insertions(+), 14 deletions(-) diff --git a/ElementType.go b/ElementType.go index c44426d..13f3b7d 100644 --- a/ElementType.go +++ b/ElementType.go @@ -30,3 +30,12 @@ const ( Element_where ElementType = "where" Element_Include ElementType = "include" ) + +func isMethodElement(tag ElementType) bool { + switch tag { + case Element_Insert, Element_Delete, Element_Update, Element_Select, + Element_Insert_Templete, Element_Delete_Templete, Element_Update_Templete, Element_Select_Templete: + return true + } + return false +} diff --git a/GoMybatis.go b/GoMybatis.go index fc19510..efd4bfd 100644 --- a/GoMybatis.go +++ b/GoMybatis.go @@ -42,7 +42,7 @@ func WriteMapperPtrByEngine(ptr interface{}, xml []byte, sessionEngine SessionEn func WriteMapper(bean reflect.Value, xml []byte, sessionFactory *SessionFactory, templeteDecoder TempleteDecoder, decoder SqlResultDecoder, sqlBuilder SqlBuilder, enableLog bool) { beanCheck(bean, sqlBuilder) var mapperTree = LoadMapperXml(xml) - templeteDecoder.DecodeTree(mapperTree) + templeteDecoder.DecodeTree(mapperTree, bean.Type()) //make a map[method]xml var methodXmlMap = makeMethodXmlMap(bean, mapperTree) var resultMaps = makeResultMaps(mapperTree) diff --git a/GoMybatisTempleteDecoder.go b/GoMybatisTempleteDecoder.go index 8552378..182fa29 100644 --- a/GoMybatisTempleteDecoder.go +++ b/GoMybatisTempleteDecoder.go @@ -2,31 +2,43 @@ package GoMybatis import ( "bytes" - "errors" "github.com/zhuxiujia/GoMybatis/utils" + "reflect" "strings" ) var equalOperator = []string{"/", "+", "-", "*", "**", "|", "^", "&", "%", "<", ">", ">=", "<=", " in ", " not in ", " or ", "||", " and ", "&&", "==", "!="} type GoMybatisTempleteDecoder struct { - tree map[string]*MapperXml } -func (it *GoMybatisTempleteDecoder) DecodeTree(tree map[string]*MapperXml) error { +func (it *GoMybatisTempleteDecoder) DecodeTree(tree map[string]*MapperXml, beanType reflect.Type) error { if tree == nil { - return errors.New("data cant be nil!") + return utils.NewError("GoMybatisTempleteDecoder", "decode data map[string]*MapperXml cant be nil!") } - it.tree = tree - for _, v := range it.tree { - it.Decode(v) + if beanType.Kind() == reflect.Ptr { + beanType = beanType.Elem() + } + + for _, v := range tree { + var method *reflect.StructField + if isMethodElement(v.Tag) { + var upperId = utils.UpperFieldFirstName(v.Id) + m, haveMethod := beanType.FieldByName(upperId) + if haveMethod { + method = &m + } + } + it.Decode(method, v, tree) } return nil } -func (it *GoMybatisTempleteDecoder) Decode(mapper *MapperXml) error { +func (it *GoMybatisTempleteDecoder) Decode(method *reflect.StructField, mapper *MapperXml, tree map[string]*MapperXml) error { + + switch mapper.Tag { - if mapper.Tag == "selectTemplete" { + case "selectTemplete": mapper.Tag = Element_Select var tables = mapper.Propertys["tables"] @@ -50,7 +62,9 @@ func (it *GoMybatisTempleteDecoder) Decode(mapper *MapperXml) error { sql.Reset() it.DecodeWheres(wheres, mapper) } - } else if mapper.Tag == "insertTemplete" { + break + + case "insertTemplete": mapper.Tag = Element_Insert var tables = mapper.Propertys["tables"] @@ -64,7 +78,7 @@ func (it *GoMybatisTempleteDecoder) Decode(mapper *MapperXml) error { inserts = "*?*" } - var resultMapData = it.tree[resultMap] + var resultMapData = tree[resultMap] if resultMapData == nil { panic(utils.NewError("GoMybatisTempleteDecoder", "resultMap not define! id = ", resultMap)) } @@ -132,6 +146,7 @@ func (it *GoMybatisTempleteDecoder) Decode(mapper *MapperXml) error { } } mapper.ElementItems = append(mapper.ElementItems, trimArg) + break } return nil diff --git a/TempleteDecoder.go b/TempleteDecoder.go index 30479e1..90d2a84 100644 --- a/TempleteDecoder.go +++ b/TempleteDecoder.go @@ -1,6 +1,7 @@ package GoMybatis +import "reflect" + type TempleteDecoder interface { - Decode(mapper *MapperXml) error - DecodeTree(tree map[string]*MapperXml) error + DecodeTree(tree map[string]*MapperXml, beanType reflect.Type) error } diff --git a/example/Example_ActivityMapper.xml b/example/Example_ActivityMapper.xml index 7e7c7f6..b2c94b4 100644 --- a/example/Example_ActivityMapper.xml +++ b/example/Example_ActivityMapper.xml @@ -17,6 +17,7 @@ +