iBatis和MyBatis SQL映射文件编码规范.docx
- 文档编号:23707097
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:18
- 大小:101.87KB
iBatis和MyBatis SQL映射文件编码规范.docx
《iBatis和MyBatis SQL映射文件编码规范.docx》由会员分享,可在线阅读,更多相关《iBatis和MyBatis SQL映射文件编码规范.docx(18页珍藏版)》请在冰豆网上搜索。
iBatis和MyBatisSQL映射文件编码规范
iBatis和MyBatisSQL映射文件编码规范
目录
1XML注释注意事项2
1.1使用
---->注释,前后至少留出一个半角空格2
1.2避免注释出现在SQL语句中2
2防止SQL注入2
2.1变量引用的两种写法2
2.1.1$写法,存在SQL注入风险2
2.1.2#写法,数据库预编译,防止SQL注入3
2.2LIKE操作符3
2.2.1$写法3
2.2.2#写法3
2.3IN操作符4
2.3.1$写法4
2.3.2#写法4
2.4TOP子句5
2.4.1$写法5
2.4.2#写法5
2.5ORDERBY子句5
2.5.1$写法5
2.5.2#写法6
2.6GROUPBY语句6
2.6.1$写法6
2.6.2#写法6
3避免使用SELECT*查询物理表7
3.1避免使用SELECT*查询物理表7
4避免WHERE/ON语句中列类型隐式转换7
4.1变量类型优先级应不高于数据库中的列类型7
4.2指定字符串变量的JDBC类型8
5避免WHERE/ON语句中对字段使用函数运算9
5.1日期类型字段9
5.1.1查询条件和日期字段的精确度一致9
5.1.2如果查询条件和日期字段的精确度不一致10
5.2字符串类型字段12
6指定别名(Alias)12
6.1建议使用AS关键字指定别名,而不是空格12
6.2建议子查询中应指定表的别名13
6.3建议避免使用a、b、c、d等无意义的别名13
7建议使用WITH(NOLOCK)(涉及金融、财务、支付和会计成本等等的SQL语句不要使用该关键词)14
7.1建议SELECT语句使用WITH(NOLOCK)(关键业务除外)14
8建议指定表的架构名称14
8.1建议指定表的架构名称dbo14
1XML注释注意事项
1.1使用
---->注释,前后至少留出一个半角空格
SQLXML映射文件中使用
---->注释,其中注释内容不要紧挨着注释的起始标签和结束标签。
注释内容距离起始标签和结束标签至少留出一个半角空格。
--获取学员信息-->
selectUid,Memberid,FullNamefromMemberwith(nolock)whereMemberid=#memberid:
CHAR#
1.2避免注释出现在SQL语句中
--获取学员信息-->
selectUid,Memberid,FullName
--这里不要出现注释-->
fromMemberwith(nolock)
--这里不要出现注释-->
whereMemberid=#memberid:
CHAR#
--这里不要出现注释-->
2防止SQL注入
2.1变量引用的两种写法
对于ibatis/MyBatis变量引用方式可以使用#和$两种写法,其中#写法会采用预编译方式,将转义交给了数据库,不会出现注入问题;如果采用$写法,则相当于拼接字符串,会出现注入问题。
禁止使用$写法,请使用#写法或者枚举形式代替。
如下以iBatis为例说明$写法和#写法。
2.1.1$写法,存在SQL注入风险
引起SQL注入问题的$写法示例:
--0.SQL注入写法:
存在安全隐患-->
SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID
FROMdbo.CwareAScwWITH(NOLOCK)
WHEREcw.CwareID=$cwareID$
2.1.2#写法,数据库预编译,防止SQL注入
不会引起SQL注入问题的#写法示例:
--1.预编译写法:
防止SQL注入-->
SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID
FROMdbo.CwareAScwWITH(NOLOCK)
WHEREcw.CwareID=#cwareID#
2.2LIKE操作符
2.2.1$写法
--0.SQL注入写法:
存在安全隐患-->
parameterClass="java.util.Map"> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareNamelike$cwareName$ 2.2.2#写法 --1.预编译写法: 使用字符串连接符+号--> parameterClass="java.util.Map"> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareNamelike'%'+#cwareName: VARCHAR#+'%' --2.预编译写法: 在JAVA程序中预先拼接前后的%符号--> parameterClass="java.util.Map"> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareNamelike#cwareName: VARCHAR# 2.3IN操作符 2.3.1$写法 --0.SQL注入写法: 存在安全隐患--> parameterClass="java.lang.String"> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareIDIN$value$ 2.3.2#写法 iBatis中,使用 --1.预编译写法: 适用于一个或多个参数--> parameterClass="java.util.Map"> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareIDIN #cwareIDs[]# --2.预编译写法: 如果只有一个参数--> SELECTcw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) WHEREcw.CwareIDIN #[]# 2.4TOP子句 2.4.1$写法 --0.SQL注入写法: 存在安全隐患--> SELECTTOP$value$cw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) 2.4.2#写法 --1.预编译写法: TOP后的参数必须使用小括号,并且必须是整数(无法自动转换数据类型)--> SELECTTOP(#value#)cw.CwareID,cw.CwID,cw.CwareName,cw.InnerCwareID FROMdbo.CwareAScwWITH(NOLOCK) 2.5ORDERBY子句 2.5.1$写法 --0.SQL注入写法: 存在安全隐患--> SELECTTOP(100)CwareID,CwID,CwareName,InnerCwareID FROMdbo.CwareWITH(NOLOCK) ORDERBY$orderBy$ 2.5.2#写法 --1.预编译写法: 枚举有效的列名称--> parameterClass="java.util.Map"> SELECTTOP(100)CwareID,CwID,CwareName,InnerCwareID FROMdbo.CwareWITH(NOLOCK) ORDERBYCwareID ORDERBYCwID ORDERBYCwareName ORDERBYInnerCwareID 2.6GROUPBY语句 2.6.1$写法 同ORDERBY子句 2.6.2#写法 同ORDERBY子句 3避免使用SELECT*查询物理表 3.1避免使用SELECT*查询物理表 避免使用SELECT*查询物理表,应该只查询业务需要的字段。 如果确实需要查询物理表的所有字段,则应该在SELECT语句中列出所有字段。 示例问题SQL语句: SELECTtop1*FROMMEMBERWHEREmemberid=#memberid# 上述SQL语句可改写成: --只列出业务需要的字段 SELECTTOP (1)Memberid,FullName,UidFROMdbo.MemberWITH(NOLOCK)WHEREUid=#uid# 4避免WHERE/ON语句中列类型隐式转换 4.1变量类型优先级应不高于数据库中的列类型 变量类型尽量与数据库中列类型保存一致,至少变量类型优先级应不高于数据库中的列类型。 避免因变量类型优先级较高而使列类型产生隐式转换,进而严重影响索引的使用。 SQLServer显示和隐式类型转换: SQLServer数据类型优先级(Transact-SQL): SQLServer、JDBC和Java编程语言数据类型之间的默认映射: (1)示例一: 如下SQL语句中,列类型的优先级低于变量类型,执行计划中显示对列Memberid使用了CONVERT_IMPLICIT()函数操作,因此影响索引的使用。 虽然SQLServer2008优化了隐式数据类型转换的处理,但是,还是应该避免这种情况的出现。 GO --①Memberid列类型char的优先级低于@P0变量类型nvarchar declare@P0nvarchar(4000)=N'cdeljishu007'; selectUid,Memberid,FullNamefromMemberwhereMemberid=@P0; GO (2)示例二: 如下SQL语句中,列类型的优先级高于变量类型,执行计划中显示对变量@P0使用了CONVERT_IMPLICIT()函数操作,但是对列Memberid没有影响,因此不会影响索引的使用。 GO --②Uid列类型int的优先级高于@P0变量类型nvarchar declare@P0nvarchar(4000)=N'42226790'; selectUid,Memberid,FullNamefromMemberwhereUid=@P0; GO 4.2指定字符串变量的JDBC类型 指定字符串变量的JDBC类型,尤其是数据库字段类型为CHAR、VARCHAR的字符串变量。 示例1: iBatis中指定变量courseID的JDBC类型: SELECTCourseid,Title,SelCourseTitle,HomeTitle,MobileTitle, SubjectID,ClassID,Price,CloseDate,StudyDay,DownLoadHour, CanUseCard,EnjoyDiscount,EduSubjectID,BasicUnit,CanPay,DispDefault, appShowStatus,mobileclass,CrossSubject,SupportMobile,ContinueCourseID FROMdbo.CourseWITH(NOLOCK) WHERECourseid=#courseID: CHAR# 示例2: MyBatis中指定变量userName的JDBC类型: selectcount(*) fromdbo.OPMN_USERwith(nolock) whereuserName=#{userName,jdbcType=VARCHAR} 5避免WHERE/ON语句中对字段使用函数运算 避免对WHERE语句中的字段进行函数运算,尤其对于日期类型的字段使用函数操作。 不要为了书写或者理解方便而编写损害数据库查询性能的SQL语句。 5.1日期类型字段 避免对于日期类型的字段使用函数操作,应将对日期字段的函数操作改写成对参数变量的函数操作,或者改写成区间查询。 日期类型的查询条件分为如下两种情况: (1)如果查询条件和日期字段的精确度一致(即查询条件是整日期或整时整点,并且字段存储也是整日期或整时整点的记录),可以使用等号连接字段和查询条件。 (2)如果查询条件和日期字段的精确度不一致。 可以使用区间查询(即日期字段大于等于起始时间,小于结束时间)。 5.1.1查询条件和日期字段的精确度一致 示例问题SQL语句: --查询指定学员,历史的学习明细信息--> selectcu.UserIDasuid,cw.CwareID,cw.CwareName+''+cc.CwareClassNameasstudyContent, cr.TeacherName,cu.studyTime from( selectUserID,CwareID,SUM(StudyTime)asstudyTime fromCware_TimeDay_Userwith(nolock) whereUserID=#uid#andconvert(varchar(10),StudyDay,120)=#studyDate# groupbyUserID,CwareID )cu innerjoinCwarecwwith(nolock)oncu.CwareID=cw.CwareID innerjoinCware_Classccwith(nolock)oncw.CwareClassID=cc.cwareClassID innerjoinCware_Teachercrwith(nolock)oncw.TeacherID=cr.TeacherID orderbycw.CwareID 上述SQL语句可改写成: --查询指定学员,历史的学习明细信息--> selectcu.UserIDasuid,cw.CwareID,cw.CwareName+''+cc.CwareClassNameasstudyContent, cr.TeacherName,cu.studyTime from( selectUserID,CwareID,SUM(StudyTime)asstudyTime fromCware_TimeDay_Userwith(nolock) whereUserID=#uid#andStudyDay=#studyDate# groupbyUserID,CwareID )cu innerjoinCwarecwwith(nolock)oncu.CwareID=cw.CwareID innerjoinCware_Classccwith(nolock)oncw.CwareClassID=cc.cwareClassID innerjoinCware_Teachercrwith(nolock)oncw.TeacherID=cr.TeacherID orderbycw.CwareID 5.1.2如果查询条件和日期字段的精确度不一致 示例问题SQL语句: --查询指定学员,今天的学习明细信息--> selectct.UserIDasuid,cw.CwareID,cw.CwareName+''+cc.CwareClassNameasstudyContent, cr.TeacherName,ct.studyTime
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- iBatis和MyBatis SQL映射文件编码规范 iBatis MyBatis SQL 映射 文件 编码 规范