将Switch Case转换为While循环并从数据库获取目的地数据
解决方案:用数据库存储+内存映射替代硬编码Switch
核心思路
把目的地编码与名称的映射关系从代码硬编码转移到数据库存储,通过一次性加载数据库数据到内存Map(用while遍历结果集完成初始化),后续直接通过编码快速获取名称,既简化代码,又提升维护性与性能。
代码实现
1. 初始化加载数据库映射(应用启动时执行一次)
先从数据库读取所有目的地数据,用while遍历结果集填充到内存Map中:
// 全局缓存映射,多线程环境建议用ConcurrentHashMap保证线程安全 private static final Map<String, String> DESTINATION_MAP = new ConcurrentHashMap<>(); // 初始化方法,在应用启动阶段调用 public void initDestinationMapping() { String querySql = "SELECT code, name FROM destinations"; // 假设数据库表名为destinations,字段code(编码)、name(名称) try (Connection conn = DriverManager.getConnection("你的数据库URL", "用户名", "密码"); PreparedStatement stmt = conn.prepareStatement(querySql); ResultSet rs = stmt.executeQuery()) { // 用while遍历结果集,填充映射表 while (rs.next()) { String code = rs.getString("code"); String name = rs.getString("name"); DESTINATION_MAP.put(code, name); } } catch (SQLException e) { // 实际项目中建议用日志框架记录异常,而非直接打印 e.printStackTrace(); } }
2. 获取目的地名称(替代原Switch逻辑)
直接从缓存Map中获取,找不到则返回默认提示:
String targetCode = gettingcarValue.getNameDestination(); String nameDestination = DESTINATION_MAP.getOrDefault( targetCode, "Location not found: " + targetCode );
备选方案:实时查询数据库(不推荐,性能较低)
如果必须每次都从数据库查询(比如数据实时变动且无法缓存),也可以用while遍历结果集获取匹配数据:
String targetCode = gettingcarValue.getNameDestination(); String nameDestination = "Location not found: " + targetCode; String querySql = "SELECT name FROM destinations WHERE code = ?"; try (Connection conn = DriverManager.getConnection("你的数据库URL", "用户名", "密码"); PreparedStatement stmt = conn.prepareStatement(querySql)) { stmt.setString(1, targetCode); try (ResultSet rs = stmt.executeQuery()) { // 结果集最多一条,while遍历获取 while (rs.next()) { nameDestination = rs.getString("name"); } } } catch (SQLException e) { e.printStackTrace(); }
方案对比
- 缓存Map方案:性能最优(O(1)查询),仅初始化时查一次数据库,适合目的地数据不频繁变动的场景,是首选方案。
- 实时查询方案:每次查询都走数据库,性能较差,仅适合数据实时更新且无法缓存的极端场景。
内容的提问来源于stack exchange,提问作者RockyRay
相关产品推荐
相关产品推荐

