这是题目的实体类

privateInteger id;private Integer type;//题型 单选,多选

private String category;//类型 数据字典配置

private String problem;//问题

private String choose1;//选择1

privateString choose2;privateString choose3;privateString choose4;privateString choose5;privateString choose6;privateString choose7;privateString choose8;private String answer;//答案

卷子的实体类

privateInteger id;privateString title;private String problemNo;//题目,逗号分割

private Integer extract;//抽题个数

需求:已经录入若干提,其中每题的类型不完全相同,例如有的题目是语文,有的是数学之类的。

抽取其中若干题,必然是小于录入题的,必须保证每种类型的题都被抽取到,且希望能根据不同类型的题目均匀抽取;

例如录入40题,抽取10题。

假如语文,数学,物理,化学各是16,12,8,4。那么抽取语文,数学,物理,化学应当各是4,3,2,1道题。

假如语文,数学,物理,化学各是19,19,1,1。那么抽取语文,数学,物理,化学应当各是4,4,1,1道题。

作出最优解。

表结构:

CREATE TABLE`tb_multi_question_problem` (

`id`int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',

`type`tinyint(4) DEFAULT NULL COMMENT '题型',

`category`varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '类型',

`problem`varchar(512) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '问题',

`choose1`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择1',

`choose2`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择2',

`choose3`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择3',

`choose4`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择4',

`choose5`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择5',

`choose6`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择6',

`choose7`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择7',

`choose8`varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '选择8',

`answer`varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

`update_time`datetime DEFAULT NULL COMMENT '更新时间',

`create_time`datetime DEFAULT NULL COMMENT '创建时间',

`update_user`varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

`create_user`varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,

`del_flag`char(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE`tb_multi_questionnaire` (

`id`int(10) NOT NULLAUTO_INCREMENT,

`title`varchar(128) DEFAULT NULL,

`description`text,

`imgurl`varchar(128) DEFAULT NULL,

`problem_no`varchar(512) DEFAULT NULL,

`parent_area`varchar(32) DEFAULT NULL,

`area`varchar(32) DEFAULT NULL,

`committee`varchar(32) DEFAULT NULL,

`start_time`datetime DEFAULT NULL,

`end_time`datetime DEFAULT NULL,

`duration`int(10) DEFAULT NULL COMMENT '时长',

`number` tinyint(4) DEFAULT NULL,

`extract`tinyint(4) DEFAULT NULL,

`url1`varchar(256) DEFAULT NULL,

`url2`varchar(256) DEFAULT NULL,

`url3`varchar(256) DEFAULT NULL,

`update_time`datetime DEFAULT NULL COMMENT '更新时间',

`create_time`datetime DEFAULT NULL COMMENT '创建时间',

`update_user`varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,

`create_user`varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,

`del_flag`char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0',PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8;

解决方案,因为涉及到类型,且类型未均匀分布。避免多次访问数据库,使用存储过程;

CREATE DEFINER=`root`@`localhost` PROCEDURE `rand_question`(in pid int, out idstr VARCHAR(128))begin

declare pno VARCHAR(128);declare qp VARCHAR(32);DECLARE ques_ext int DEFAULT 1;DECLARE ques_sum int DEFAULT 0;DECLARE qpid VARCHAR(32);DECLARE qpCategory VARCHAR(32) CHARACTER SETutf8mb4 COLLATE utf8mb4_unicode_ci;DECLARE qpSum INT(10);DECLARE q_sum INT(10) DEFAULT 0;DECLARE rem INT(10) DEFAULT 0;DECLARE lim INT(10) DEFAULT 0;declare done int default -1;DECLARE qp_cursor CURSOR FOR SELECT qp.category,COUNT(1) FROM tb_multi_question_problem qp WHERE del_flag = '0' and FIND_IN_SET(qp.id,(SELECT q.problem_no FROM tb_multi_questionnaire q WHERE del_flag = '0' and q.id = pid)) GROUP BYqp.category;DECLARE CONTINUE HANDLER FOR NOT found SET done = 1;SELECT q.problem_no INTO pno FROM tb_multi_questionnaire q WHERE del_flag = '0' and q.id =pid;SELECT q.extract into ques_ext FROM tb_multi_questionnaire q WHERE del_flag = '0' and q.id =pid;SELECT COUNT(1) into ques_sum FROM tb_multi_question_problem qp WHERE del_flag = '0' and FIND_IN_SET(qp.id,(SELECT q.problem_no FROM tb_multi_questionnaire q WHERE del_flag = '0' and q.id =pid));set idstr = '';OPENqp_cursor;

qpLoop : LOOPFETCH qp_cursor INTOqpCategory,qpSum;IF done = 1 THENLEAVE qpLoop;END IF;set rem = floor(qpSum*ques_ext/ques_sum);IF rem < 1 THEN

SET rem = 1;END IF;SELECT group_concat(id) INTO qpid FROM (SELECT id FROM tb_multi_question_problem WHERE del_flag = '0' and category = qpCategory and FIND_IN_SET(id,pno) and id >= (SELECT FLOOR(RAND()*(SELECT MAX(id) FROM tb_multi_question_problem WHERE del_flag = '0' and category = qpCategory))) order by rand() LIMIT rem) asa;set idstr = CONCAT(idstr,qpid,',');ENDLOOP qpLoop;CLOSEqp_cursor;select length(idstr)-length(replace(idstr,',','')) INTOq_sum;WHILE q_sum = (SELECT FLOOR(RAND()*(SELECT MAX(id) FROM tb_multi_question_problem WHERE del_flag = '0'))) order by rand() LIMIT lim) as a WHEREFIND_IN_SET(a.id,pno);set idstr = CONCAT(idstr,qpid,',');select length(idstr)-length(replace(idstr,',','')) INTOq_sum;END WHILE;end

得到所得的值有两种方法,第一种:

使用map传递接受参数

mapper.xml

{

call rand_question(

#{id,jdbcType=INTEGER,mode=IN},

#{idstr, jdbcType=VARCHAR,mode=OUT})

}

service

public List randomList(Mapparam) {

questionProblemDao.randomList(param);return questionProblemDao.getListByIds((String)param.get("idstr"));

}

如上,通过param传参,也通过param接受参数;

第二种通过javabean,有时间再补充

mybatis获取mysql存储过程out参数的值_mybatis接受mysql存储过程out的值相关推荐

  1. mysql的映射文件调用函数_MyBatis中调用存储过程和函数

    一.调用存储过程 1.首先在数据库中定义存储过程,定义的存储过程的代码如下: //定义存储过程 create or replace procedure pag_add(p1 varchar2,p2 v ...

  2. MYSQL学习与数据库综合实验(八)——存储过程实验

    8.存储过程实验 8.1存储过程定义 存储过程是一组为了完成特定功能的 SQL 语句集合.使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后 ...

  3. 什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么?

    什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么? 存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名 ...

  4. mybatis 取查询值_Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    这样就可以在insert函数中获取新添加的用户的 id主键,否则获取不到 select * from student where id = #{id} insert into student(name ...

  5. mysql存储过程返回多个值_数据库mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法.分享给大家供大家参考,具体如下: mysql存储函数只返回一个值.要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程.咱们先来 ...

  6. mysql 创建带参数的存储过程_在MySQL中创建带有IN和OUT参数的存储过程的方法

    在 MySQL 中创建储存过程的语法很难记,除非你经常跟储存过程打交道,原因很简单,语法不是什么小笑话.如果你通过命令行控制 MySQL,你需要记住准确的语法.一个快速示例可以很好的帮助你做到这点.在 ...

  7. mysql存储过参数拼接_mysql 存储过程动态拼接sql并执行赋值

    CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50)) BEGIN ## 定义变量 DECLARE _num FL ...

  8. mysql存储过程之参数(IN,OUT或INOUT)了解下

        在现实应用中,开发的存储过程几乎都需要参数,就是这些参数,使得存储过程更加灵活和有用. 在mysql中,参数有三种模式:IN,OUT或INOUT: IN - 是默认模式.在存储过程中定义IN参 ...

  9. mysql的存储过程的参数_MySQL 存储过程参数

    MySQL  存储过程参数 MySQL存储过程参数简介 在现实应用中,开发的存储过程几乎都需要参数.这些参数使存储过程更加灵活和有用. 在MySQL中,参数有三种模式:IN,OUT或INOUT. IN ...

最新文章

  1. 规范化的递归转换成非递归
  2. sql group by having用法_神奇的 SQL 为什么 GROUP BY 之后不能直接引用原表中的列?...
  3. 写屏障是什么_面试官为什么问内存模型总离不开final关键字,该如何应对?
  4. 关于opencv读取摄像头的未解之谜
  5. Direct3D9 Fx/HLSL的若干条有用的笔记
  6. 6.5(对三个数进行排序)
  7. php 中的全局变量的理解
  8. java 解析csv_使用Java Scanner类解析CSV文件
  9. CGLIB动态代理--实例/原理
  10. 软件项目活动图 关键路径
  11. 计算机视觉算法面试题面经
  12. 3389、135、137、138、139、445等端口解释和关闭方法
  13. 美国波士顿大学计算机专业排名,2017年波士顿大学各专业最新排名榜单 美国名校排名!...
  14. ETR获取转速及PID调节原则
  15. loading遮不住dialog
  16. 浅析装备制造业的项目管理智能化
  17. vnc却显示 failed to connect:操作成功完成。(0)
  18. 虚拟同步发电机_一种基于下垂控制和增加虚拟阻抗的逆变器并联仿真实现
  19. 蒋晓海:Testin云测,如何让应用更有价值
  20. GICv3软件overview手册之GICv3基本功能(1)

热门文章

  1. AOP 在Spring 中的应用
  2. 策略模式Strategy Pattern应用场景
  3. Nacos注册中心介绍
  4. RedisRDB持久化机制
  5. 数组的定义格式三_省略的静态初始化
  6. SpringBoot_配置-@PropertySource、@ImportResource、@Bean
  7. java中ArrayList和LinkedList的区别
  8. android 模拟 cdrom,stm32 usb 虚拟一个cdrom
  9. 最像windows10的linux,Linuxfx:外观神似Win10的Linux操作系统
  10. python如何读入dat数据_python二进制dat数据怎么转成txt文本