如何保证无需额外请求即可成功删除或更新?

时间:2018-10-24 05:16:51

标签: java spring cxf microservices mybatis

我有一些基于Apache CXF的微服务。在某些微服务的服务层中,我向另一个微服务发出POST请求,以从数据库中删除一些记录:

@Override
public IdsResponse removeSomeStuff(IdsRequest request) throws NotFoundException {
    try {
        POST(SomeStuffEndpoint.createUrl(this.baseUri, REMOVE_SOME_STUFF), request, 
               IdsResponse.class);
    } catch(NotFoundException e) {
        logger.error("...", e);
        throw new NotFoundException(String.format("...: %s", e.getMessage()), e);
    }
    return new IdsResponse();
}

例如在另一个微服务的端点出现了一个请求:

@Path("/some-stuff")
public interface SomeStuffEndpoint {

    @POST
    @Path("/remove")
    Response removeSomeStuff(@Context MessageContext context);

    ...
}

在此微服务的DAO层中,我从数据库中删除(或更新)记录:

public class SomeStuffDaoImpl implements SomeStuffDao {
    private static final Logger logger = LoggerFactory.getLogger(SomeStuffDaoImpl.class);

    @Autowired
    SomeStuffMapper someStuffMapper;

    @Override
    public void removeSomeStuff(List<Long> someIds, List<Long> someAnotherIds) {
        try {
            someStuffMapper.removeSomeStuff(someIds, someAnotherIds);
        } catch (InvocationTargetException | PSQLException | BadSqlGrammarException e) {
            logger.error("...");
        }
    }
    ...
}   

我使用MyBatis 3作为持久性框架。删除内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
                        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="some.company.appname.mservicename.model.mapper.SomeStuffMapper">

    <delete id="removeSomeStuff" parameterType="map">
        delete from some_stuff where some_id in
        <foreach collection="someIds" item="someId" 
                index="index" 
                open="(" separator="," close=")">
            #{someId}
        </foreach>

        and another_stuff in

        <foreach collection="someAnotherIds" item="someAnotherId" 
                 index="index" 
                 open="(" separator="," close=")">
            #{someAnotherId}
        </foreach>
    </delete>
... 

如何确保删除或更新成功,并且不提出其他检查要求?

例如,请求包含不正确的标识符组合,未找到记录(未引发异常)?

我将非常感谢您提供的信息。

谢谢大家。

1 个答案:

答案 0 :(得分:1)

由于更新/删除,您可以返回一些信息。在最简单的情况下,它可以是受影响的记录数。这样,客户端将知道没有记录被删除。

为此,请在映射器中修改removeSomeStuff的签名以返回int。 Mybatis将返回受影响的记录数。可以执行任何修改操作。

在某些情况下,返回有关受影响记录的更多信息(例如已删除记录的ID)会很有帮助。您尚未指定正在使用的RDBMS。在postgres中,您可以将delete转换为以下内容:

<select id="removeSomeStuff" parameterType="map" resultType="long" flushCache="true">

    delete from some_stuff where some_id in
    <foreach collection="someIds" item="someId" 
            index="index" 
            open="(" separator="," close=")">
        #{someId}
    </foreach>

    and another_stuff in

    <foreach collection="someAnotherIds" item="someAnotherId" 
             index="index" 
             open="(" separator="," close=")">
        #{someAnotherId}
    </foreach>
    RETURNING id
</select>