IBATIS+ORACLE(一)
迁移时间:2017年6月1日15:55:17
Author:Marydon
(四)IBATIS + ORACLE
第一部分:基础篇
1.4.1.1 分页SQL
<!-- 开头 -->
<isNotNull prepend="" property="end">
SELECT * FROM (
</isNotNull>
<!-- 结尾 -->
<isNotNull prepend="" property="end">
<![CDATA[ WHERE ROWNUM<=#END#) WHERE ROWINDEX>=#START# ]]>
</isNotNull>
1.4.1.2 $column$
执行sql语句时,控制台输出的语句,在该位置不会以问号的形式出现,而是直接填充其对应的值
1.4.1.3 日期类比较大小
<isNotEmpty prepend="and" property="BEGINDATE">
<![CDATA[
T.SCHEDULE_DATE >= TO_DATE(#BEGINDATE#,'yyyy-MM-dd')
]]>
</isNotEmpty>
<isNotEmpty prepend="and" property="ENDDATE">
<![CDATA[
T.SCHEDULE_DATE <= TO_DATE(#ENDDATE#,'yyyy-MM-dd')
]]>
</isNotEmpty>
1.4.1.4 从Oracle服务器获取当前系统日期
<select id="getSYSDATE" resultClass="java.lang.String">
SELECT TO_CHAR(SYSDATE,'yyyy-MM-dd hh24:mm:ss') AS SYSTEMDATE FROM DUAL
</select>
dao层配置
/**
* 获取Oracle服务器时间
* @return 系统当前时间
*/
public String getSYSDATE() throws DaoException {
try {
return (String)sqlMapClient.queryForObject("telemedicine.service.bo.remoteCons.schedule.getSYSDATE");
} catch (SQLException e) {
String err = "查询系统当前时间出错->出错原因:" + e.getMessage();
log.error(err, e);
throw new DaoException(err, e);
}
}
1.4.1.5 增加
方式一:主键使用序列生成
<insert id="insertTSORGDIAITEM" parameterClass="map">
<selectKey resultClass="java.math.BigDecimal" keyProperty="FID" >
SELECT STSORGDIAITEM.NEXTVAL AS FID FROM DUAL
</selectKey>
INSERT INTO TSORGDIAITEM(FID,
FORGID,
FITEMCODE,
FITEMTYPE,
FCURCODE,
FCENCODE,
FITEMNAME,
FZJM,
FITEMSPEC,
FUNIT,
FPRICE)
VALUES(#FID :NUMERIC#,
#FORGID :NUMERIC#,
UPPER(#FITEMCODE :VARCHAR#),
#FITEMTYPE :NUMERIC#,
#FCURCODE :VARCHAR#,
#FCENCODE :VARCHAR#,
UPPER(#FITEMNAME :VARCHAR#),
UPPER(#FZJM :VARCHAR#),
#FITEMSPEC :VARCHAR#,
#FUNIT :VARCHAR#,
#FPRICE :NUMERIC#)
</insert>
方式二:主键采用sys_guid()生成
<insert id="insertCONSULT_DEPENT_DOCTOR_INFO" parameterClass="map">
<selectKey keyProperty="id" resultClass="java.lang.String">
select sys_guid() as id from dual
</selectKey>
INSERT INTO CONSULT_DEPENT_DOCTOR_INFO(DEPENT_DOCTOR_INFO_ID,CONSULT_APPLY_ID,CONSULT_DEPENT_ID,CONSULT_DEPENT,CONSULT_DOCTOR_ID,CONSULT_DOCTOR,DOCTOR_PHONE)
VALUES(#id#,#CONSULT_APPLY_ID#,#CONSULT_DEPENT_ID#,#CONSULT_DEPENT#,#CONSULT_DOCTOR_ID#,#CONSULT_DOCTOR#,#DOCTOR_PHONE#)
</insert>
注意:
a.selectKey标签的keyProperty属性:查询出来的结果会被放到这个字段里面;必须指明返回的数据类型:resultClass;select ... 别名 from dual 别名可以任意取;
b.执行插入语句后,默认返回的是主键。
<!-- 通用查询条件 -->
<sql id="DIRECTORY_ERROR_WHERE">
<dynamic prepend=""> <!-- 或prepend="and" -->
<isNotEmpty prepend="and" property="FORGID">
T.FORGID = #FORGID#
</isNotEmpty>
<isNotEmpty prepend="and" property="FICDCODE">
(UPPER(T.FICDCODE) LIKE UPPER(#FICDCODE# || '%') OR T.FICDCODE LIKE #FICDCODE# || '%')
</isNotEmpty>
<isEqual prepend="and" property="FERRORSTATUS" compareValue="0">
T.FCENCODE IS NULL
</isEqual>
<isEqual prepend="and" property="FERRORSTATUS" compareValue="1">
T.FITEMNAME !=T1.FITEMNAME
</isEqual>
<isNotEmpty prepend="and" property="FRCODE">
T.FRCODE = '$FRCODE$'
</isNotEmpty>
</dynamic>
</sql>
1.4.1.7 更新
<update id="updateTSORGDIAITEM" parameterClass="map">
UPDATE TSORGDIAITEM SET
FID=#FID:NUMERIC#,
FORGID=#FORGID:NUMERIC#,
FITEMCODE=#FITEMCODE:VARCHAR#,
FITEMTYPE=#FITEMTYPE:NUMERIC#,
FCURCODE=#FCURCODE:VARCHAR#,
FCENCODE=#FCENCODE:VARCHAR#,
FITEMNAME=#FITEMNAME:VARCHAR#,
FZJM=#FZJM:VARCHAR#,
FITEMSPEC=#FITEMSPEC:VARCHAR#,
WHERE FID =#FID#
</update>
方式二
<update id="updateCONSULT_SCHEDULE" parameterClass="map">
UPDATE CONSULT_SCHEDULE SET
ORG_CODE = #ORG_CODE#,
DEPENT_ID = #DEPENT_ID#,
DEPENT_NAME = #DEPENT_NAME#,
DOCTOR_ID = #DOCTOR_ID#,
DOCTOR_NAME = #DOCTOR_NAME#,
DOCTOR_PHONE = #DOCTOR_PHONE#,
SCHEDULE_DATE = TO_DATE(#SCHEDULE_DATE#,'YYYY-MM-DD'),
WEEK_TXT = #WEEK_TXT#,
WB_TYPE = #WB_TYPE#,
CLOSE_TZ = #CLOSE_TZ#,
REPLACE_TZ = #REPLACE_TZ#,
DOCTOR_ID_TZ = #DOCTOR_ID_TZ#,
DOCTOR_NAME_TZ = #DOCTOR_NAME_TZ#,
REMARK = #REMARK#
WHERE CONSULT_SCHEDULE_ID = #CONSULT_SCHEDULE_ID#
</update>
<update id="updateTDOCTORORGDynamic" parameterClass="map">
UPDATE TDOCTORORG
<dynamic prepend="SET">
<isNotNull prepend="," property="FDOCTORCODE">
FDOCTORCODE = #FDOCTORCODE#
</isNotNull>
<isNotNull prepend="," property="FDOCTORCODE_CENTER">
FDOCTORCODE_CENTER = #FDOCTORCODE_CENTER#
</isNotNull>
<isNotNull prepend="," property="FDOCTORNAME">
FDOCTORNAME = #FDOCTORNAME#
</isNotNull>
<isNotNull prepend="," property="FZJM">
FZJM = #FZJM#
</isNotNull>
<isNotNull prepend="," property="FDEPTCODE">
FDEPTCODE = #FDEPTCODE#
</isNotNull>
<isNotNull prepend="," property="FDOCTORPHONE">
FDOCTORPHONE = #FDOCTORPHONE#
</isNotNull>
<isNotNull prepend="," property="FJOBTITLE">
FJOBTITLE = #FJOBTITLE#
</isNotNull>
<isNotNull prepend="," property="FREMARK">
FREMARK = #FREMARK#
</isNotNull>
</dynamic>
WHERE
FID = #FID#
</update>
这种动态修改字段的方式需要注意的是:要修改的字段是否允许为空,如果允许用isNotNull;不允许用isNotEmpty
<!-- 方法一 -->
<delete id="delTDICTICDCODE" parameterClass="map">
DELETE FROM TDICTICDCODE
<dynamic prepend="WHERE">
<isNotEmpty prepend="and" property="FICDCODE">
FICDCODE=#FICDCODE#
</isNotEmpty>
<isNotEmpty prepend="and" property="FICDNAME">
FICDNAME=#FICDNAME#
</isNotEmpty>
<isNotEmpty prepend="and" property="FZJM">
FZJM=#FZJM#
<isNotEmpty prepend="and" property="FCLASSID">
FCLASSID=#FCLASSID#
</isNotEmpty>
</dynamic>
</delete>
方式二
<!-- 方法二 -->
<delete id="delTSORGDIAITEM" parameterClass="map">
DELETE FROM TSORGDIAITEM T WHERE 1=1
<include refid="TSORGDIAITEM_WHERE"/>
</delete>
1.4.1.9 计数
<!-- 查询总数 -->
<select id="getTSORGDIAITEMCount" parameterClass="map" resultClass="java.lang.Integer" cacheModel="cacheTSORGDIAITEM">
SELECT COUNT(1) FROM TSORGDIAITEM T,
(SELECT FITEMCODE,FITEMNAME,FITEMTYPE,FSTATUS FROM TDICTCHARGEITEM TT1
WHERE TT1.FRCODE = substr(#FRCODE#,0,2)||'0000'
AND NOT EXISTS (SELECT T.FITEMCODE FROM TDICTCHARGEITEM T
WHERE (T.FRCODE = #FRCODE# OR T.FRCODE = substr(#FRCODE#,0,4)||'00')
AND T.FITEMCODE = TT1.FITEMCODE)
UNION
SELECT FITEMCODE,FITEMNAME,FITEMTYPE,FSTATUS FROM TDICTCHARGEITEM TT3 WHERE TT3.FRCODE =#FRCODE#
) T1
WHERE UPPER(T.FCENCODE)=upper(T1.FITEMCODE(+))
<isEqual prepend="AND" property="Xm_isdzlx" compareValue="1">
T.FITEMTYPE = T1.FITEMTYPE(+)
</isEqual>
<include refid="TSORGDIAITEM_WHERE"/>
</select>
1.4.1.10 分页查询
<!-- 分页查询 -->
<select id="getTSORGDIAITEM" parameterClass="map" remapResults="true" resultClass="java.util.HashMap" cacheModel="cacheTSORGDIAITEM">
<isNotNull prepend="" property="END">
SELECT F.* FROM (
</isNotNull>
SELECT E.*,ROWNUM ROWNO,
(SELECT T2.FCLASSNAME FROM TDICTDIAITEMTYPE T2 WHERE T2.FCLASSCODE = E.FPLVCODE AND T2.FTYPE = E.FITEMTYPE) AS FCLASSNAME,
(SELECT T4.FFEENAME FROM TSORGFEECLASS T4
WHERE T4.FFEECODE = E.FFEETYPE AND T4.FORGID = E.FORGID AND T4.FRCODE = E.FRCODE
) AS FFEENAME
<isNotEmpty property="FORGLEVEL">
<!--村级 是否可报-->
<isEqual property="FORGLEVEL" compareValue="1" prepend=",">
decode(nvl(E.FVILLLEVELLIMIT,0),'1','是','否') as LEVELLIMIT
</isEqual>
<!--乡镇级是否可报 -->
<isEqual property="FORGLEVEL" compareValue="2" prepend=",">
decode(nvl(E.FTOWNLEVELLIMIT,0),'1','是','否') as LEVELLIMIT
</isEqual>
<!--县级是否可报 -->
<isEqual property="FORGLEVEL" compareValue="3" prepend=",">
decode(nvl(E.FCOUNLEVELLIMIT,0),'1','是','否') as LEVELLIMIT
</isEqual>
<!--市级是否可报 -->
<isEqual property="FORGLEVEL" compareValue="4" prepend=",">
decode(nvl(E.FPROVLEVELLIMIT,0),'1','是','否') as LEVELLIMIT
</isEqual>
<!--省级是否可报 -->
<isEqual property="FORGLEVEL" compareValue="5" prepend=",">
decode(nvl(E.FPROVLEVELLIMIT,0),'1','是','否') as LEVELLIMIT
</isEqual>
</isNotEmpty>
FROM (
SELECT T.FID,T.FORGID,T.FITEMCODE,T.FITEMTYPE,decode(T.FITEMTYPE,'1','诊疗项目','药品项目') FITEMTYPENAME,
T.FCURCODE, T.FCENCODE,T.FCENCODE_TEM,T.FITEMNAME,T.FZJM,T.FITEMSPEC,T.FUNIT,
T.FPRICE,T.FFEETYPE,T.FPLVCODE,T.FHISCODE,T.FSTATUS,
(CASE WHEN T.FFORMS IS NULL OR UPPER(T.FFORMS)='NULL' THEN '' ELSE T.FFORMS END) FFORMS,
(CASE WHEN T1.FFORMS IS NULL OR UPPER(T1.FFORMS) = 'NULL' THEN '' ELSE T1.FFORMS END) FFORMS_TDICT,
T.FRCODE,LENGTH(T.FITEMNAME) AS FITEMNAMELENGTH,
T1.FVILLLEVELLIMIT,T1.FTOWNLEVELLIMIT,T1.FCOUNLEVELLIMIT,T1.FPROVLEVELLIMIT,
T1.FITEMNAME AS FCENNAME,T1.FCOMPUTERATIO,
T.FAUDITER,TO_CHAR(T.FAUDDATE,'YYYY-MM-DD') FAUDDATE,
T1.FDRUGTYPE,
(select fdictname from tdictcode where ftypeid(+)='45' and fdictcode(+)=T1.FDRUGTYPE) AS FDRUGTYPENAME
FROM TSORGDIAITEM T,
(SELECT FITEMCODE,FITEMNAME,FITEMTYPE,FCOMPUTERATIO,FCOUNLEVELLIMIT,FTOWNLEVELLIMIT,
FVILLLEVELLIMIT,FPROVLEVELLIMIT,FFORMS,FSTATUS,FDRUGTYPE
FROM TDICTCHARGEITEM TT1
WHERE TT1.FRCODE = substr(#FRCODE#,0,2)||'0000'
AND NOT EXISTS (SELECT T.FITEMCODE FROM TDICTCHARGEITEM T
WHERE (T.FRCODE = #FRCODE# OR T.FRCODE = substr(#FRCODE#,0,4)||'00')
AND T.FITEMCODE = TT1.FITEMCODE)
UNION
SELECT FITEMCODE,FITEMNAME,FITEMTYPE,FCOMPUTERATIO,FCOUNLEVELLIMIT,FTOWNLEVELLIMIT,
FVILLLEVELLIMIT,FPROVLEVELLIMIT,FFORMS,FSTATUS,FDRUGTYPE
FROM TDICTCHARGEITEM TT3 WHERE TT3.FRCODE =#FRCODE#
) T1
WHERE UPPER(T.FCENCODE)=UPPER(T1.FITEMCODE(+))
<isEqual prepend="AND" property="Xm_isdzlx" compareValue="1">
T.FITEMTYPE = T1.FITEMTYPE(+)
</isEqual>
<include refid="TSORGDIAITEM_WHERE"/>
ORDER BY FITEMNAMELENGTH,T.FITEMCODE
) E
<isNotNull prepend="" property="END">
<![CDATA[ WHERE rownum <=#END# ) F WHERE F.ROWNO >=#START#]]>
</isNotNull>
</select>
注意:
a.增,删,改这3个操作无需指明返回的数据类型,执行SQL语句,会默认返回影响行数:Integer;
b.如果将Map作为查询的返回数据类型,必须指定resultClass="java.util.HashMap"。
IBATIS+ORACLE(一)的更多相关文章
- IBATIS + ORACLE(二)
迁移时间:2017年6月1日16:09:02 Author:Marydon (四)IBATIS + ORACLE UpdateTime--2017年5月31日10:49:34 第二部分:提升篇 1 ...
- oracle+ibatis 批量插入-支持序列自增
首先请先看我前面一篇帖子了解oracle批量插入的sql:[oracle 批量插入-支持序列自增] 我用的ibatis2.0,sqlMap文件引入的标签如下: <!DOCTYPE sqlMap ...
- oracle 批量插入-支持序列自增
1.创建表.序列 -- Create table create table test_batch ( id number not null, name ), account ) ) -- Create ...
- 浅谈一下SSI+Oracle框架的整合搭建
浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...
- ibatis 调用存储过程
ibatis 调用存储过程 CreationTime--2018年8月15日19点38分 Author:Marydon 1.返回系统游标集合 第一步:返回值,将返回值封装到HashMap中 < ...
- MAVEN整理(乘国庆还有时间,停下来整理一下)
昨天写下了这篇博客(http://www.cnblogs.com/hzmark/p/131003Release.html),今天有时间,就这里一下第一篇内容. 换工作公司开发平台: WINDOWS+V ...
- EXCEPTION-IBATIS
CreateTime--2016年8月23日08:44:03Author:Marydonibatis的sqlMap的xml文件配置出现的异常信息及解决方案 声明:异常类文章主要是记录了我遇到的异常 ...
- 复选框input:checkbox
复选框 CreateTime--2017年6月5日14:04:55Author:Marydon 五.复选框 (一)语法 <input type="checkbox" /& ...
- IBatis.Net项目数据库SqlServer迁移至Oracle经验
最近完成了一个(IBatis.Net+MVC)项目的数据库+代码迁移工作,可把我折腾得~~~ IBatis.Net是一个ORM框架,具体介绍可以问度娘.我之前没用ORM框架使用经验,所以这一路我不是走 ...
随机推荐
- Linux含交互的自动登录脚本
近来经常要通过ssh登录服务器,每次输入命令和密码很麻烦,查资料发现有两种解决,一种是本地创建密钥直接登录,另一种是写个脚本. 这里介绍第二种方法,第一种资料也很多,但是觉得没啥意思. 先上脚本: # ...
- Spring的安全机制
Spring Security:它提供全面的安全性解决方案,同时在Web请求和方法调用处理身份确认和授权,利用依赖注入和aop技术.主要名词: 1,安全拦截器:相当应用的一把锁,能够阻止对应用程序中保 ...
- [BZOJ4710][JSOI2011]分特产(组合数+容斥原理)
4710: [Jsoi2011]分特产 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 395 Solved: 262[Submit][Status] ...
- 【计算几何】【二分】【随机增量法】hdu6167 Missile Interception
n个半径为R的圆是否有公共部分,等价于询问是否存在一个半径小于R的圆,能覆盖所有n个圆的圆心. 对这n个点求最小圆覆盖即可.从网上扒了个随机增量法的代码. 这样算上二分,复杂度就是nlogn了. #i ...
- 【最小生成树】【kruscal】【贪心】CDOJ1636 梦后楼台高锁,酒醒帘幕低垂
首先,考虑到,我们需要找到一条路径,使它的最小边尽量大,最大边尽量小 然后,考虑到m比较小,我们可以去寻找一个m^2或者m^2logm的算法 考虑枚举最小边,那么我们就需要在m或者mlogm的时间内找 ...
- [HihoCoder1259]A Math Problem
题目大意: 有一个函数f(n),满足3f(n)*f(2n+1)=f(2n)*(1+3f(n)),f(2n)<6f(n). 我们用g(t)表示f(i)%k=t的i的个数,其中1<=i< ...
- Problem A: 自定义函数strcomp(),实现两个字符串的比较
#include<stdio.h> int strcmp(char *str1,char *str2) { if(str1!=NULL&&str2!=NULL) { whi ...
- [转]Android的ADT与SDK的区别
adt只是一个eclipse的插件,里面可以设置sdk路径 SDK(Software Development Kit): 一般是一些被软件工程师用于为特定的软件包.软件框架.硬件平台.操作 ...
- 关于applicationContext.xml cannot be opened because it does not exist的解决
初学Spring在用Resource rs=new ClassPathResource("applicationContext.xml");时老是遇到这个错误.后来发现用 Appl ...
- WPF中的动画——(四)缓动函数
缓动函数可以通过一系列公式模拟一些物理效果,如实地弹跳或其行为如同在弹簧上一样.它们一般应用在From/To/By动画上,可以使得其动画更加平滑. var widthAnimation = new D ...