MyBatis的Mapper.xml怎么同时执行多个sql语句

J2EE 码拜 10年前 (2015-05-11) 4852次浏览 0个评论
 

小弟遇到一个这个问题很是不解,我需要在DAO层的deleteUserById(Integer id)接口中同时执行以下2条语句
       <!–根据Id删除用户信息–>
<update id=”deleteUserById” parameterType=”int”>
UPDATE users
SET
 status =””isAble””
WHERE
     id=#{id}
</update>
<delete id=”deleteUserById” parameterType=”int”>
DELETE FROM
     order_users
WHERE
     uid=#{uid}      
</delete>
也就是说先更新用户表users的状态为激活,然后在进行删除该激活的用户,其中用户表的id与订单表的uid是对应的,比如id是22那么它所对应的uid也是22,我上面写法会mybatis会说映射文件ID名称相同了,无法执行,技术限制不使用存储过程方式调用的情况下怎么解决该问题啊,mybatis能否像ibatis那样同时有<statement>属性加入多条sql一起执行呢?

10分
好像没有这样的用法。你可以将这两个语句分开,在DAO里作为两个方法,然后可以额外加一个方法对这两个方法依次调用,也能实现
20分
MyBatis对每个sql在Mapper Interface里都有一个对应的方法。
写一个Service,在Service的方法里调用这两个删除方法就可以了,如果有需要,还可以用事务。
随便说一句,上面说直接用Mapper,不用Dao是因为使用的是Spring,可以不用Dao层,因为在Dao里创建SqlSession, 关闭SqlSession,创建事务,提交事务等大量模版的事情都由MyBatis-Spring的插件给自动做完了,所以直接在Service的方法里使用Mapper的函数。
你两条sql的id一样,应该不能判断使用哪个
Inhibitory,你说的mybatis里面的Mapper里面的一个sql语句对应DAO层的一个interface接口,这个我能理解,目前我网上搜了下貌似只有“存储过程”和你说的”把sql在dao映射多个方法”来解决了,因为根据官方介绍mybatis是不可以同时连续执行多条sql的,除非修改其源码,但是小弟是这样的需求:不使用spring技术来管理,也不使用存储过程技术,就是单纯的加入mybatis来简化jdbc的冗余Connction,Statement,ResultSet等这样的重复代码,因为以前老项目数据库使用的是jdbc技术,JDBC可以在prepareStatement里面同时装载多个sql,这一点mybatis不得行,所以就是问下各位高人有没有办法来让mybatis同时连续在Mapper里面可以执行多条SQL哈!
还有一点就是如果把多个sql的映射语句都写在DAO层,也就是说一个select,insert,update,delete标签对应一个DAO层的interface接口方法,那么如果业务有100条连续执行的insert或delete标签语句,那岂不是DAO层要写100个对应的方法,这肯定不是最佳方案啊,人家ibatis就可以使用<statement />标签来将多个sql写在一起连续执行,看来升级版mybatis还没以前的ibatis好呢!
10分
那你这两步其实就是一个业务操作中的两步嘛。
业务操作放到service层中,两步操作每一步都放在DAO层
那么在service开启事务,然后依次调用两步就OK了~很清晰嘛
回复012345283:是的,我需要先更新用户状态,然后再删除根据它可用状态删除他,但是以前老项目在DAO层只写了一个deleteUserByID()方法,该方法调用上面2个statement的sql语句就完成,而mybatis在DAO层写一个deleteUserByID()方法,它不可以写2条sqlMapper语句啊,你们的意思就是在DAO层将deleteUserByID()分成2个方法来各自写一个sql语句,我想要的结果就是deleteUserByID()有且只有一个这个方法来调用2条sqlMapper啊!
10分
引用 8 楼 LYJ225577 的回复:

回复012345283:是的,我需要先更新用户状态,然后再删除根据它可用状态删除他,但是以前老项目在DAO层只写了一个deleteUserByID()方法,该方法调用上面2个statement的sql语句就完成,而mybatis在DAO层写一个deleteUserByID()方法,它不可以写2条sqlMapper语句啊,你们的意思就是在DAO层将deleteUserByID()分成2个方法来各自写一个sql语句,我想要的结果就是deleteUserByID()有且只有一个这个方法来调用2条sqlMapper啊!

在别人的世界,就得按照别人的规则去做。

10分
运用事务,要不写个存储过程也行。同一类的SQL可以执行多个,不同类的,执行不了啊
40分
首先这要看你的deleteUserByID()方法是作为什么方法存在了。
如果认为他是业务逻辑,完全可以写在service层,调用两条SQL对应的DAO层方法;
如果一定要写成DAO方法,完全可以将那两条SQL对应的update和delete两个方法封装起来使用。如果在xml中使用的是Mapper名空间,那么对应Mapper确实可以作为DAO来使用,但仍然可以自己构建一个DAO来对Mapper方法进行扩展。
Mybatis中没有直接执行多条SQL的方法,事实上将每条语句分开也有便于重用的考虑,虽然未必会用到
世上本无事。
<insert id=”addPortalPage” useGeneratedKeys=”true” keyProperty=”id” 
parameterType=”com.qiji.vo.authmanage.PortalPageVO”>
<if test=”isDefault==1″>
UPDATE t_portal_page set isDefault=0;
</if>
insert into t_portal_page(pageName,portalPhoneUrl,isDefault,
portalPcUrl,checkType,createtime)
values(#{pageName},#{portalPhoneUrl},#{isDefault},#{portalPcUrl},
    #{checkType},SYSDATE())
</insert>
<delete id=”delete” parameterType=”java.lang.Long”>
delete from a where id=#{0};
                                             delete from b where id in( select bid from a where id=#{0};)
</delete>

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明MyBatis的Mapper.xml怎么同时执行多个sql语句
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!