一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

动态sql语句优化方法、装置、存储介质、计算机设备与流程

2023-01-15 02:36:30 来源:中国专利 TAG:


1.本技术涉及计算机技术领域,尤其涉及一种动态sql语句优化方法、装置、存储介质、计算机设备。


背景技术:

2.mybatis是支持普通sql查询,存储过程和高级映射的优秀持久层框架,mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集,mybatis可以使用简单的xml或注解来配置和映射原生信息,将接口和java的pojos(plain ordinary java object,普通的java对象)映射成数据库中的记录,mybatis最强大的特性之一就是它的动态语句功能。
3.然而,当前官方动态sql主要通过ognl解析,该解析方式语法为了兼容多种动态条件,需要多种标签配合使用,在sql中使用到in或者not in,则需要编写复杂的foreach代码,对于绝大多数mybatis使用场景,动态sql编写复杂,无效语法过多,导致编写效率低。


技术实现要素:

4.本技术的目的旨在至少能解决上述的技术缺陷之一,特别是现有技术中在绝大多数mybatis使用场景中,动态sql编写复杂,无效语法过多,导致编写效率低的技术缺陷。
5.本技术提供了一种动态sql语句优化方法,所述方法包括:
6.获取待优化的动态sql语句,以及所述动态sql语句中包含至少一个参数描述符及对应的执行条件;
7.针对每一参数描述符,判断该参数描述符是否满足预编译条件;
8.若否,则删除该参数描述符对应的执行条件;
9.若是,则根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译。
10.可选地,所述判断该参数描述符是否满足预编译条件,包括:
11.确定该参数描述符的符号特征及对应的输入参数,其中,该参数描述符的符号特征包括%{}和#{},所述输入参数包括空参数和非空参数;
12.当该参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且所述输入参数为非空参数时,判断该参数描述符满足预编译条件;
13.当该参数描述符的符号特征为%{}且所述输入参数为空参数时,判断该参数描述符不满足预编译条件。
14.可选地,所述根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译,包括:
15.判断该参数描述符对应的执行条件是否包含in或not in;
16.若包含,则将所述将该参数描述符替换为预先设置的占位符,以对所述动态sql语句中包含该执行条件的代码段进行预编译;
17.若不包含,则将该参数描述符进行删除,并对所述动态sql语句中包含该执行条件
的代码段进行预编译。
18.可选地,所述获取待优化的动态sql语句,以及所述动态sql语句中包含至少一个参数描述符及对应的执行条件,包括:
19.获取包含《script》的sql语句,并将该sql语句作为动态sql语句;
20.确定所述动态sql语句中所有参数描述符及对应的执行条件。
21.本发明还提供了一种动态sql语句优化装置,包括:
22.数据获取模块,用于获取待优化的动态sql语句,以及所述动态sql中包含至少一个参数描述符及对应的执行条件;
23.条件判断模块,用于针对每一参数描述符,判断该参数描述符是否满足预编译条件;
24.执行条件删除模块,用于删除所述动态sql语句中该参数描述符对应的执行条件;
25.预编译模块,用于根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译。
26.可选地,所述条件判断模块,包括:
27.参数数据获取子模块,用于确定该参数描述符的符号特征及对应的输入参数,其中,该参数描述符的符号特征包括%{}和#{},所述输入参数包括空删除的内容参数和非空参数;
28.符号特征判断子模块,用于当该参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且所述输入参数为非空参数时,判断该参数描述符满足预编译条件;
29.输入参数判断子模块,用于当该参数描述符的符号特征为%{}且所述输入参数为空参数时,判断该参数描述符不满足预编译条件。
30.可选地,所述预编译模块,包括:
31.执行条件判断子模块,用于判断该参数描述符对应的执行条件是否包含in或not in;
32.参数描述符替换子模块,用于将该参数描述符替换为预先设置的占位符,以对所述动态sql语句中包含该执行条件的代码段进行预编译;
33.参数描述符删除子模块,用于将该参数描述符进行删除,并对所述动态sql语句中包含该执行条件的代码段进行预编译。
34.可选地,所述数据获取模块,包括:
35.动态语句sql获取子模块,用于获取包含《script》的sql语句,并将该sql语句作为动态sql语句;
36.参数描述符确定子模块,用于确定所述动态sql语句中所有参数描述符及对应的执行条件。
37.本发明还提供了一种存储介质,所述存储介质中存储有计算机可读指令,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行如权利要求1至4中任一项所述动态sql语句优化方法的步骤。
38.本发明还提供了一种计算机设备,包括:一个或多个处理器,以及存储器;
39.所述存储器中存储有计算机可读指令,所述计算机可读指令被所述一个或多个处理器执行时,执行如权利要求1至4中任一项所述动态sql语句优化方法的步骤。
40.从以上技术方案可以看出,本技术实施例具有以下优点:
41.本技术提供的动态sql语句优化方法、装置、存储介质、计算机设备,在获取待优化的动态sql语句后,可以确定该动态sql语句中所有参数描述符以及对应的执行条件,并判断每一参数描述符是否满足预编译条件,若否,则删除该动态sql语句中该参数描述符对应的执行条件,以减少该动态sql语句无意义的代码,若是,则根据该参数描述符及对应的执行条件,对该动态sql语句中包含该执行条件的代码段进行预编译,以减少复杂语法的使用,例如,在动态sql语句的执行条件带有in或not in时,可以不再编写复杂的foreach代码。本技术采用的动态语法优化方法语法简单,可以减少大量无意义代码,提升动态sql语句的编写效率。
附图说明
42.为了更清楚地说明本技术实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本技术的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其它的附图。
43.图1为本技术实施例提供的一种动态sql语句优化方法的流程示意图;
44.图2为本技术实施例提供的一种动态sql语句优化方法的解析示意图;
45.图3为本技术实施例提供的一种动态sql语句优化装置的结构示意图;
46.图4为本技术实施例提供的一种计算机设备的内部结构示意图。
具体实施方式
47.下面将结合本技术实施例中的附图,对本技术实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本技术一部分实施例,而不是全部的实施例。基于本技术中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本技术保护的范围。
48.mybatis是支持普通sql查询,存储过程和高级映射的优秀持久层框架,mybatis避免了几乎所有的jdbc代码和手动设置参数以及获取结果集,mybatis可以使用简单的xml或注解来配置和映射原生信息,将接口和java的pojos(plain ordinary java object,普通的java对象)映射成数据库中的记录,mybatis最强大的特性之一就是它的动态语句功能。
49.然而,当前官方动态sql主要通过ognl解析,该解析方式语法为了兼容多种动态条件,需要多种标签配合使用,在sql中使用到in或者not in,则需要编写复杂的foreach代码,对于绝大多数mybatis使用场景,动态sql编写复杂,无效语法过多,导致编写效率低。
50.因此,本技术的目的是解决现有技术中对于绝大多数mybatis使用场景,动态sql编写复杂,无效语法过多,导致编写效率低的技术问题,并提出如下技术方案,具体参见下文:
51.在一个实施例中,如图1所示,图1为本技术实施例提供的一种动态sql语句优化方法的流程示意图;本技术提供了一种动态sql语句优化方法,具体包括如下:
52.s110:获取待优化的动态sql语句,以及动态sql语句中包含至少一个参数描述符及对应的执行条件。
53.本步骤中,在对动态sql语句进行优化前,可以先获取待优化的动态sql语句,并确定该动态sql语句中的参数描述符以及与该参数描述符对应的执行条件,以便根据该参数描述符和执行条件对动态sql语句进行对应的优化处理。
54.需要说明的是,这里的动态sql语句是在mybatis的使用场景中获取得到的,一般根据用户输入或外部条件动态组合的sql语句块,可以在xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,而mybatis为基于java的一种便于数据库操作的持久层框架,它使用简单的xml或注解用于配置和原始映射,将接口和java的pojos(plain ordinary java objects,普通的java对象)映射成数据库中的记录。
55.具体地,在mybatis框架中的动态sql带有《script》标签,并存储于mappedstatement中的dynamicsqlsource对象中,可以通过对mappedstatement进行解析,从而获取动态sql语句,进而确定该动态sql语句带有的所有参数描述符以及于参数描述符对应的执行条件。
56.进一步地,在mybatis的映射配置文件中,动态传递的参数描述符有两种,#{}以及${},其中${}为sql拼接符,在使用场景中不需要进行预编译,因此本技术不对参数描述符${}做sql语句优化处理,更进一步地,本技术在对动态sql语句进行优化时,通过自定义参数描述符%{}来表示参数为空的动态条件,以及根据参数描述符对应的执行条件来对sql模板进行优化。
57.s120:针对每一参数描述符,判断该参数描述符是否满足预编译条件。
58.本步骤中,通过步骤s110获取的动态sql语句以及动态sql语句中的所有参数描述符,可以进一步地对该动态sql语句中的参数描述符的符号特征以及对应的输入参数进行确定,判断是否满足预编译条件。
59.需要说明的是,本技术中的预编译指的是数据库在接收到sql语句后,需要根据制定的执行计划对语法进行解析,优化sql语句。在多数情况下,sql语句结构相同而传入参数不同时,可以采用预编译,在预编译语句初次调用后,执行代码会被缓存下来,在下一次调用时,只要是相同的预编译语句就可以直接将输入参数传入到编译过的语句执行代码中。
60.进一步地,并非所有参数描述符都需要进行预编译,在本技术中则根据动态sql中的参数描述符的符号特征以及对应的输入参数进行判断是否满足预编译条件,并通过自定义languagedriver并创建sqlsource实现自定义动态sql解析,完成对动态sql语句的优化。
61.可以理解的是,这里的languagedriver为mybatis官方提供的sql解析语言标准接口,而sqlsource为mybatis框架中的sql语句处理类。
62.s130:删除该参数描述符对应的执行条件。
63.本步骤中,通过步骤s120判断该参数描述符是否满足预编译条件,若否,则删除该参数描述符对应的执行条件,通过减少该动态sql语句无意义的代码,对动态sql语句进行优化。
64.s140:根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译。
65.本步骤中,通过步骤s120判断该参数描述符是否满足预编译条件,若是,则根据该参数描述符及对应的执行条件,对动态sql语句中包含该执行条件的代码段进行预编译。
66.具体地,当动态sql语句中包含的参数描述符满足预编译条件时,可以确定该参数
描述符的符号特征以及对应的执行条件,从而根据该参数描述符的符号特征以及对应的执行条件,生成对应的预编译语句,以对动态sql语句包含该执行条件的代码段进行预编译。
67.上述实施例中,在获取待优化的动态sql语句后,可以确定该动态sql语句中所有参数描述符以及对应的执行条件,并判断每一参数描述符是否满足预编译条件,若否,则删除该动态sql语句中该参数描述符对应的执行条件,以减少该动态sql语句无意义的代码,若是,则根据该参数描述符及对应的执行条件,对该动态sql语句中包含该执行条件的代码段进行预编译,以减少复杂语法的使用,例如,在动态sql语句的执行条件带有in或not in时,可以不再编写复杂的foreach代码。本技术采用的动态语法优化方法语法简单,可以减少大量无意义代码,提升动态sql语句的编写效率。
68.在一个实施例中,步骤120中判断该参数描述符是否满足预编译条件,可以包括:
69.s121:确定该参数描述符的符号特征及对应的输入参数,其中,该参数描述符的符号特征包括%{}和#{},所述输入参数包括空参数和非空参数。
70.s122:当该参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且所述输入参数为非空参数时,判断该参数描述符满足预编译条件。
71.s123:当该参数描述符的符号特征为%{}且所述输入参数为空参数时,判断该参数描述符不满足预编译条件。
72.本实施例中,在获取到所有参数描述符之后,可以确认每一参数描述符的符号特征以及对应的参数,其中,该参数描述符的符号特征包括%{}和#{},输入参数包括空参数和非空参数,当该参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且输入参数为非空参数时,判断该参数描述符满足预编译条件,当该参数描述符的符号特征为%{}且输入参数为空参数时,判断该参数描述符不满足预编译条件。
73.可以理解的是,本技术中的%{}为自定义参数描述符,以便更方便地对动态sql语句进行优化,减少当前官方动态sql语句地解析方式中为了兼容多种动态条件而配合使用的多种标签。
74.具体地,当参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且输入参数为非空参数时,则判断该参数描述符满足预编译条件,可以通过预编译的方式替换较为复杂的语句,对语法进行简化,当该参数描述符的符号特征为%{}且输入参数为非空参数时,则在动态sql语句中缺乏逻辑,因而不满足预编译条件,进而可以将此处的执行条件进行删减,以减少动态sql语句中无意义的语句。
75.举例来说,在一个动态sql语句中的参数描述符的符号特征为%{}且输入参数为非空参数,代码具体如下所示:
76.select device_code as devicecode,camera_nickname as name from t_camera_info where id=%{id}
77.其中,%{id}为标识动态参数,如果在查询过程中id传入参数为空,则解析后该动态sql语句具体如下:
78.select device_code as devicecode,camera_nickname as name from t_camera_info
79.在一个实施例中,步骤140中根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译,可以包括:
80.s141:判断该参数描述符对应的执行条件是否包含in或not in。
81.s142:若包含,则将该参数描述符替换为预先设置的占位符,以对所述动态sql语句中包含该执行条件的代码段进行预编译。
82.s143:若不包含,则将该参数描述符进行删除,并对所述动态sql语句中包含该执行条件的代码段进行预编译。
83.本实施例中,在确定该参数描述符满足预编译条件后,可以进而判断该参数描述符对应的执行条件是否包含in或not in,以便根据不同条件对动态sql语句采用不同方法进行预编译,若包含,则将该参数描述符替换为预先设置的占位符,以对动态sql语句中包含该执行条件的代码段进行预编译,若不包含,则将该参数描述符进行删除,并对动态sql语句中包含该执行条件的代码段进行预编译。
84.举例来说,在满足预编译条件的动态sql语句的参数标识符对应的执行条件中包含in或not in,即书写格式为xxx in#{}时,可以将该参数描述符替换为预先设置的占位符,并对该动态sql语句中包含该执行条件的代码段进行预编译,示例动态sql语句代码具体如下:
85.select*from t_camera_info where device_code in#{devicecodelist}
86.其中,当该动态sql语句的参数描述符的输入参数为2个时,则该动态sql语句解析预编译后代码具体如下所示:
87.select*from t_camera_info where device_code in(?,?)
88.如果该动态sql语句的参数标识符对应的执行条件中不包含in或not in,即书写格式为xxx#{}时,可以将该参数描述符进行删除,并对该动态sql语句中包含该执行条件的代码段进行预编译,示例动态sql语句代码具体如下:
89.select*from a where id=#{id}
90.其中,如果该动态sql语句的参数描述符的输入参数为1个时,则该动态sql语句解析预编译后代码具体如下所示:
91.select*from a where id=?
92.在一个实施例中,步骤110中获取待优化的动态sql语句,以及动态sql中包含至少一个参数描述符及对应的执行条件,可以包括:
93.s111:获取包含《script》的sql语句,并将该sql语句作为动态sql语句。
94.s112:确定所述动态sql语句中所有参数描述符及对应的执行条件。
95.本实施例中,在对动态sql语句进行优化前,可以先获取包含《script》的sql语句,并将该sql语句作为动态sql语句,接着确定动态sql语句中所有参数描述符及对应的执行条件,以作为动态sql语句优化方式的依据。
96.具体地,可以通过读取配置文件,并解析sql,如果sql中带有《script》标签表示动态sql,并将sql解析后的规则存入到mappedstatement.dynamicsqlsource内存对象中,如果没有《script》标签,则会存入到mappedstatement.rawsqlsource,接着可以通过mappedstatement查到待执行的sql模板中包含《script》,则表示该sql语句为动态sql语句。
97.可以理解的是,mappedstatement开源可以理解为一个sql查询语句的描述,包括sql模板,上下文对象等,而在mybatis内部通过key-value的形式(hashmap)存储,其中key
为具体某个查询方法的方法名(类路径 方法名,比如在java中class a所在的包名为com.test,方法名为selectbyid,则key为:com.test.a.selectbyid),value为mappedstatement对象,在实际使用的时候就可以通过具体调用的查询方法找到对应的mappedstatement。
98.为了更好地对本技术的动态sql语句优化方法进行解释,下面将通过图2来进一步说明,示意性地,如图3所示,图3为本技术实施例提供的动态sql语句优化方法的解析示意图。
99.图2中,在对sql进行解析获取到动态sql语句以及该动态sql语句中包含的所有参数描述符后,确定每一参数描述符的符号特征,如果该参数描述符为%{},则可以进而判断该参数描述符的输入参数是否为空参数,如果是,则该参数描述符在动态sql语句中缺乏逻辑,因此可以删除该参数描述符对应的执行条件,以减少无意义的代码,如果参数描述符的输入参数为非空参数,则可以进而确定该参数描述符对应的执行条件,并判断该执行条件是否包含in或not in,若包含,则根据实际输入参数个数生成sql预编译语句,若不包含,则对该执行语句进行变量替换生成预编译语句,最后可以根据预编译语句对动态sql语句进行预编译和sql执行。
100.举例来说,当前mybatis动态sql语法代码块具体包括如下:
[0101][0102][0103]
将该动态sql语句采用本技术的方案进行优化之后的代码具体包括如下:
[0104][0105]
下面对本技术实施例提供的动态sql语句优化装置进行描述,下文描述的动态sql语句优化装置与上文描述的动态sql语句优化方法可相互对应参照。
[0106]
在一个实施例中,如图3所示,图3为本技术实施例提供的一种动态sql语句优化装置的结构示意图;本发明还提供了一种动态sql语句优化装置,包括数据获取模块210、条件判断模块220、执行条件删除模块230和预编译模块240,具体包括如下:
[0107]
数据获取模块210,用于获取待优化的动态sql语句,以及所述动态sql中包含至少一个参数描述符及对应的执行条件。
[0108]
条件判断模块220,用于针对每一参数描述符,判断该参数描述符是否满足预编译条件。
[0109]
执行条件删除模块230,用于删除所述动态sql语句中该参数描述符对应的执行条件。
[0110]
预编译模块240,用于根据该参数描述符及对应的执行条件,对所述动态sql语句中包含该执行条件的代码段进行预编译。
[0111]
上述实施例中,在获取待优化的动态sql语句后,可以确定该动态sql语句中所有参数描述符以及对应的执行条件,并判断每一参数描述符是否满足预编译条件,若否,则删除该动态sql语句中该参数描述符对应的执行条件,以减少该动态sql语句无意义的代码,若是,则根据该参数描述符及对应的执行条件,对该动态sql语句中包含该执行条件的代码段进行预编译,以减少复杂语法的使用,例如,在动态sql语句的执行条件带有in或not in时,可以不再编写复杂的foreach代码。本技术采用的动态语法优化方法语法简单,可以减少大量无意义代码,提升动态sql语句的编写效率。
[0112]
在一个实施例中,所述条件判断模块220可以包括:
[0113]
参数数据获取子模块,用于确定该参数描述符的符号特征及对应的输入参数,其中,该参数描述符的符号特征包括%{}和#{},所述输入参数包括空删除的内容参数和非空参数。
[0114]
符号特征判断子模块,用于当该参数描述符的符号特征为#{},或该参数描述符的符号特征为%{}且所述输入参数为非空参数时,判断该参数描述符满足预编译条件。
[0115]
输入参数判断子模块,用于当该参数描述符的符号特征为%{}且所述输入参数为空参数时,判断该参数描述符不满足预编译条件。
[0116]
在一个实施例中,所述预编译模块240可以包括:
[0117]
执行条件判断子模块,用于判断该参数描述符对应的执行条件是否包含in或not in。
[0118]
参数描述符替换子模块,用于将该参数描述符替换为预先设置的占位符,以对所述动态sql语句中包含该执行条件的代码段进行预编译。
[0119]
参数描述符删除子模块,用于将该参数描述符进行删除,并对所述动态sql语句中包含该执行条件的代码段进行预编译。
[0120]
在一个实施例中,所述数据获取模块210可以包括:
[0121]
动态语句sql获取子模块,用于获取包含《script》的sql语句,并将该sql语句作为动态sql语句。
[0122]
参数描述符确定子模块,用于确定所述动态sql语句中所有参数描述符及对应的执行条件。
[0123]
在一个实施例中,本技术还提供了一种存储介质,所述存储介质中存储有计算机可读指令,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行如上述实施例中任一项所述动态sql语句优化方法的步骤。
[0124]
在一个实施例中,本技术还提供了一种计算机设备,所述计算机设备中存储有计算机可读指令,所述计算机可读指令被一个或多个处理器执行时,使得一个或多个处理器执行如上述实施例中任一项所述动态sql语句优化方法的步骤。
[0125]
示意性地,如图4所示,图4为本技术实施例提供的一种计算机设备的内部结构示意图,该计算机设备300可以被提供为一服务器。参照图4,计算机设备300包括处理组件302,其进一步包括一个或多个处理器,以及由存储器301所代表的存储器资源,用于存储可由处理组件302的执行的指令,例如应用程序。存储器301中存储的应用程序可以包括一个或一个以上的每一个对应于一组指令的模块。此外,处理组件302被配置为执行指令,以执行上述任意实施例的动态sql语句优化方法。
[0126]
计算机设备300还可以包括一个电源组件303被配置为执行计算机设备300的电源管理,一个有线或无线网络接口304被配置为将计算机设备300连接到网络,和一个输入输出(i/o)接口305。计算机设备300可以操作基于存储在存储器301的操作系统,例如windows server tm、mac os xtm、unix tm、linux tm、free bsdtm或类似。
[0127]
本领域技术人员可以理解,图4中示出的结构,仅仅是与本技术方案相关的部分结构的框图,并不构成对本技术方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0128]
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
[0129]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间可以根据需要进行组合,且相同相似部分互相参见即可。
[0130]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本技术。
对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本技术的精神或范围的情况下,在其它实施例中实现。因此,本技术将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献