iBATIS常用sql语句


版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 1/12 iBATIS 常用 Sql 语句 版本 1.0 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 2/12 文档修订记录 版本编号或者 更改记录编号 *变化 状态 简要说明(变更内容和变更范 围) 日期 变更人 审核日期 审核人 1.0 新建 2009-4-17 谷涛 1.1 增加 2009-4-28 谷涛 *变化状态:A——增加,M——修改,D——删除 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 3/12 (1) 输入参数为单个值 delete from MemberAccessLog where accessTimestamp <= #value# (2) 输入参数为一个对象 select actionId, count(*) as count from MemberAccessLog where memberId = #memberId# and accessTimestamp > #start# and accessTimestamp <= #end# group by actionId (4) 输入参数中含有数组 update Question set status = #status# #actionIds[]# 说明:actionIds 为传入的数组的名字; 使用 dynamic 标签避免数组为空时导致 sql 语句语法出错; 使用 isNotNull 标签避免数组为 null 时 ibatis 解析出错 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 5/12 (5)传递参数只含有一个数组 说明;注意 select 的标签中没有 parameterClass 一项 另:这里也可以把数组放进一个 hashMap 中,但增加额外开销,不建议使用 (6)让ibatis把参数直接解析成字符串 说明:使用这种方法存在 sql 注入的风险,不推荐使用 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 6/12 (7)分页查询 (pagedQuery) select accessLogId, memberId, clientIP, httpMethod, actionId, requestURL, accessTimestamp, extend1, extend2, extend3 from MemberAccessLog accessTimestamp <= #accessTimestamp# select count(*) from MemberAccessLog 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 7/12 limit #startIndex# , #pageSize# 说明:本例中,代码应为: HashMap hashMap = new HashMap(); hashMap.put(“accessTimestamp”, someValue); pagedQuery(“com.fashionfree.stat.accesslog.selectMemberAccessLogBy”, hashMap); pagedQuery 方法首先去查找名为 com.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count 的 mapped statement 来进 行 sql 查询,从而得到 com.fashionfree.stat.accesslog.selectMemberAccessLogBy 查询的记 录个数, 再进行所需的 paged sql 查询(com.fashionfree.stat.accesslog.selectMemberAccessLogBy), 具体过程参见 utils 类中的相关代码 (8)sql语句中含有大于号>、小于号< 两种方式 1. 将大于号、小于号写为: > < 如: delete from MemberAccessLog where accessTimestamp <= #value# 2. 将特殊字符放在 xml 的 CDATA 区内: 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 8/12 推荐使用第一种方式,写为< 和 > (XML 不对 CDATA 里的内容进行解析,因此 如果 CDATA 中含有 dynamic 标签,将不起作用) (9)include和sql标签 将常用的 sql 语句整理在一起,便于共用: select samplingTimestamp,onlineNum,year, month,week,day,hour from OnlineMemberNum where samplingTimestamp <= #samplingTimestamp# 注意:sql 标签只能用于被引用,不能当作 mapped statement。如上例中有名为 selectBasicSql 的 sql 元素,试图使用其作为 sql 语句执行是错误的: sqlMapClient.queryForList(“selectBasicSql”); × (10)随机选取记录 ORDER BY rand() LIMIT #number# 从数据库中随机选取 number 条记录(只适用于 MySQL) 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 9/12 (11)将SQL GROUP BY分组中的字段拼接 SELECT a.answererCategoryId, a.answererId, a.answererName, a.questionCategoryId, a.score, a.answeredNum, a.correctNum, a.answerSeconds, a.createdTimestamp, a.lastQuestionApprovedTimestamp, a.lastModified, GROUP_CONCAT(q.categoryName) as categoryName FROM AnswererCategory a, QuestionCategory q WHERE a.questionCategoryId = q.questionCategoryId GROUP BY a.answererId ORDER BY a.answererCategoryId 注:SQL 中使用了 MySQL 的 GROUP_CONCAT 函数 (12) 按照IN里面的顺序进行排序 ①MySQL: select moduleId, moduleName, status, lastModifierId, lastModifiedName, lastModified from StatModule where moduleId in (3, 5, 1) order by instr(',3,5,1,' , ','+ltrim(moduleId)+',') 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 10/12 ②SQLSERVER: select moduleId, moduleName, status, lastModifierId, lastModifiedName, lastModified from StatModule where moduleId in (3, 5, 1) order by charindex(','+ltrim(moduleId)+',' , ',3,5,1,') 说明:查询结果将按照 moduleId 在 in 列表中的顺序(3, 5, 1)来返回 MySQL : instr(str, substr) SQLSERVER: charindex(substr, str) 返回字符串 str 中子字符串的第一个出现位置 ltrim(str) 返回字符串 str, 其引导(左面的)空格字符被删除 (13) resultMap resultMap 负责将 SQL 查询结果集的列值映射成 Java Bean 的属性值。 使用 resultMap 称为显式结果映射,与之对应的是 resultClass(内联结果映射),使用 resultClass 的最大好处便是简单、方便,不需显示指定结果,由 iBATIS 根据反射来确定 自行决定。而 resultMap 则可以通过指定 jdbcType 和 javaType,提供更严格的配置认证。 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 11/12 (14) typeAlias 允许你定义别名,避免重复输入过长的名字。 (15) remap 此例中,根据参数 tag 值的不同,会获得不同的结果集,如果没有 remapResults="true" 属性,iBatis 会将第一次查询时的结果集缓存,下次再执行时(必须还是该进程中)不会再 执行结果集映射,而是会使用缓存的结果集。 因此,如果上面的例子中 remapResult 为默认的 false 属性,而有一段程序这样书写: ############################################### HashMap hashMap = new HashMap(); hashMap.put("tag", 1); sqlClient.queryForList("testForRemap", hashMap); hashMap.put("tag", 2); sqlClient.queryForList("testForRemap", hashMap); ############################################### 则程序会在执行最后一句的query查询时报错,原因就是iBATIS使用了第一次查询时的结果集, 而前后两次的结果集是不同的:(userId, userName)和(userId, userPassword),所以导致 出错。如果使用了remapResults="true"这一属性,iBATIS会在每次执行查询时都执行结果集 版权所有:中科方德软件有限公司 ( NATIONAL FUNDAMENTAL SOFTWARE OF CHINA ) All Rights Reserved 12/12 映射,从而避免错误的发生(此时会有较大的开销)。 (16) dynamic标签的prepend dynamic 标签的 prepend 属性作为前缀添加到结果内容前面,当标签的结果内容为空时, prepend 属性将不起作用。 当 dynamic 标签中存在 prepend 属性时,将会把其嵌套子标签的第一个 prepend 属性忽 略。例如: userId = #userId# userName = #userName# 此例中,dynamic 标签中含有两个子标签。根据前面叙述的原则, 如果标签中没有 prepend="BOGUS" 这一假的属性来让 dynamic 去掉的话, 标签中的 and 就会被忽略,会造成 sql 语法错误。 注意:当 dynamic 标签没有 prepend 属性时,不会自动忽略其子标签的第一个 prepend 属性。
还剩11页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 15 金币 [ 分享pdf获得金币 ] 4 人已下载

下载pdf

pdf贡献者

liulibo

贡献于2010-12-11

下载需要 15 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf