`

ibats 16种常用语法

 
阅读更多
ibatis常用16条SQL语句

博客分类: 框架-持久化专栏

(1) 输入参数为单个值
Xml代码  收藏代码
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore"  
parameterClass="long">  
delete from  
MemberAccessLog  
where  
accessTimestamp = #value#  
</delete>  

(2) 输入参数为一个对象

Xml代码  收藏代码
<insert id="com.fashionfree.stat.accesslog.MemberAccessLog.insert"  
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#  
)  
</insert>  

(3) 输入参数为一个java.util.HashMap
Xml代码  收藏代码
<select id="com.fashionfree.stat.accesslog.selectActionIdAndActionNumber"  
parameterClass="hashMap"  
resultMap="getActionIdAndActionNumber">  
select  
actionId, count(*) as count  
from  
MemberAccessLog  
where  
memberId = #memberId#  
and accessTimestamp &gt; #start#  
and accessTimestamp &lt;= #end#  
group by actionId  
</select> 

  (4) 输入参数中含有数组
  
Xml代码  收藏代码
<insert id="updateStatusBatch" parameterClass="hashMap">  
update  
Question  
set  
status = #status#  
<dynamic prepend="where questionId in">  
<isNotNull property="actionIds">  
<iterate property="actionIds" open="(" close=")" conjunction=",">  
#actionIds[]#  
</iterate>  
</isNotNull>  
</dynamic>  
</insert>  
   说明:actionIds为传入的数组的名字;
   使用dynamic标签避免数组为空时导致sql语句语法出错;
   使用isNotNull标签避免数组为null时ibatis解析出错

   (5)传递参数只含有一个数组
 
Xml代码  收藏代码
<select id="com.fashionfree.stat.accesslog.model.StatMemberAction.selectActionIdsOfModule"  
resultClass="hashMap">  
select  
moduleId, actionId  
from  
StatMemberAction  
<dynamic prepend="where moduleId in">  
<iterate open="(" close=")" conjunction=",">  
#[]#  
</iterate>  
</dynamic>  
order by  
moduleId  
</select>  
    说明:注意select的标签中没有parameterClass一项
       另:这里也可以把数组放进一个hashMap中,但增加额外开销,不建议使用

   (6)让ibatis把参数直接解析成字符串
 
Xml代码  收藏代码
<select id="com.fashionfree.stat.accesslog.selectSumDistinctCountOfAccessMemberNum"  
parameterClass="hashMap" resultClass="int">  
select  
count(distinct memberId)  
from  
MemberAccessLog  
where  
accessTimestamp &gt;= #start#  
and accessTimestamp &lt; #end#  
and actionId in $actionIdString$  
</select> 
    说明:使用这种方法存在sql注入的风险,不推荐使用

    (7)分页查询 (pagedQuery)
  
Java代码  收藏代码
<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy"  
parameterClass="hashMap" resultMap="MemberAccessLogMap">  
<include refid="selectAllSql"/>  
<include refid="whereSql"/>  
<include refid="pageSql"/>  
</select>  
<select id="com.fashionfree.stat.accesslog.selectMemberAccessLogBy.Count"  
parameterClass="hashMap" resultClass="int">  
<include refid="countSql"/>  
<include refid="whereSql"/>  
</select>  
<sql id="selectAllSql">  
select  
accessLogId, memberId, clientIP,  
httpMethod, actionId, requestURL,  
accessTimestamp, extend1, extend2,  
extend3  
from  
MemberAccessLog  
</sql>  
<sql id="whereSql">  
accessTimestamp &lt;= #accessTimestamp#  
</sql>  
<sql id="countSql">  
select  
count(*)  
from  
MemberAccessLog  
</sql>  
<sql id="pageSql">  
<dynamic>  
<isNotNull property="startIndex">  
<isNotNull property="pageSize">  
limit #startIndex# , #pageSize#  
</isNotNull>  
</isNotNull>  
</dynamic>  
</sql>  
   说明:本例中,代码应为:
   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. 将大于号、小于号写为: &gt; &lt; 如:
Xml代码  收藏代码
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long">  
delete from  
MemberAccessLog  
where  
accessTimestamp &lt;= #value#  
</delete>  

    2. 将特殊字符放在xml的CDATA区内:
Xml代码  收藏代码
<delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long">  
<![CDATA[ 
delete from 
MemberAccessLog 
where 
accessTimestamp <= #value# 
]]>  
</delete>  
   推荐使用第一种方式,写为&lt; 和 &gt; (XML不对CDATA里的内容进行解析,因此如果CDATA中含有dynamic标签,将不起作用)
(9)include和sql标签
   将常用的sql语句整理在一起,便于共用:
Xml代码  收藏代码
<sql id="selectBasicSql">  
select  
samplingTimestamp,onlineNum,year,  
month,week,day,hour  
from  
OnlineMemberNum  
</sql>  
<sql id="whereSqlBefore">  
where samplingTimestamp &lt;= #samplingTimestamp#  
</sql>  
<select id="com.fashionfree.accesslog.selectOnlineMemberNumsBeforeSamplingTimestamp" parameterClass="hashmap" resultClass="OnlineMemberNum">  
<include refid="selectBasicSql" />  
<include refid="whereSqlBefore" />  
</select>  
    注意:sql标签只能用于被引用,不能当作mapped statement。如上例中有名为selectBasicSql的sql元素,试图使用其作为sql语句执行是错误的:
    sqlMapClient.queryForList(“selectBasicSql”); ×
(10)随机选取记录
Xml代码  收藏代码
<sql id=”randomSql”>  
ORDER BY rand() LIMIT #number#  
</sql>  
    从数据库中随机选取number条记录(只适用于MySQL)

(11)将SQL GROUP BY分组中的字段拼接
Xml代码  收藏代码
<sql id=”selectGroupBy>  
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> 
    注:SQL中使用了MySQL的GROUP_CONCAT函数
(12) 按照IN里面的顺序进行排序
    ①MySQL:
Xml代码  收藏代码
<sql id=”groupByInArea”>  
select  
moduleId, moduleName,  
status, lastModifierId, lastModifiedName,  
lastModified  
from  
StatModule  
where  
moduleId in (3, 5, 1)  
order by  
instr(',3,5,1,' , ','+ltrim(moduleId)+',')  
</sql>  
   
②SQLSERVER:
Xml代码  收藏代码
<sql id=”groupByInArea”>  
select  
moduleId, moduleName,  
status, lastModifierId, lastModifiedName,  
lastModified  
from  
StatModule  
where  
moduleId in (3, 5, 1)  
order by  
charindex(','+ltrim(moduleId)+',' , ',3,5,1,')  
</sql> 
    说明:查询结果将按照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 class="java.util.HashMap" id="getActionIdAndActionNumber">  
<result column="actionId" property="actionId" jdbcType="BIGINT" javaType="long"/>  
<result column="count" property="count" jdbcType="INT" javaType="int"/>  
</resultMap>  
   使用resultMap称为显式结果映射,与之对应的是resultClass(内联结果映射),使用resultClass的最大好处便是简单、方便,不需显示指定结果,由iBATIS根据反射来确定自行决定。而resultMap则可以通过指定jdbcType和javaType,提供更严格的配置认证。

(14) typeAlias
Xml代码  收藏代码
<typeAlias alias="MemberOnlineDuration" type="com.fashionfree.stat.accesslog.model.MemberOnlineDuration" />  
<typeAlias>允许你定义别名,避免重复输入过长的名字。 

(15) remap
Xml代码  收藏代码
<select id="testForRemap" parameterClass="hashMap" resultClass="hashMap" remapResults="true">  
select  
userId  
<isEqual property="tag" compareValue="1">  
, userName  
</isEqual>  
<isEqual property="tag" compareValue="2">  
, userPassword  
</isEqual>  
from  
UserInfo  
</select>  
  此例中,根据参数tag值的不同,会获得不同的结果集,如果没有remapResults="true"属性,iBatis会将第一次查询时的结果集缓存,下次再执行时(必须还是该进程中)不会再执行结果集映射,而是会使用缓存的结果集。
因此,如果上面的例子中remapResult为默认的false属性,而有一段程序这样书写:
Java代码  收藏代码
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();  
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属性忽略。例如:
Xml代码  收藏代码
<sql id="whereSql">  
<dynamic prepend="where ">  
<isNotNull property="userId" prepend="BOGUS">  
userId = #userId#  
</isNotNull>  
<isNotEmpty property="userName" prepend="and ">  
userName = #userName#  
</isNotEmpty>  
</dynamic>  
</sql> 
 
此例中,dynamic标签中含有两个子标签<isNotNull>和<isNotEmpty>。根据前面叙述的原则,如果<isNotNull>标签中没有prepend="BOGUS" 这一假的属性来让dynamic去掉的话,<isNotEmpty>标签中的and就会被忽略,会造成sql语法错误。
   注意:当dynamic标签没有prepend属性时,不会自动忽略其子标签的第一个prepend属性。
分享到:
评论

相关推荐

    iBatis资料 语法

    本资料包包含了关于iBatis语法和常用方法的全面介绍,帮助开发者深入理解并熟练运用iBatis进行数据库操作。 首先,`iBatis 2.3.4 api.chm`是iBatis 2.3.4版本的API参考手册,包含了所有类和接口的详细说明,是学习...

    ibatis常用sql语句

    同时,为了避免数组为空或为null时引发的SQL语法错误,iBATIS还提供了`&lt;isNotNull&gt;`和`&lt;dynamic&gt;`标签进行条件判断,确保了代码的健壮性和安全性。 ### 传递参数只含有一个数组 最后,当参数只包含一个数组时,...

    ibatis开发过程取值问题

    在这个过程中,Ibatis提供了一种动态SQL机制,通过占位符来实现参数绑定和动态条件生成。 在描述中提到的“##”是Ibatis中的一个特殊占位符,它的主要功能是在拼接SQL字符串时处理参数。与常用的“#{}”占位符不同...

    ibatis的动态查询

    **知识点1:** 在进行模糊查询时,ibatis支持两种不同的语法标记:`#` 和 `$`。 1. **使用 `$value$` 进行模糊查询:** - 在进行模糊查询时,使用 `$value$` 的方式更为安全且易于实现。 - 正确的语法应为 `name ...

    ibatis文档

    DAO (Data Access Object) 是一种常用的设计模式,用于将数据访问逻辑封装在一个对象中。在 iBATIS 中,DAO 模式被广泛应用于数据访问层的实现中。DAO 对象通常包含了一系列的数据访问方法,这些方法用于执行如查询...

    mysql,jdbc详解,与ibatis对比。批量查询,分页处理。

    - **更简单**: iBatis的配置相对简单,只需了解基本的SQL语法和XML配置即可。 - **灵活性高**: 开发者可以直接编写SQL语句,提供了更高的灵活性。 ##### 2. 对比分析 - **iBatis**: 半自动化持久层框架,更适合需要...

    ibatis API及示例

    6. **API使用**:解释SqlSession和Mapper接口的常用方法,如selectList、selectOne、insert、update和delete。 7. **事务管理**:Ibatis的事务控制,包括手动和自动提交、回滚。 8. **缓存机制**:Ibatis的一级和...

    struts,ibatis框架

    2. **SQL语言支持**:MySQL支持标准的SQL语法,包括DDL(数据定义语言)、DML(数据操作语言)、DCL(数据控制语言)和TCL(事务控制语言)。 3. **性能优化**:MySQL提供索引、分区、缓存等机制来优化查询性能。 ...

    freemarker+struts2+ibatis入门学习摘要

    这些是Java Web开发中常用的技术,它们分别负责视图层、控制层和数据访问层的功能。FreeMarker是一个模板引擎,用于动态生成HTML或其他类型的文档;Struts2是一个MVC框架,负责处理HTTP请求并管理应用流程;iBatis则...

    ibatis 动态代理dtd

    这里的“动态代理DTD”特指在ibatis中用于描述动态SQL语法结构的DTD文件。 #### 描述详解 描述中的DTD片段定义了`dynamic`元素,该元素允许在SQL映射文件中创建动态SQL块。具体解析如下: ```xml &lt;!ELEMENT dynamic...

    java相关常用的的帮助文档

    Java是一种广泛使用的面向对象的编程语言,以其跨平台、高性能和丰富的类库而备受开发者喜爱。在Java的世界里,有多种帮助文档可以帮助开发者更好地理解和使用Java技术。以下是一些核心的Java相关知识点: 1. **...

    java开发相关帮助手册

    本资源集合包含了Java开发过程中常用工具和框架的详细教程,旨在为开发者提供全方位的参考资料。主要包括以下几个方面: 1. **PowerDesigner**:这是一款强大的数据库设计和模型建模工具,可以帮助开发者高效地进行...

    java代码书籍.rar

    书中可能涵盖了如单例、工厂、观察者、装饰器、适配器等23种经典设计模式,这些模式可以帮助开发者编写出更灵活、可维护和可扩展的代码。 2. **java学习笔记下.pdf**:这可能是份详细的Java学习笔记,涵盖了中级到...

    中文 深入浅出Hibernate

    本书有丰富的附录部,在附录中讲述了Hibernate常用的映射配置,Hibernate工具、XDoclet模板配置以及Hibernate的益友iBatis用法,还以卡片的形式列出了本书中所用的工具及软件,附录最后一部分是“快速启动代码”,供...

    深入浅出Hibernate

    本书有丰富的附录部,在附录中讲述了Hibernate常用的映射配置,Hibernate工具、XDoclet模板配置以及Hibernate的益友iBatis用法,还以卡片的形式列出了本书中所用的工具及软件,附录最后一部分是“快速启动代码”,供...

    \深入浅出Hibernate

    本书有丰富的附录部,在附录中讲述了Hibernate常用的映射配置,Hibernate工具、XDoclet模板配置以及Hibernate的益友iBatis用法,还以卡片的形式列出了本书中所用的工具及软件,附录最后一部分是“快速启动代码”,供...

    web开发之即将成为程序员的你需要什么技能.docx

    熟悉J2EE环境,特别是SSH框架(Struts、Spring、Hibernate)是必要的,同时也推荐了解Spring MVC和iBATIS等其他框架。API的理解和使用是Java开发的核心,而数据库操作(如增删改查)是日常工作中不可或缺的部分。...

    Basic编译快手

    Basic语言,全称Beginner's All-purpose Symbolic Instruction Code,是一种高级编程语言,最初是为了教育目的而设计的,其语法简洁明了,易于学习,适合初学者入门。 ### Basic语言基础 Basic语言的基本结构包括...

Global site tag (gtag.js) - Google Analytics