小弟遇到一个这个问题很是不解,我需要在DAO层的deleteUserById(Integer id)接口中同时执行以下2条语句 |
|
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分 |
在别人的世界,就得按照别人的规则去做。 |
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> |