mybatis注解方式调用mysql存储过程

创建存储过程

需求:
随机返回某一数据表中枚举类型的属性的某一个值给后台。
具体来说,假设数据库中有一个表名为’test’的数据表,其中有一属性名为major的属性,这一属性为枚举类型{计算机技术,计算机科学与技术},希望能够随机返回其中的某一个值。数据表名以及属性名均为变量,需要动态传参。

具体存储过程的sql语句

delimiter //
drop procedure IF EXISTS solve_enum;
create procedure solve_enum (IN tablename VARCHAR (25) , IN attriname VARCHAR (25) ,OUT value VARCHAR (25)) 
begin
    set @count := CONCAT("select count(*) into @c from (select DISTINCT ", attriname, " from ", tablename, " ) a");
    PREPARE stmt1 from @count;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    set @count1 := floor(rand()* @c );
    set @sql := CONCAT("select * into @value from (select DISTINCT " ,attriname, " from ", tablename, ") a order by ",attriname, " limit ?,1"); 
     prepare stmt from @sql; 
     execute stmt using @count1; 
     DEALLOCATE PREPARE stmt;
     select @value as value;
end;
//

可以在命令行中测试一下

CALL solve_enum ('test','major',@value);//

在这里插入图片描述

spring boot+mybatis

Mapper代码

/**
     * 注解形式调用存储过程
     * @param map
     */
    @Select("call solve_enum(#{map.tablename,mode=IN,jdbcType=VARCHAR},#{map.attriname,mode=IN,jdbcType=VARCHAR},#{map.value,mode=OUT,jdbcType=VARCHAR})")
    @Options(statementType=StatementType.CALLABLE)
    HashMap solve_enum(@Param("map")Map map);

Service代码

    @Transactional
    public HashMap solve_enum(@Param("map")Map map) {
         HashMap re = this.maskDynamicDao.solve_enum(map);
         return re;
    }

Controller代码

 String value = "";
 HashMap<String, String> map = new HashMap();
 map.put("tablename", "test");
 map.put("attriname", "major");
 map.put("value", value);
 value = String.valueOf(Service.solve_enum(map).get("value"));
 System.out.println(value);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值