ibatis的调试相对困难,出错的时候主要依据是log4生成的log文件和出错提示,这方面要能比较熟练的看懂.

下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql

如果对下面这段配置能信手粘来的话,那开发速度将会大大的提升.

<statement id="XinxiTable_SelectAll" listClass="ArrayList" 
               resultMap="SimpleXinxi" parameterClass="Hashtable" cacheModel="xinxi-cache" >
      SELECT
        <dynamic prepend="top">
          <isNotEqual prepend="top" property="TopNum" compareValue = "0">
            $TopNum$
          </isNotEqual>
        </dynamic>
      *
      FROM
      (select a.[iXinxiID],a.[sXinxiTitle],a.[iXinxiClassId],b.[sClassName],
      a.[dXinxiDate],a.[dXinxiYxq],a.[iXinxiHits],a.[sXinxiUser],a.[sRedirectUrl],
      ROW_NUMBER() OVER(
      <dynamic prepend="order by">
      <isEqual prepend="order by" property="Sort" compareValue = "0">
        a.iXinxiID desc
      </isEqual>
      <isEqual prepend="order by" property="Sort" compareValue = "1">
        a.iXinxiID asc
      </isEqual>
      <isEqual prepend="order by" property="Sort" compareValue = "2">
        a.iXinxiHits desc
      </isEqual>
      <isEqual prepend="order by" property="Sort" compareValue = "3">
        a.iXinxiHits asc
      </isEqual>
    </dynamic>
      ) as row
      FROM
      [dbo].[XinxiTable] as a,[dbo].[XinxiClass] as b
      <dynamic prepend="where">
        <isParameterPresent>
          <isNotEmpty prepend="and" property="XinxiType" >
            a.[iXinxiState]= $XinxiType$
          </isNotEmpty>
          <isNotEqual prepend="and" property="XinxiClass" compareValue = "0">
            a.[iXinxiClassID]= $XinxiClass$
          </isNotEqual>
          <isEqual prepend="and" property="SearchType" compareValue = "1">
            a.[sXinxiTitle] LIKE '%$Keyword$%'
          </isEqual>
          <isEqual prepend="and" property="SearchType" compareValue = "2">
            (a.[sXinxiTitle] LIKE '%$Keyword$%' or a.[sXinxiContent] LIKE '%$Keyword$%')
          </isEqual>
        </isParameterPresent>
      </dynamic>
      and a.iXinxiClassId=b.iClassId
      )a
      <dynamic prepend="where">
        <isParameterPresent>
          <isEqual prepend="and" property="IsPage" compareValue = "1">
            row between $PageLower$ and $PageUpper$
          </isEqual>
        </isParameterPresent>
      </dynamic>
    </statement>

ibatis动态查询条件:

<select id="SelectEemployee" parameterClass="string" resultMap = "employee-result">

select * from employee

//动态SQL语句

<dynamic prepend="WHERE">

<isParameterPresent>

emp_id = #value#

</isParameterPresent>

</dynamic>

</select>

</statements>

</sqlMap>

/*

动态SQL的写法:

开始 <dynamic

条件成立时前面要加的字符串 prepend ="字符串">

<属性关键字  (见下表)

prepend="字符串"

判断条件的对象属性名 property="字符串"

如果是属性关键字是比较条件时,字符串存放要比较的值compareValue="字符串">

要显示的条件名

</属性关键字>

结束</dynamic>

*/

/*

动态SQL的参数有

属性关键字

含义

<isEqual>

如果参数相等于值则查询条件有效。

<isNotEqual>

如果参数不等于值则查询条件有效。

<isGreaterThan>

如果参数大于值则查询条件有效。

<isGreaterEqual>

如果参数等于值则查询条件有效。

<isLessEqual>

如果参数小于值则查询条件有效。如下所示:

<isLessEqual prepend = ”AND” property = ”age” compareValue = ”18” >

ADOLESCENT = ‘TRUE’

</isLessEqual>

<isPropertyAvailable>

如果参数有使用则查询条件有效。

<isNotPropertyAvailable>

如果参数没有使用则查询条件有效。

<isNull>

如果参数为NULL则查询条件有效。

<isNotNull>

如果参数不为NULL则查询条件有效。

<isEmpty>

如果参数为空则查询条件有效。

<isNotEmpty>

如果参数不为空则查询条件有效。参数的数据类型为Collection、String 时参数不为NULL或“”。如下所示:

<isNotEmpty prepend=”AND” property=”firstName” >

FIRST_NAME=#firstName#

</isNotEmpty>

<isParameterPresent>

如果参数类不为NULL则查询条件有效。

<isNotParameterPresent>

Checks to see if the parameter object is not present (null). Example Usage:

<isNotParameterPresent prepend=”AND”>

EMPLOYEE_TYPE = ‘DEFAULT’

</isNotParameterPresent>

ibatis如何出入动态传入指定表和指定列查询对应数据?

ibatis 的配置如下:

<select id="selectDataOfTable" resultClass="java.util.Hashtable" parameterClass="java.util.Map">

<![CDATA[

SELECT $column$ FROM $tableName$

]]>

</select>

当传出:tableName: CC_RPT_DF01

column   :

TO_CHAR(MONTH_CODE,'yyyy-MM-dd hh:mi:ss') MONTH_CODE,decode(BUSINESS_PLACE_CODE,NULL,'',BUSINESS_PLACE_CODE)BUSINESS_PLACE_CODE,decode(PRICE_ID,NULL,'',PRICE_ID)PRICE_ID,decode(TRADE_CODE,NULL,'',TRADE_CODE)TRADE_CODE,decode(INTERVAL,NULL,'',INTERVAL)INTERVAL,decode(TOTAL_POWER,NULL,0,TOTAL_POWER)TOTAL_POWER,decode(TOTAL_POWER_YG,NULL,0,TOTAL_POWER_YG)TOTAL_POWER_YG,decode(TOTAL_POWER_WG,NULL,0,TOTAL_POWER_WG)TOTAL_POWER_WG,decode(FAVOR_POWER,NULL,0,FAVOR_POWER)FAVOR_POWER,decode(ADD_POWER,NULL,0,ADD_POWER)ADD_POWER,decode(TOTAL_FEE,NULL,0,TOTAL_FEE)TOTAL_FEE,decode(CONTENT_FEE,NULL,0,CONTENT_FEE)CONTENT_FEE,decode(CAPA,NULL,0,CAPA)CAPA,decode(CAPA_FEE,NULL,0,CAPA_FEE)CAPA_FEE,decode(NEED,NULL,0,NEED)NEED,decode(NEED_FEE,NULL,0,NEED_FEE)NEED_FEE,decode(BASE_FEE,NULL,0,BASE_FEE)BASE_FEE,decode(COS_ADD_FEE,NULL,0,COS_ADD_FEE)COS_ADD_FEE,decode(COS_REDUCE_FEE,NULL,0,COS_REDUCE_FEE)COS_REDUCE_FEE,decode(FAVOR_FEE,NULL,0,FAVOR_FEE)FAVOR_FEE,decode(ADD_FEE,NULL,0,ADD_FEE)ADD_FEE,decode(SANXIA_FEE,NULL,0,SANXIA_FEE)SANXIA_FEE,decode(CHENGSHI_FEE,NULL,0,CHENGSHI_FEE)CHENGSHI_FEE,decode(PROVINCE_FEE,NULL,0,PROVINCE_FEE)PROVINCE_FEE,decode(STATE_FEE,NULL,0,STATE_FEE)STATE_FEE,decode(NONGWANG_FEE,NULL,0,NONGWANG_FEE)NONGWANG_FEE,decode(ENERGY_FEE,NULL,0,ENERGY_FEE)ENERGY_FEE,decode(OTHER_FEE,NULL,0,OTHER_FEE)OTHER_FEE,decode(USER_COUNT,NULL,0,USER_COUNT)USER_COUNT

能查出CC_RPT_DF01 表对应 列  的数据 。

当第二次传入  tableName:CC_RPT_DF11

column   :

TO_CHAR(MONTH_CODE,'yyyy-MM-dd hh:mi:ss') MONTH_CODE,decode(BUSINESS_PLACE_CODE,NULL,'',BUSINESS_PLACE_CODE)BUSINESS_PLACE_CODE,decode(VOLTAGE_LEVEL,NULL,'',VOLTAGE_LEVEL)VOLTAGE_LEVEL,decode(SALE_ID,NULL,'',SALE_ID)SALE_ID,decode(USER_NUM,NULL,0,USER_NUM)USER_NUM,decode(SUM_CAPA,NULL,0,SUM_CAPA)SUM_CAPA

Check the selectDataOfTable-AutoResultMap.

--- Check the result mapping for the 'PRICE_ID' property.

--- Cause: java.sql.SQLException: 列名无效; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException:

--- The error occurred in com/szp/eai/dataobject/Common.xml.

--- The error occurred while applying a result map.

第二次传入的列名和数据库表中一致。

我感觉好像 SELECT $column$ FROM $tableName$ 这中语句,ibatis记住了第一次出入的列,第二次传入的新列没有用。

要实现这中功能,ibatis该如何做?

答案:

这个问题是因为你查询的sql的列是变化的,但是ibatis默认的会缓存RS中的meta信息,如果你第一次查询的列和第二次查询的列不一样的话,那么第二次ibatis还会以第一次查询的列为key从RS里面获取数据,但是你的列是变化的,所以第二次取数据的时候,RS里面已经没有了你第一次的那个列了,所以会出错。 幸好ibatis 可以设置来改变这种缓存引起的问题,就是这个remapResults=true

<select id="" parameterClass="" resultClass="" remapResults="true">

</select>

iBATISselect 标签 # $区别------模糊查询

在IbatiS的select中有两个占位符 # 和 $

我们先看一个 一个查询语句:

select * from user where Name = #userName#;

我们用#这个占位符可以查询到 我们想要的结果,可是当我们需要模糊查询的时候该怎么办呢?

select * from user where Name = ‘%#userName#%’(错误的写法);如果我们这样写,程序在编译的时候会报错,因为 # 这个占位符前面还有别的 符号,#这个占位符是不允许这样写的,这个时候我们就可以用 $ 这个占位符:

select * from user where Name = ‘%$userName$%’(正确的模糊查询写法),这样写编译器不会报错,也能得到我们想要的结果。

归根结底的原因就是 # 占位符会把我们的SQL 语句翻译成

select * from user where Name = ? 这样的语句,然后在填充参数。

$ 占位符会把我们的SQL语句 翻译成

select * from user where Name = '想要查询的东西' 这个样标准的SQL语句

ibatis动态查询条件的更多相关文章

  1. 浅析Entity Framework Core2.0的日志记录与动态查询条件

    前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...

  2. ibatis动态多条件查询及模糊查询(oracle,mysql,sql)

    首先是模糊查询的问题,开始时我使用如下条件:select * from user where name like '%#value#%'. 可是怎么也不行,好像还报错了.后来在网上找到了解决方法,就是 ...

  3. ibatis动态查询

    在复杂查询过程中,我们常常需要根据用户的选择决定查询条件,这里发生变化的并不只是SQL 中的参数,包括Select 语句中所包括的字段和限定条件,都可能发生变化.典型情况,如在一个复杂的组合查询页面, ...

  4. ibatis 动态查询

    http://www.iteye.com/topic/393042最近做了很多动态的查询,尤其是排序,以及一些状态字段,所以就做了一个总的动态查询,以不变应万变,呵呵 ibatis 里面的sql代码: ...

  5. sql不用拼接语句实现动态查询条件

    DECLARE @oFrom INT SELECT * FROM baseinfo AND ( ( and Type = 'Breakfast') ) or的条件可自由添加,尤其适用互斥条件的查询.

  6. spring data jpa 动态查询(工具类封装)

    利用JPA的Specification<T>接口和元模型就实现动态查询了.但是这样每一个需要动态查询的地方都需要写一个这样类似的findByConditions方法,小型项目还好,大型项目 ...

  7. (转)QueryBuilder : 打造优雅的Linq To SQL动态查询

    原文地址:http://www.cnblogs.com/coolcode/archive/2009/09/28/IQueryBuilder.html 首先我们来看看日常比较典型的一种查询Form 这个 ...

  8. JDBC实现动态查询

    一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语 ...

  9. flask_sqlalchemy获取动态 model名称 和 动态查询

    需求 想要实现动态的查询,表名,字段,字段值都不是固定的 obj=表名.query.filter_by(字段=值1).first() obj.字段=值2 首先动态获取db_model名字(即Role) ...

随机推荐

  1. 初识 TextKit

    iOS 7 的发布给开发者的案头带来了很多新工具.其中一个就是 TextKit.TextKit 由许多新的 UIKit 类组成,顾名思义,这些类就是用来处理文本的.在这里,我们将介绍 TextKit ...

  2. 在Dynamics CRM 2015中通过3CX插件(以及3CX windows phone)拨出电话

    背景 在On-premises部署的Dynamics CRM中实现通过网页拨通客户电话的功能 要点 3CX 提供了开箱即用的Dynamics CRM Solution,只需要在Microsoft Dy ...

  3. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  4. Linux Shell 05 位置变量(命令行参数)

    在Linux shell 脚本中可能会用到一些命令行参数,常见如下: $0:脚本名称 $#:执行脚本时传入的参数个数,不包括脚本名称 $@:所有参数 $*:所有参数 $1...$9:第1个参数.... ...

  5. ajaxFileUpload文件上传

    一.简介 ajaxFileUpload是一种异步的文件上传控件,通过ajax进行文件上传,并获取上传处理结果.在很多时候我们需要使用到文件上传的功能,但是不需要使用那些强大的上传插件.此时就可以使用a ...

  6. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

  7. 04_最长上升子序列问题(LIS)

    来源:刘汝佳<算法竞赛入门经典--训练指南> P60 问题6: 问题描述:给定n个整数a1,a2,...,an,按从左到右的顺序选出尽量多的整数,组成一个上升子序列(子序列可以理解为:删除 ...

  8. android去掉顶部标题栏

    在清单文件(manifest.xml)里面实现 <application> <activity android:name="cn.ui.activity.UserRegAc ...

  9. Xamarin.Android splash页面瞬间响应_避免APP启动闪白屏

    Application和Activity中的onCreate都进行了优化,基本没有耗时操作,但是启动应用之后还是会闪现一下白色背景,然后才进入Splash页面,对比了一下QQ.微信.微博等客户端,点击 ...

  10. redis 五种数据结构详解(string,list,set,zset,hash)

    redis 五种数据结构详解(string,list,set,zset,hash) Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存 ...