ibatis动态查询条件
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>
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 动态查询条件 下面这个配置基本上包含了最复杂的功能:分页\搜索\排序\缓存\传值Hash表\返回hash表\动态sql <statement ...
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...
- linq之InnerJoin和LeftJoin以及封装动态查询条件版本
Linq的出现,使数据集的处理显得愈来愈简便.很多时候对于本地数据集的处理,脑海中的第一反应,即尝试使用Linq来实现.诸如DataTable的innerJoin以及leftJoin等操作,很多时候我 ...
- Vue动态查询条件-Vue动态查询规则-Vue多条件分组组合查询-递归组件(一):前端
先看最终的效果: 最近项目上有一个需求,VUE前端要实现动态查询条件组件,后端就能够动态组装SQL. 要模仿人家Azure Devops的查询功能,我丢,Azure Devops是人家微软开发的个东西 ...
- jpa 动态查询条件 数组_Spring data jpa 复杂动态查询方式总结
一.Spring data jpa 简介 首先JPA是Java持久层API,由Sun公司开发, 希望整合ORM技术,实现天下归一. 诞生的缘由是为了整合第三方ORM框架,建立一种标准的方式,目前也是 ...
- java中动态查询条件,Java实现动态添加查询条件
今天遇到一个问题,就是需要根据前端页面发送的条件查询数据库记录,但是前端发送的条件是不确定的.如果使用mybatis的xml方法可以使用if标签灵活的添加判断条件,但是现在我使用的就是单纯的sql. ...
- Springboot中对jpa动态查询条件的封装
jpa对于固定参数的条件查询比较简单,可以在Repository中直接用参数名来查询.但是对于不固定的参数查询就比较麻烦了,官方提供的是继承JpaSpecificationExecutor,然后自己拼 ...
- sql不用拼接语句实现动态查询条件
DECLARE @oFrom INT SET @oFrom = 2SELECT * FROM baseinfo WHERE 1 = 1 AND ((@oFrom = 0 and Type = 'Ord ...
- 柏睿数据java_数据库动态查询最佳实现 陈氏查询
我占个位,命名为陈氏查询!一帮所谓牛人总说不是什么创新,为我的"陈氏查询"名称感到很不爽!但他们所提供的证据范例个人认为连ibatis的做法都不如,反增加了开发的麻烦! 还是开门见 ...
最新文章
- 部分小区业主抵制人脸识别:我不在家,你都清楚
- 关于对cross-browser支持的一些看法
- codevs 1779 单词的划分
- .Net Core3.0 日志 logging
- 头信息_如何在 Spring REST Controller 中获取 HTTP 头信息
- mac xampp redis php,MAC XAMPP 整合使用Redis 及 安装php redis扩展
- 【leetcode】最强边界条件
- Windows Phone 7 开发探索笔记1——触控操作之Touch
- mysql grant记录信息
- vue如何区别浏览器刷新和关闭
- 图像特征提取(颜色,纹理,形状)
- QGIS二次开发2:添加矢量、栅格图层及图层列表的实现
- node.js egg框架接入微信公总号
- 计算机网络基带和宽带,基带信号和宽带信号
- android收集备忘录恢复工具,安卓手机备忘录删除了怎么恢复?仅有一种方法可以恢复!...
- Charles设置代理后无法上网问题
- (转)量子位:这个AI股神把顶级对冲基金吓尿了
- Powershell下载文件的三种方法
- 1.权限认证java.lang.IllegalArgumentException: Cannot pass a null GrantedAuthority collection
- Linux: errno: 11 EAGAIN +Resource temporarily unavailable
热门文章
- C++lowest common ancestor最近公共祖先算法(附完整源码)
- Linux 内核的同步方式
- php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解_PHP教程
- Quartz + spring 定时任务常见错误总结
- Mysql数据唯一约束与唯一索引案例总结及踩坑记(含NULL值与唯一约束唯一索引的搭配使用)
- 打开高效文本编辑之门_调用Linux的sed命令
- Python 中各种imread函数的区别与联系
- 安装Windows digits问题列表
- NC119-最小的k个数
- 面试官:聊一下你对MySQL索引实现原理?