gpt4 book ai didi

java - MyBatis SelectList 输出 CopyOnWriteArrayList

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:30:51 25 4
gpt4 key购买 nike

由于我正在尝试同时学习 MyBatis 和 java,因此请耐心等待新手问题。我有一个应用程序,我需要在其中使用线程安全变量。基于一些研究和我对如何使用该应用程序的想法,我决定在 Vector 上使用 CopyOnWriteArrayList。

当我从 mybatis sql session 中调用一个 selectList 时,有什么方法可以告诉它创建一个 CopyOnWriteArrayList 作为它的返回而不是一个 ArrayList?无可否认,我的配置代码是两行而不是一行,但我心里说一定有更好的方法和/或我不是第一个遇到这种情况的人。

List<Team> teams = session.selectList("getTeamsByGameID", gameID);
List<Team> arrayListReturn = new CopyOnWriteArrayList<Team>(teams);
return arrayListReturn;

提前致谢

最佳答案

我知道有两种方法可以处理这个问题。

选项 1:使用 Mapper 类并指定要返回的列表类型。

定义一个Mapper接口(interface):

public interface TeamMapper {
CopyOnWriteArrayList<Team> getTeamsByGameID();
}

您的映射器 xml 文件保持不变。执行查询的代码更改为:

TeamMapper m = session.getMapper(TeamMapper.class);
List<Team> lt = m.getTeamsByGameID();
System.out.println(lt.getClass());
//=> prints out "class java.util.concurrent.CopyOnWriteArrayList"


选项 2:创建一个 ResultHandler 并将其传递到 session.select() 方法中。

这里使用了 ResultHandler 接口(interface)。该接口(interface)要求您重写一个方法,handleResult,它会在查询过程中提供从数据库返回的每个结果。

在您的情况下,您的 ResultHandler 看起来像这样:

public class TeamResultHandler implements ResultHandler {

private List<Team> teams = new CopyOnWriteArrayList<Team>();

@Override
public void handleResult(ResultContext rc) {
countries.add((Team) rc.getResultObject());
}

// provide a getter so you can retrieve it when finished
public List<Team> getTeamList() {
return teams;
}
}

不像上面那样使用 selectList,您现在可以使用 session.select(String, ResultHandler),如下所示:

TeamResultHandler rh = new TeamResultHandler();
session.select("getTeamsByGameID", rh);
List<Team> lt = rh.getTeamList();
return lt;

此解决方案比您的解决方案更冗长(需要一个额外的类和查询代码中的三行,而不是 2 行),但它只创建一个列表,而不是两个,因此您必须决定哪个适合您的需要最好的。

此外,ResultHandlers 还可用于其他事情 - 确保结果以某种方式排序或过滤或其他方式,以备不时之需。

关于java - MyBatis SelectList 输出 CopyOnWriteArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11568478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com