java - 将数据库表的一列存储到 ArrayList 中
问题描述
我正在编写一个程序来跟踪 RFID 标签在 RFID 检查器之间移动时的移动。这是在模仿钱包在房间之间的移动。每个审查员都是通往不同房间的门。
我有一个 SQLite 数据库,其中包含卡片名称、位置和标签名称,以区分不同的卡片。
我需要一个 ArrayList 来告诉我数据库中当前有哪些标签。
我有一个 DAO 方法,它显示数据库中的所有值并将其存储在 ArrayList 中,如下所示:
SELECT * FROM Wallets;
[name: Henry, location: 0, tag: 5c00ce6df0, name: jim, location: 0, tag: wallet1]
我正在尝试编写另一个只显示如下标签的 DAO 方法:
SELECT Tag FROM Wallets;
[5c00ce6df0, wallet1]
一旦我将这些值保存在 ArrayList 中,我打算将它们传递给另一个 DAO 方法,该方法采用标签并返回所有相关信息,如下所示:
SELECT * FROM Wallets WHERE Tag = 'wallet1';
name: jim, location: 0, tag: wallet1
这是我的getAllWallets()
DAO 的代码:
public ArrayList<Wallet> getAllWallets() throws SQLException{
Connection dbConnection = null;
Statement statement = null;
ResultSet resultset = null;
String query = "SELECT * FROM Wallets;";
ArrayList<Wallet> list = new ArrayList<>();
try {
dbConnection = getDBConnection();
statement = dbConnection.createStatement();
System.out.println(query);
// execute SQL query
resultset = statement.executeQuery(query);
while (resultset.next()) {
Wallet w = new Wallet(query, 0, query);
w.setName(resultset.getString("Name"));
w.setLocation(resultset.getInt("Location"));
w.setTag(resultset.getString("Tag"));
list.add(w);
}
}
catch (SQLException e) {
System.out.println(e.getMessage());
}
finally
{
resultset.close();
statement.close();
dbConnection.close();
}
return list;
}
这是我迄今为止为我的getWalletTag()
DAO 所做的尝试:
public ArrayList<String> getWalletTag() throws SQLException {
Connection dbConnection = null;
ResultSet resultset = null;
Statement statement = null;
ArrayList<String> list = new ArrayList<String>();
String query = "SELECT Tag FROM Wallets;";
try {
dbConnection = getDBConnection();
statement = dbConnection.createStatement();
// execute SQL query
System.out.println(query);
resultset = statement.executeQuery(query);
String tag = tag.toString(); // i know this is totally wrong but i got stuck
list.add(tag);
}
catch (SQLException e) {
System.out.println(e.getMessage());
}
finally
{
if (resultset != null) {
resultset.close();
}
if (statement != null) {
statement.close();
}
if (dbConnection != null) {
dbConnection.close();
}
}
return list;
}
我正在努力解决的是如何将 Tag 列的所有值放入数组列表中。是否有捷径可寻?任何帮助将不胜感激。谢谢。
解决方案
在“理想世界”中,您可能想要使用ORM(如 Hibernate)和框架(如Spring Boot)。
对于您的应用程序来说,其中一个或两个都可能是“矫枉过正”。
如果您的目标是获得“标签列表”,那么您获得的代码看起来不错:
- 连接到数据库。
- 进行查询。
- 将结果集复制到 Java 对象列表中,一次一个。
- 完成后关闭数据库连接。
如果您的目标是“以最佳方式”找到特定标记(无需进行另一个 DB 查询),那么也许您应该使用 Java Map 或Set而不是 ArrayList。
如果您希望考虑使用 Spring Boot 和 Sqlite,这里有几个教程:
- https://www.baeldung.com/spring-boot-sqlite
- http://code-flow-hjbello.blogspot.com/2017/07/using-sqlite-with-jdbc.html
这部分代码看起来不错:
public ArrayList<Wallet> getAllWallets() throws SQLException{
resultset = statement.executeQuery(query);
while (resultset.next()) {
Wallet w = new Wallet(query, 0, query);
w.setName(resultset.getString("Name"));
w.setLocation(resultset.getInt("Location"));
w.setTag(resultset.getString("Tag"));
list.add(w);
}
...
所以两个选择之一:
要么忘记,
getWalletTag()
只用你的钱包来识别标签,要么使用相同的查询,只需将“标记”列保存到您的数组列表中(而不是其他任何内容)。
选项 2:
public ArrayList<String> getWalletTag() throws SQLException {
String query = "SELECT Tag FROM Wallets;";
...
resultset = statement.executeQuery(query);
List<String> tags = new ArrayList<String>();
while (resultset.next()) {
tags.add(resultset.getString("Tag"));
...
... 或者 ...
...
Set<String> tags = new HashSet<String>();
while (resultset.next()) {
tags.add(resultset.getString("Tag"));
推荐阅读
- sql-server - SQL 在 where 子句中使用 CASE
- node.js - MERN 堆栈,REST api Postman,无法获取 /
- android - 如何在 Activity 及其父级中添加 DI (Dagger 2)
- ms-access - 从启动时以低优先级模式运行 Access
- firebase - 具有分析和用户属性的 Firebase 云消息
- ios - 检查没有 Alamofire 的响应状态
- c# - 为什么将带有子对象列表的模型传递给控制器时,子对象列表不会被传递?
- java - Java:如何用 1 个字符串查找/替换(不区分大小写)几个子字符串?
- java - 将 ArrayList 转换为 ArrayList
- reactjs - 使用 redux 表单自动插入当前日期时间