Rob*_*ith 3 java concurrency mybatis
请耐心等待新手问题,因为我正在尝试同时学习MyBatis和java.我有一个应用程序,我需要使用线程安全变量.根据一些研究和我对如何使用应用程序的想法,我已经确定了Vector上的CopyOnWriteArrayList.
当我从mybatis sql会话调用selectList时,有没有办法告诉它创建一个CopyOnWriteArrayList作为其返回而不是ArrayList?不可否认,我配置这个代码的代码是两行而不是一行,但我的一些内容表明必须有更好的方法和/或我不是第一个遇到这种情况的人.
List<Team> teams = session.selectList("getTeamsByGameID", gameID);
List<Team> arrayListReturn = new CopyOnWriteArrayList<Team>(teams);
return arrayListReturn;
Run Code Online (Sandbox Code Playgroud)
提前致谢,
我知道有两种方法可以解决这个问题.
选项1:使用Mapper类并指定要返回的List类型.
定义Mapper接口:
public interface TeamMapper {
CopyOnWriteArrayList<Team> getTeamsByGameID();
}
Run Code Online (Sandbox Code Playgroud)
您的映射器xml文件保持不变.执行查询的代码更改为:
TeamMapper m = session.getMapper(TeamMapper.class);
List<Team> lt = m.getTeamsByGameID();
System.out.println(lt.getClass());
//=> prints out "class java.util.concurrent.CopyOnWriteArrayList"
Run Code Online (Sandbox Code Playgroud)
选项2:创建ResultHandler并将其传递给session.select()方法.
在这里使用ResultHandler接口.该接口要求您覆盖一个方法,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;
}
}
Run Code Online (Sandbox Code Playgroud)
selectList您现在可以使用session.select(String, ResultHandler),而不是像上面那样使用,如下所示:
TeamResultHandler rh = new TeamResultHandler();
session.select("getTeamsByGameID", rh);
List<Team> lt = rh.getTeamList();
return lt;
Run Code Online (Sandbox Code Playgroud)
此解决方案比您的解决方案更冗长(在查询代码中需要额外的类和三行,而不是2),但它只创建一个List而不是两个,因此您必须决定哪个最适合您的需求.
此外,ResultHandlers可用于其他事项 - 确保结果以某种方式排序或过滤或其他内容,以防您需要.
| 归档时间: |
|
| 查看次数: |
2912 次 |
| 最近记录: |