ibatis mysql iterate_iBatis习惯用的16条SQL语句

iBatis 简介:

iBatis 是apache 的一个开源项目,一个O/R Mapping 解决方案,iBatis 最大的特点就是小巧,上手很快。如果不需要太多复杂的功能,iBatis 是能够满足你的要求又足够灵活的最简单的解决方案,现在的iBatis 已经改名为Mybatis 了。

1.输入参数为单个值

parameterClass="long">

delete from

MemberAccessLog

where

accessTimestamp = #value#

parameterClass="long">

delete from

MemberAccessLog

where

accessTimestamp = #value#

2.输入参数为一个对象

parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog>

insert into MemberAccessLog

(

accessLogId, memberId, clientIP,

httpMethod, actionId, requestURL,

accessTimestamp, extend1, extend2,

extend3

)

values

(

#accessLogId#, #memberId#,

#clientIP#, #httpMethod#,

#actionId#, #requestURL#,

#accessTimestamp#, #extend1#,

#extend2#, #extend3#

)

parameterClass="com.fashionfree.stat.accesslog.model.MemberAccessLog>

insert into MemberAccessLog

(

accessLogId, memberId, clientIP,

httpMethod, actionId, requestURL,

accessTimestamp, extend1, extend2,

extend3

)

values

(

#accessLogId#, #memberId#,

#clientIP#, #httpMethod#,

#actionId#, #requestURL#,

#accessTimestamp#, #extend1#,

#extend2#, #extend3#

)

3.输入参数为一个java.util.HashMap

parameterClass="hashMap"

resultMap="getActionIdAndActionNumber">

select

actionId, count(*) as count

from

MemberAccessLog

where

memberId = #memberId#

and accessTimestamp > #start#

and accessTimestamp <= #end#

group by actionId

parameterClass="hashMap"

resultMap="getActionIdAndActionNumber">

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[]#

update

Question

set

status = #status#

#actionIds[]#

说明:actionIds为传入的数组的名字; 使用dynamic标签避免数组为空时导致sql语句语法出错; 使用isNotNull标签避免数组为null时ibatis解析出错

5.传递参数只含有一个数组

resultClass="hashMap">

select

moduleId, actionId

from

StatMemberAction

#[]#

order by

moduleId

resultClass="hashMap">

select

moduleId, actionId

from

StatMemberAction

#[]#

order by

moduleId

说明:注意select的标签中没有parameterClass一项

另:这里也可以把数组放进一个hashMap中,但增加额外开销,不建议使用

6.让ibatis把参数直接解析成字符串

parameterClass="hashMap" resultClass="int">

select

count(distinct memberId)

from

MemberAccessLog

where

accessTimestamp >= #start#

and accessTimestamp < #end#

and actionId in $actionIdString$

parameterClass="hashMap" resultClass="int">

select

count(distinct memberId)

from

MemberAccessLog

where

accessTimestamp >= #start#

and accessTimestamp < #end#

and actionId in $actionIdString$

说明:使用这种方法存在sql注入的风险,不推荐使用

7.分页查询 (pagedQuery)

parameterClass="hashMap" resultMap="MemberAccessLogMap">

parameterClass="hashMap" resultClass="int">

select

accessLogId, memberId, clientIP,

httpMethod, actionId, requestURL,

accessTimestamp, extend1, extend2,

extend3

from

MemberAccessLog

accessTimestamp <= #accessTimestamp#

select

count(*)

from

MemberAccessLog

limit #startIndex# , #pageSize#

parameterClass="hashMap" resultMap="MemberAccessLogMap">

parameterClass="hashMap" resultClass="int">

select

accessLogId, memberId, clientIP,

httpMethod, actionId, requestURL,

accessTimestamp, extend1, extend2,

extend3

from

MemberAccessLog

accessTimestamp <= #accessTimestamp#

select

count(*)

from

MemberAccessLog

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#

Xml代码

delete from

MemberAccessLog

where

accessTimestamp <= #value#

将特殊字符放在xml的CDATA区内:

delete from

MemberAccessLog

where

accessTimestamp <= #value#

]]>

delete from

MemberAccessLog

where

accessTimestamp <= #value#

]]>

推荐使用第一种方式,写为< 和 > (XML不对CDATA里的内容进行解析,因此如果CDATA中含有dynamic标签,将不起作用)

9.include和sql标签 将常用的sql语句整理在一起,便于共用:

select

samplingTimestamp,onlineNum,year,

month,week,day,hour

from

OnlineMemberNum

where samplingTimestamp <= #samplingTimestamp#

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)

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

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)+',')

select

moduleId, moduleName,

status, lastModifierId, lastModifiedName,

lastModified

from

StatModule

where

moduleId in (3, 5, 1)

order by

instr(',3,5,1,' , ','+ltrim(moduleId)+',')

②SQLSERVER:

select

moduleId, moduleName,

status, lastModifierId, lastModifiedName,

lastModified

from

StatModule

where

moduleId in (3, 5, 1)

order by

charindex(','+ltrim(moduleId)+',' , ',3,5,1,')

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的属性值

Xml代码

使用resultMap称为显式结果映射,与之对应的是resultClass(内联结果映射),使用resultClass的最大好处便是简单、方便,不需显示指定结果,由iBATIS根据反射来确定自行决定。而resultMap则可以通过指定jdbcType和javaType,提供更严格的配置认证。

14.typeAlias

允许你定义别名,避免重复输入过长的名字

15.remap

select

userId

, userName

, userPassword

from

UserInfo

select

userId

, userName

, userPassword

from

UserInfo

此例中,根据参数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);

Java代码

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会在每次执行查询时都执行结果集映射,从而避免错误的发生(此时会有较大的开销)。

16.dynamic标签的prepend dynamic标签的prepend属性作为前缀添加到结果内容前面,当标签的结果内容为空时,prepend属性将不起作用。

当dynamic标签中存在prepend属性时,将会把其嵌套子标签的第一个prepend属性忽略。例如:

userId = #userId#

userName = #userName#

userId = #userId#

userName = #userName#

此例中,dynamic标签中含有两个子标签和。根据前面叙述的原则,如果标签中没有prepend="BOGUS" 这一假的属性来让dynamic去掉的话,标签中的and就会被忽略,会造成sql语法错误。

注意:当dynamic标签没有prepend属性时,不会自动忽略其子标签的第一个prepend属性。

以上所述是小编给大家介绍的iBatis习惯用的16条SQL语句,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值