我有一个每次动作发生时运行的类,例如,我登录并运行User类。该类传递ResultSet
,其中包含该特定用户的信息。
现在我要完成的是获得结果并将它们分成“类变量”(我相信它们被称为字段)。我尝试了以下内容:
public User(ResultSet resultSet) throws SQLException {
this.username = resultSet.getString("username");
this.firstname = resultSet.getString("firstname");
// etc etc.
}
这是有效的,但由于我在那里有大约二十几个元素,这将成为一个很长的列表。
我还想到了一种方法,我会查看结果,然后检查它是否是一个字符串。如果是,则将其分配给一个与该键对应的名称的变量,但这会将我的问题减少一半,因为我仍然需要声明所有这些变量。
我想知道是否有更快,也许更优雅的方式来解决这样的事情。
感谢。
答案 0 :(得分:2)
您可以为从数据库中检索的每种信息类型创建一个类。您为用户信息创建了一个User类。除非您使用Hibernate之类的ORM,否则数据库表不会创建Java对象的快捷方式。
答案 1 :(得分:0)
我最近一直在研究一种简单的工具。它接受Map<String, Object>
和类,并返回此类的实例。请查看my repository示例。如果您使用Maven,则只需添加依赖项:
<dependency>
<groupId>uk.co.jpawlak</groupId>
<artifactId>map-to-object-converter</artifactId>
<version>1.1</version>
</dependency>
这当然要求您先将ResultSet
转换为Map
,但这非常简单,您只需编写一次此代码。
答案 2 :(得分:0)
没有什么可以帮助你完成类似的事情。 有几种方法可以做到这一点
如果你有幸让对象的字段名称与sql列名完全匹配,就像在你的例子中一样,你可以写这样的东西
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
...
private void getUserDetails(ResultSet resultSet) throws SQLException, NoSuchFieldException,
SecurityException, IllegalArgumentException, IllegalAccessException {
ResultSetMetaData rsmd = resultSet.getMetaData();
while (resultSet.next()) {
int i = rsmd.getColumnCount();
while (i-- > 0) {
// *this* being the user object
String colName = rsmd.getColumnName(i);
Field field = this.getClass().getDeclaredField(colName);
field.set(this, resultSet.getObject(colName));
}
}
}