我有一些基于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>
...
如何确保删除或更新成功,并且不提出其他检查要求?
例如,请求包含不正确的标识符组合,未找到记录(未引发异常)?
我将非常感谢您提供的信息。
谢谢大家。
答案 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>