Mybatis 调用存储过程简单示例

1. Mybatis 调用存储过程简单示例

	1. Mybatis 调用存储过程简单示例

    1.1 mapper
    public List<UserDTO> getUser(Map<String,Object> map);

    1.2 mapper.xml
    <select id="getUser" parameterType="Map" statementType="CALLABLE">
        {call inc.PKG_USER.ENQ_USER(
        #{userName, mode=IN, jdbcType=VARCHAR},
        #{result, mode=OUT, jdbcType=CURSOR, javaType=ResultSet, resultMap=UserMap},
        )}
    </select>

    <resultMap type="com.java.dto.UserDTO" id="UserMap">
        <result property="userId" column="USER_ID"/>
        <result property="userName" column="USER_NAME"/>
        <result property="useAddress" column="USER_ADDRESS"/>
    </resultMap>

    1.3 存储过程
    PROCEDURE ENQ_USER(
        userName         IN VARCHAR2,
        REF_CURSOR    OUT SYS_REFCURSOR)
    BEGIN

      OPEN REF_CURSOR FOR
        select * FROM USER WHERE USER_NAME=userName;

    END ENQ_USER;

2.  存储过程游标使用

    2.1  简单使用游标插入数据
    FOR RS IN (select userName,userAge,userAddress from user1 ) 
    LOOP
     INSERT INTO user2 (userName,userAge,userAddress)
     VALUES (rs.userName,rs.userAge,rs.userAddress);
    END LOOP;

    或者
    CURSOR RS IS select userName,userAge,userAddress from user1;

    FOR RS2 IN RS 
    LOOP
     INSERT INTO user2 (userName,userAge,userAddress)
     VALUES (rs2.userName,rs2.userAge,rs2.userAddress);
    END LOOP;

3. 存储过程常用语法及函数

3.1 with as 用法

3.1 with as
with as的作用其实就是把一大堆重复用到的sql语句放在with as里面,取一个别名,后面的查询就可以用它,这样对于大批量的sql语句起到一个优化的作用,而且清楚明了。with as短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到。有的时候,是为了让SQL语句的可读性更高些,也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本太高,所以可以使用with as短语,则只要执行一遍即可。如果with as短语所定义的表名被调用两次以上,则优化器会自动将with as短语所获取的数据放入一个TEMP表里,如果只是被调用一次,则不会。而提示materialize则是强制将with as短语里的数据放入一个全局临时表里。很多查询通过这种方法都可以提高速度。

with as 用法
--针对一个别名:
with table1 as (select ....)
select...

--针对多个别名:
with
    table1 as (select ....),
    table2 as (select ....),
    table3 as (select ....) ...
select...


with as 实例
--相当于建了个e临时表
with e as (select * from scott.emp e where e.empno=7499)

select * from e;

--相当于建了e、d临时表
with
     e as (select * from scott.emp),
     d as (select * from scott.dept)
select * from e, d where e.deptno = d.deptno;


--查询user表的最大年龄及总用户数
with tepmUser as (select * from user)
select max(age),count(*) FROM tepmUser;

3.2 over(partition by ..)

3.2 高级查询之over(partition by...)
1.
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
dense_rank() over(partition by ... order by ...)
count() over(partition by ... order by ...)
max() over(partition by ... order by ...)
min() over(partition by ... order by ...)
sum() over(partition by ... order by ...)
avg() over(partition by ... order by ...)
first_value() over(partition by ... order by ...)
last_value() over(partition by ... order by ...)
lag() over(partition by ... order by ...)
lead() over(partition by ... order by ...)


2. rank()和dense_rank()的区别是:
--rank()是跳跃排序,有两个第二名时接下来就是第四名
--dense_rank()l是连续排序,有两个第二名时仍然跟着第三名


3. 今天大概弄懂了partition by和group by的区别联系。

1. group by是分组函数,partition by是分析函数(然后像sum()等是聚合函数);

2. 在执行顺序上,

以下是常用sql关键字的优先级

from > where > group by > having > order by

而partition by应用在以上关键字之后,实际上就是在执行完select之后,在所得结果集之上进行partition。

group by不允许group by以外的列出现在查询里, partition by允许所有列出现在查询里。

3.partition by相比较于group by,能够在保留全部数据的基础上,只对其中某些字段做分组排序(类似excel中的操作),而group by则只保留参与分组的字段和聚合函数的结果(类似excel中的pivot)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值