• ibatis常用sql


    https://www.cnblogs.com/huiy/p/6000676.html

    1.输入参数为单个值

    复制代码
    <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore"    
     parameterClass="long">    
     delete from    
     MemberAccessLog    
     where    
     accessTimestamp = #value#    
     </delete>   
    
     <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore"   
     parameterClass="long">   
     delete from   
     MemberAccessLog   
     where   
     accessTimestamp = #value#   
     </delete>
    复制代码

    2.输入参数为一个对象

    复制代码
    <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>   
    
     <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

    复制代码
    <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>
    复制代码
    复制代码
    <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.输入参数中含有数组

    复制代码
    <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>   
    
     <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.传递参数只含有一个数组

    复制代码
    <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 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把参数直接解析成字符串

    复制代码
    <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>  
    
     <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)

    复制代码
    <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>
    
     <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; 如:

    复制代码
    <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long">    
     delete from    
     MemberAccessLog    
     where    
     accessTimestamp &lt;= #value#    
     </delete>   
     Xml代码  
     <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long">   
     delete from   
     MemberAccessLog   
     where   
     accessTimestamp &lt;= #value#   
     </delete>   
    
        将特殊字符放在xml的CDATA区内:
    
     <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" parameterClass="long">    
     <![CDATA[   
     delete from   
     MemberAccessLog   
     where   
     accessTimestamp <= #value#   
     ]]>    
     </delete>   
    
     <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语句整理在一起,便于共用:

    复制代码
    <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 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.随机选取记录

    <sql id=”randomSql”>   
     ORDER BY rand() LIMIT #number#   
     </sql>
    从数据库中随机选取number条记录(只适用于MySQL)

    11.将SQL GROUP BY分组中的字段拼接

    复制代码
    <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 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:
    
     <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>   
    
     <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:
    
     <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>  
    
     <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的属性值

    复制代码
    <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>   
     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

    <typeAlias alias="MemberOnlineDuration" type="com.fashionfree.stat.accesslog.model.MemberOnlineDuration" />    
     <typeAlias>
    
    允许你定义别名,避免重复输入过长的名字

    15.remap

    复制代码
    <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>   
    
     <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属性,而有一段程序这样书写:
    
     HashMap<String, Integer> hashMap = new HashMap<String, Integer>();    
     hashMap.put("tag", 1);    
     sqlClient.queryForList("testForRemap", hashMap);    
     hashMap.put("tag", 2);    
     sqlClient.queryForList("testForRemap", hashMap);   
     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属性忽略。例如:
    
     <sql id="whereSql">    
     <dynamic prepend="where ">    
     <isNotNull property="userId" prepend="BOGUS">    
     userId = #userId#    
     </isNotNull>    
     <isNotEmpty property="userName" prepend="and ">    
     userName = #userName#    
     </isNotEmpty>    
     </dynamic>    
     </sql>  
    
     <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属性。
  • 相关阅读:
    利用游标循环插入数据
    局部临时表
    表值函数
    SQL2000自动备份压缩删除数据库
    insert select、select into 的用法
    判断每个页面是否登以及捕捉页面异常录解决方案
    合并查询结果
    字符串分隔(转自别处)
    生成行号
    C#计算字符串中子串出现次数的另类方法
  • 原文地址:https://www.cnblogs.com/qqyong123/p/8473863.html
Copyright © 2020-2023  润新知