ibatis动态查询条件
来源:互联网 发布:淘宝网男装毛衫 编辑:程序博客网 时间:2024/04/30 16:12
ibatis的调试相对困难,出错的时候主要依据是log4生成的log文件和出错提示,这方面要能比较熟练的看懂.
下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql
如果对下面这段配置能信手粘来的话,那开发速度将会大大的提升.
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd"><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 rowFROM[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>
iBATIS的select 标签 #于 $区别------模糊查询
在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动态查询条件
- ibatis动态查询条件
- ibatis动态查询条件
- iBatis动态条件查询
- IBatis 动态查询条件
- ibatis动态查询条件
- ibatis动态查询条件
- ibatis动态查询条件
- ibatis动态查询条件
- iBatis动态条件查询
- ibatis条件查询(动态查询)
- iBatis动态条件查询 where的if条件不执行
- ibatis多条件查询
- ibatis多条件查询
- ibatis 条件查询
- ibatis动态数组条件
- ibatis 的多条件查询
- 如何进行ibatis动态多条件组合查询以及模糊查询
- 梁静茹罗琦同天产子
- 递归(一)
- 从Unicode到UTF-8的编码
- 再识MinGW和MSYS(二)
- C column of Pointer <2>
- ibatis动态查询条件
- Objective-C ,ios,iphone开发基础:JSON解析(使用苹果官方提供的JSON库:NSJSONSerialization)
- GEM5简介
- 回车与换行的区别
- 权力游戏“紫婚”毁誉参半 童话镇入佳境
- SPOJ 220 . Relevant Phrases of Annihilation(后缀数组)
- HttpURLConnection和HttpClient获取Json数据
- UVA The Mad Numerologist
- TI DSP库VLIB介绍