mybatis+spring 中自动实现mapper接口调用存储过程

来源:互联网 发布:知乎恐怖手机游戏 编辑:程序博客网 时间:2024/05/01 01:15

public interface SeqMapper {public Map<String,Integer> getTopicSeq(Map<String,Integer> map);}

public interface SeqMapper {public Map<String,Integer> getTopicSeq();}

mybatis+spring+springmvc越来越受到企业开发者青睐。最近对mybatis+spring进行了一些初步的学习。我们知道在spring配置文件里面配置好org.mybatis.spring.mapper.MapperScannerConfigurer即可采用自动扫描的方式让系统找到我们写好的mapper接口,并由系统将其实现。这一点确实是比较方便的,省去了我们很多时间。但是今天在使用mybatis调用数据库存储过程遇到了问题,因为之前没有在xml的配置文件里面使用过存储过程,所有悲剧就发生了。先看看异常:

There is no getter for property named 'seq01' in 'class java.lang.Class'.

下面是xml配置文件

<parameterMap type="com.tot.entity.MysqlSeq" id="seqMap"><parameter property="seq01"  jdbcType="INTEGER" mode="OUT"/></parameterMap>
<select id="getTopicSeq" parameterMap="seqMap" statementType="CALLABLE" >{call get_topic_seq(?)};</select>

java代码:接口:

public interface SeqMapper {public Map<String,Integer> getTopicSeq();}

java代码:测试:

public static void main(String[] args) {String conf = "applicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(conf);//查数据SeqMapper sq = ac.getBean("seqMapper", SeqMapper.class);//获取bean,系统帮我们将接口实现,并创建好了这个bean,实现接口归功于mybatisMap sqMap = sq.getTopicSeq();System.out.pringln(sqMap);}

一下是问题发生的经过:

为什么写这段代码呢?我的想法是调用存储过程和调用一般的语句肯定是一样的,就按照之前的流程写了这段代码。结果就悲剧的发生了上述异常,上网查了很久也没有找到问题的所在。于是我开始了苦逼的调试过程,我一遍又一遍的该我的配置文件,将parameterMap都改坏了都没有结果,而且更为气人的是,无论我怎么改paramerterMap中的type报的结果 都一样,我在想mybaits为什么会去找java.lang.Class中的方法呢?我下载了mybaits的源代码看了一下,大概的知道了是因为mybaits框架中的中的Reflector.java类中 的type属性没有设置正确,也就是没有获取到xml文件中的值,type自动默认为java.lang.Class.由于Class类里面没有xml的parameterMap中声明的属性,因此报错。于是我就想考虑到了是不是接口没有传参的问题,因为我存储过程中是通过参数将值传入或者传入的,也就是我们声明的in,out,inout3中类型。于是我将接口添加上参数,经过测试,问题终于解决了。现在想起来主要是对数据库的存储过程理解不够深入。


总结上面的问题:

主要是因为写的mapper接口方法中没有传参数,而调用存储过程有必须要参数,无论我们声明的是in,out,还是inout。

下面是正确的代码:

xml代码:

<parameterMap type="map" id="seqMap"><parameter property="seq01"  jdbcType="INTEGER" mode="OUT"/></parameterMap><select id="getTopicSeq" parameterMap="seqMap" statementType="CALLABLE" >{call get_topic_seq(?)};</select>
java代码:Mapper接口

public interface SeqMapper {public Map<String,Integer> getTopicSeq(Map<String,Integer> map);}

java代码:测试

public static void main(String[] args) {String conf = "applicationContext.xml";ApplicationContext ac = new ClassPathXmlApplicationContext(conf);//查数据SeqMapper sq = ac.getBean("seqMapper", SeqMapper.class);Map map  = new HashMap();Map sqMap = sq.getTopicSeq(map);System.out.println(map);}


控制台有结果了哈哈啊哈。

附:

存储过程:

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_topic_seq`( out topic_seq int)BEGINselect seq into topic_seq from topic_seq;update  topic_seq set seq = last_insert_id(seq+1);END
spring配置文件:

<bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.tot.service"></property><property name="annotationClass" value="com.tot.annotation.MyBatisDao"></property><!-- 自动绑定sqlsession --></bean>
<bean id="sqlsessionfactorybean" class="org.mybatis.spring.SqlSessionFactoryBean"><span style="white-space:pre"></span><property name="dataSource" ref="mydataSource"></property><span style="white-space:pre"></span><property name="mapperLocations" value="classpath:com/tot/entity/*.xml"></property><span style="white-space:pre"></span></bean>
mydatasource就不贴了,涉及密码了。


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 7个月宝宝便秘怎么办 9个月宝宝便秘怎么办 六个月宝宝严重便秘怎么办 公司调岗员工不同意怎么办 acca注册一直在审核怎么办 ieee ap二审被拒怎么办 文章投到假期刊怎么办 论文投了假网站怎么办 网上传了虚假的怎么办? 网上做兼职被骗了钱怎么办 通过支付宝扫码被骗了怎么办 支付宝扫二维码被骗怎么办 在is上被骗了怎么办 微信兼职被骗怎么办天涯论坛 公众号不给稿费怎么办 围绕服务改善民生提出怎么办 翰墨香林苑怎么办全产权 西城高铁联名卡怎么办 英语教学系统做题时超时了怎么办 sci被要求撤稿怎么办 论文投稿后初审通过想撤稿怎么办 河南大学读写译挂了怎么办 在职mba双证硕士怎么办户口 电脑开机了出现一些英文单词怎么办 不懂法语想读法语书怎么办 大鱼号文章需要修改怎么办 过了上诉期怎么办申诉 法院判刑后被告逃亡监护人怎么办 二审判决后不服的怎么办 对树木对生物花草过敏怎么办 高一英语成绩差怎么办 文章被同时录用该怎么办 来不及开ei检索证明怎么办 淘宝生产许可编号一定要填怎么办 官网下单被砍单怎么办美卡美私 大学网络课程挂了怎么办 如果二审超过6个月还不判怎么办? sci的proof时间超了怎么办 合肥电大考试没过怎么办 社保账号密码忘记了怎么办 住房公积金账号密码忘记了怎么办