我们有
String sql = "SELECT * FROM user WHERE id = '" +userId +"'";
List<Object> userList = template.queryForList(sql);
查询应返回具有给定id的不同用户。
template
是JdbcTemplate
类的对象
此处查询返回Map<String,Object>
的列表,左侧是List<Object>
。有没有办法进行转换。这是Spring事务管理示例的一部分。
答案 0 :(得分:2)
您可以始终只使用您感兴趣的List<Object> userList = new ArrayList<Object>(template.queryForList(sql).values());
,例如:
List<Map<String, Object>>
如果它返回Map<String,Object>
而不是List < Object > userList = new ArrayList < Object > ();
for (Map < String, Object > obj: template.queryForList(sql)) {
userList.addAll(obj.values());
}
:
Object
这应该会根据您的需要为您提供Map.values()
列表。如果您需要探究为什么ArrayList
无法直接投放到列表中,我们需要为此目的创建新的PYTHONPATH
,请访问:why HashMap Values are not cast in List
答案 1 :(得分:1)
我认为你应该采取另一种方法。 Spring无法从数据库返回的数据构建对象,但您可以使用RowMapper
构造用户对象。此外,您不应该自己构建查询,而是使用PreparedStatement
。否则,您可能容易受到SQL注入的攻击。</ p>
以下是如何操作的示例:
template.query("SELECT * FROM user WHERE id = ?", new Object[] { userId }, new RowMapper<User>() {
public User mapRow(ResultSet rs, int rowNum) {
// Build a user from the current row and return it
}
});
答案 2 :(得分:1)
我觉得你很困惑。最好的方法就是Steffen Kreutz所建议的。请考虑以下示例:
DB中的用户表具有以下字段:
1. UserID -> Type: Int
2. User_Name -> Type: Varchar
3. User_Contact -> Type: Varchar
...
现在,您可以简单地编写一个RowMapper来将所有这些字段映射到您的自定义POJO对象,如下所示:
POJO班级:
public class User{
private int userId;
private String userName;
private String userContact;
public int getUserId() {
return this.userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
/* Other Getter-Setter(s) */
}
查询字符串:
private static final String SELECT_QUERY = "SELECT * FROM user WHERE id = ?";
JdbcTemplate调用:
你在这里传递userId
? JdbcTemplate将自动处理它。
List<User> = (List<User>) jdbcTemplate.query(SELECT_QUERY, new Object[] { userId }, new UserRowMapper());
最后是UserRowMapper类:
class UserRowMapper implements RowMapper {
@Override
public Object mapRow(ResultSet resultSet, int row) throws SQLException {
User user = new User();
user.setUserId(resultSet.getInt("UserID"));
user.setUserName(resultSet.getString("User_Name"));
user.setUserContact(resultSet.getString("User_Contact"));
return user;
}
}
这确实是使用JdbcTemplate的最佳和推荐方式。