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. 可展开的列表组件——ExpandableListView深入解析

    可展开的列表组件--ExpandableListView深入解析 一.知识点 1.ExpandableListView常用XML属性 2.ExpandableListView继承BaseExpanda ...

  2. Objective-C之Category的使用

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  3. IOS应用沙盒文件操作

    iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 1 ...

  4. swift网络编程入门应用:天气预报

    学习来自<小波说雨燕 第二季 网络编程(入门篇)> 工具:xcode6.4 首先在Main.storyborad中添加并设置好三个label做简单的界面显示: import UIKit / ...

  5. gradle研究

    gradle介绍:http://www.oschina.net/p/gradle gradle官网:https://gradle.org gradle的  eclipse 插件:http://www. ...

  6. XML学习总结(一)——XML介绍

    一.XML概念 Extensible Markup Language,翻译过来为可扩展标记语言.Xml技术是w3c组织发布的,目前推荐遵循的是W3C组织于2000发布的XML1.0规范. 二.学习XM ...

  7. LightSpeed使用指南

    LightSpeed 是一个最高性能的 .NET 领域建模和 O/R 映射框架,第一级别的 LINQ 支持.Visual Studio 2008/2010 设计器集成,是一个著名的高性能框架.[注:收 ...

  8. Linux下使用iostat 监视I/O状态

    我们可以使用 sar(1), pidstat(1), mpstat(1), vmstat(8) 来监控 一.安装 yum install sysstat 二.参数解释 FILES /proc/stat ...

  9. 快速解决mysql Lost connection to MySQL server at 'reading initial communication packet及can't connect to mysql server on 'localhost'

    今天在使用Navicat连一个远程mysql时,总是提示连接不成功,提示Lost connection to MySQL server at 'reading initial communicatio ...

  10. git一些常用设置

    用法:git config [选项] 配置文件位置    --global              使用全局配置文件    --system              使用系统级配置文件    -- ...