c:forEach遍历List<Map<String,Object>>
时间: 2023-10-14 18:13:51 浏览: 146
的方法你熟悉吗?可以举个例子吗?
当然可以。 c:forEach 是 JSTL 标签库中的一种标签,用于迭代集合中的数据并逐个输出。
遍历 List<Map<String,Object>> 可以这样写:
```
<c:forEach var="map" items="${list}">
<c:forEach var="entry" items="${map}">
${entry.key}: ${entry.value}<br />
</c:forEach>
</c:forEach>
```
其中,${list} 表示要遍历的 List,var="map" 表示每次迭代时将 Map 存储在名为 map 的变量中,${map} 再次使用 forEach 标签对 Map 进行遍历,var="entry" 表示每次迭代时将 Map.Entry 存储在名为 entry 的变量中。最后通过 ${entry.key} 和 ${entry.value} 获取 Map 中的键值对并输出。
需要注意的是,List<Map<String,Object>> 中的 Map 中的键值对可以是任意类型,需要根据具体情况进行类型转换。
相关问题
如何遍历 List<Map<String, Object>>
可以使用 foreach 循环遍历 List,再使用 Map 的 keySet() 方法遍历 Map 中的键值对。
示例代码:
```
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("id", 1);
map1.put("name", "Alice");
list.add(map1);
Map<String, Object> map2 = new HashMap<>();
map2.put("id", 2);
map2.put("name", "Bob");
list.add(map2);
for (Map<String, Object> map : list) {
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
```
输出结果:
```
id: 1
name: Alice
id: 2
name: Bob
```
方案 1:自定义 ResultHandler(推荐) 实现原理:通过实现 MyBatis 的 ResultHandler 接口,在结果集处理阶段直接修改 Map 数据。 适用场景:需要针对特定查询进行字段过滤。 实现步骤: 创建自定义结果处理器: Java public class MapFieldFilterResultHandler implements ResultHandler<Map<String, Object>> { private final List<Map<String, Object>> results = new ArrayList<>(); private final Set<String> excludeFields; public MapFieldFilterResultHandler(Set<String> excludeFields) { this.excludeFields = excludeFields; } @Override public void handleResult(ResultContext<? extends Map<String, Object>> resultContext) { Map<String, Object> originalMap = resultContext.getResultObject(); // 创建新 Map 并过滤字段 Map<String, Object> filteredMap = new LinkedHashMap<>(); originalMap.forEach((key, value) -> { if (!excludeFields.contains(key.toLowerCase())) { // 忽略大小写 filteredMap.put(key, value); } }); results.add(filteredMap); } public List<Map<String, Object>> getFilteredResults() { return results; } } 在 Mapper 接口中使用处理器: Java public List<Map<String, Object>> selectUsersWithoutSensitiveFields() { MapFieldFilterResultHandler resultHandler = new MapFieldFilterResultHandler(Set.of("password", "salt")); // 指定要排除的字段 sqlSession.select("selectUsers", resultHandler); // "selectUsers" 是对应的 SQL ID return resultHandler.getFilteredResults(); } SQL 映射文件保持简单查询: Xml <select id="selectUsers" resultType="map"> SELECT * FROM user <!-- 直接查询所有字段 --> </select> 优势: 代码侵入性低,可精准控制特定查询 支持动态过滤规则 兼容所有 MyBatis 版本 你这个方案在java8怎么实现?
<think>好的,我需要帮助用户理解如何在Java 8中实现他们提到的自定义ResultHandler方案。首先,我应该回顾用户提供的方案,确认各个部分是否与Java 8兼容。用户给出的示例代码看起来已经是基于Java的,但可能需要注意Java 8的特性,比如lambda表达式和集合工厂方法。
首先,用户提到的自定义ResultHandler类使用了Lambda表达式,比如在handleResult方法中的originalMap.forEach。Java 8支持Lambda,所以这部分没问题。不过,用户可能在创建excludeFields时使用了Set.of("password", "salt"),这里需要确认Set.of()是否在Java 8中存在。我记得Set.of()是Java 9引入的,所以在Java 8中需要改用其他方式初始化集合,比如new HashSet<>(Arrays.asList("password", "salt"))。
接下来,检查Mapper接口中的方法。用户示例中的sqlSession.select("selectUsers", resultHandler)是否正确?在MyBatis中,通常使用SqlSession的select方法时,可能需要指定参数,比如selectList或者使用Select注解。需要确认select方法在Java 8的MyBatis版本中是否适用,或者是否需要使用其他方法,比如selectList,并传递参数和ResultHandler。
然后,SQL映射文件中的resultType="map"是否正确,这在MyBatis中是标准的,应该没问题。确保用户知道他们的SQL语句需要正确映射到Map类型。
另外,用户可能想知道如何在实际应用中调用Mapper接口中的selectUsersWithoutSensitiveFields方法,是否需要额外的配置或注入SqlSession。可能需要指导用户如何在Service层或DAO层中调用这个方法,确保SqlSession被正确管理,比如使用Spring的注入或者MyBatis的默认会话管理。
还有,过滤字段时使用了key.toLowerCase(),这里可能存在大小写问题,比如数据库返回的字段名是否已经是小写,或者是否区分大小写。需要提醒用户注意数据库字段名称的大小写是否与excludeFields中的字符串匹配,可能需要统一转为小写或大写来处理,确保过滤生效。
最后,总结实现步骤,确保用户能够按照正确的Java 8语法和MyBatis配置完成整个流程。可能需要分步骤解释代码调整的部分,特别是替换Set.of()为Java 8兼容的初始化方法,并验证其他部分的正确性。</think>以下是针对 **Java 8** 实现自定义 `ResultHandler` 过滤字段的逐步方案:
---
### 一、实现步骤解析
#### 1. 创建自定义 `ResultHandler`
```java
import org.apache.ibatis.session.ResultContext;
import org.apache.ibatis.session.ResultHandler;
import java.util.*;
public class MapFieldFilterResultHandler implements ResultHandler<Map<String, Object>> {
private final List<Map<String, Object>> results = new ArrayList<>();
private final Set<String> excludeFields;
// Java 8 使用构造函数初始化 excludeFields(替换 Java 9+ 的 Set.of())
public MapFieldFilterResultHandler(Set<String> excludeFields) {
this.excludeFields = new HashSet<>();
for (String field : excludeFields) {
this.excludeFields.add(field.toLowerCase()); // 统一转为小写
}
}
@Override
public void handleResult(ResultContext<? extends Map<String, Object>> resultContext) {
Map<String, Object> originalMap = resultContext.getResultObject();
Map<String, Object> filteredMap = new LinkedHashMap<>(); // 保持字段顺序
originalMap.forEach((key, value) -> {
if (!excludeFields.contains(key.toLowerCase())) { // 忽略字段名大小写
filteredMap.put(key, value);
}
});
results.add(filteredMap);
}
public List<Map<String, Object>> getFilteredResults() {
return results;
}
}
```
#### 2. Mapper 接口中调用处理器
```java
import org.apache.ibatis.session.SqlSession;
import org.springframework.stereotype.Repository;
import java.util.*;
@Repository
public class UserMapper {
private final SqlSession sqlSession; // 需通过依赖注入获取(如 Spring)
public List<Map<String, Object>> selectUsersWithoutSensitiveFields() {
// Java 8 使用 new HashSet<>(Arrays.asList(...)) 初始化集合
Set<String> excludedFields = new HashSet<>(Arrays.asList("password", "salt"));
MapFieldFilterResultHandler resultHandler = new MapFieldFilterResultHandler(excludedFields);
// 注意:若 SQL 需要参数,需在 select() 方法中传入
sqlSession.select("selectUsers", resultHandler); // "selectUsers" 是 SQL ID
return resultHandler.getFilteredResults();
}
}
```
#### 3. SQL 映射文件(保持简单查询)
```xml
<!-- userMapper.xml -->
<select id="selectUsers" resultType="map">
SELECT * FROM user <!-- 查询所有字段 -->
</select>
```
---
### 二、关键适配点说明(针对 Java 8)
1. **集合初始化**
Java 8 需用 `new HashSet<>(Arrays.asList(...))` 替代 Java 9+ 的 `Set.of()`。
2. **大小写处理**
- 在 `ResultHandler` 构造函数中将 `excludeFields` 统一转为小写。
- 在 `handleResult` 中将字段名 `key` 转为小写比对,避免数据库字段名大小写差异导致过滤失效。
3. **SqlSession 管理**
需确保 `SqlSession` 已通过依赖注入(如 Spring)正确初始化,并在事务上下文中使用。
---
### 三、优势验证
1. **兼容性**
完全兼容 Java 8 及 MyBatis 3.x 版本。
2. **动态过滤**
通过构造函数传入不同字段集合,可复用同一处理器应对多种场景。
3. **性能优化**
在结果集处理阶段直接过滤,避免二次遍历数据。
---
### 四、示例调用
在 Service 层中调用 Mapper 方法:
```java
public class UserService {
@Autowired
private UserMapper userMapper;
public List<Map<String, Object>> getUsersWithoutSensitiveFields() {
return userMapper.selectUsersWithoutSensitiveFields();
}
}
```
---
### 五、注意事项
- **字段名一致性**:确保数据库返回的字段名与 `excludeFields` 中的名称大小写逻辑一致。
- **线程安全**:`ResultHandler` 实例应在方法内创建,避免多线程共享导致数据混乱。
阅读全文
相关推荐














返回
单号:
g
i
d
<
/
s
p
a
n
<
/
d
i
v
< d i v c l a s s
"
r
i
g
h
t
i
n
f
o
"
< t a b l e c l a s s
"
t
a
b
l
e
l
i
s
t
"
<
t
h
e
a
d
<
t
r
<
t
h
编号
<
/
t
h
<
t
h
名称
<
/
t
h
<
t
h
价格
<
/
t
h
<
t
h
数量
<
/
t
h
<
t
h
购买时间
<
/
t
h
<
/
t
r
<
/
t
h
e
a
d
<
t
b
o
d
y
< c : f o r E a c h i t e m s
"
gid编号 名称 价格 数量 购买时间 <c:forEachitems=“{somerkqk }” var=“xsqk” varStatus=“status”>
s
t
a
t
u
s
.
i
n
d
e
x
+
1
<
/
t
d
<
t
d
status.index+1 {xsqk.name }
x
s
q
k
.
p
r
i
c
e
<
/
t
d
<
t
d
xsqk.price {xsqk.sl }
${xsqk.dtime }
</c:forEach>
用这些数据在MyEclipse加一个分析数据页面,代码简单一些,使用Servlet 2.5,DAO叫做lssRkqkDAO
<servlet>
<servlet-name>AnalysisServlet</servlet-name>cvc-identity-constraint.4.1: Duplicate unique value


