map和set的增删查改

本文主要介绍了C++标准模板库(STL)中的几种容器类型:map、multimap、set。详细探讨了这些容器的特点及使用场景,例如map允许唯一键值而multimap允许多个相同键值,set则用于存储唯一元素。

一: map











迭代器区间的范围:  [通常是左闭右开)

二:multimap

multimap跟map大多数接口基本都相同,只不过multimap是可以在map中插入相同的key值

底层红黑树就是把相同元素直接链到相同元素的letf或right上


    

二:set


set的话,就是map少一个模板参数value,其它基本一样。接口也大致相同,在此就不赘述了。。。

<think>嗯,用户之前问过如何使用JdbcTemplate进行查询,特别是将结果映射到User POJO。现在他们接着要求“写一下增删查改”,也就是CRUD操作。我需要确保覆盖所有四个操作:增(Create)、删(Delete)、查(Read)、改(Update)。之前已经详细讲了查询,所以这次重点在其他三个操作。 首先,用户可能已经掌握了查询部分,现在需要完整的CRUD示例,以便全面了解JdbcTemplate的使用。他们的身份可能是一个刚学习Spring JDBC的开发者,或者是在项目中需要实现数据库操作的初级程序员。需要确保示例清晰,步骤详细,特别是参数设置SQL语句的正确性。 接下来要考虑的是,用户可能有POJO类,但需要知道如何将对象属性映射到SQL参数。比如插入操作,可能需要使用PreparedStatement的Setter方法,或者使用JdbcTemplate的update方法传入参数数组。这里需要给出两种常见的方法:使用对象数组传递参数,或者使用PreparedStatementSetter来设置参数。 对于更新删除操作,用户需要注意SQL语句中的占位符(?)参数的顺序。此外,应该提醒异常处理,比如删除时可能出现的空结果,或者更新时的影响行数判断。同时,事务管理也是关键点,需要提到@Transactional注解的使用,以确保操作的原子性。 另外,用户可能对批量操作感兴趣,特别是插入多条数据时的效率问题。这时候需要给出批量更新的示例,比如使用batchUpdate方法,并传递参数列表。这对于处理大量数据时非常有用,能减少数据库访问次数,提升性能。 还需要注意代码示例的正确性,比如确保User类有无参构造函数,Getter/Setter方法是否齐全,以及数据库字段名与POJO属性名的匹配。在自定义RowMapper时,如果字段名不匹配,需要用别名或者显式映射。同时,异常情况的处理,比如queryForObject在结果为空时会抛出异常,需要捕获或者使用Optional处理。 最后,总结部分要强调最佳实践,比如使用BeanPropertyRowMapper的注意事项,性能优化,事务控制等。可能用户在实际应用中会遇到这些问题,提前给出提示可以帮助他们避免常见错误。 综上所述,回答需要结构清晰,分步骤介绍每个CRUD操作,提供代码示例,并补充注意事项最佳实践,确保用户能够全面理解并正确应用JdbcTemplate进行数据库操作。</think>以下是使用`org.springframework.jdbc.core.JdbcTemplate`实现 **增删查改(CRUD)** 的完整指南,以`User` POJO为例: --- ### 一、POJO定义(基础) ```java public class User { private Long id; private String username; private String email; // 必须有无参构造函数 public User() {} // Getter/Setter省略(实际需完整实现) } ``` --- ### 二、完整CRUD实现 #### 1. **新增(Create)** ```java public int addUser(User user) { String sql = "INSERT INTO users (username, email) VALUES (?, ?)"; return jdbcTemplate.update( sql, user.getUsername(), // 参数顺序与SQL中的?对应 user.getEmail() ); } // 或使用PreparedStatementSetter public int addUser(User user) { return jdbcTemplate.update( "INSERT INTO users (username, email) VALUES (?, ?)", (PreparedStatement ps) -> { ps.setString(1, user.getUsername()); ps.setString(2, user.getEmail()); } ); } ``` #### 2. **查询(Read)** ```java // 查询单个(需处理空结果异常) public User getUserById(Long id) { try { return jdbcTemplate.queryForObject( "SELECT * FROM users WHERE id = ?", BeanPropertyRowMapper.newInstance(User.class), id ); } catch (EmptyResultDataAccessException e) { return null; // 或抛出自定义异常 } } // 查询列表 public List<User> getAllUsers() { return jdbcTemplate.query( "SELECT id, username, email FROM users", BeanPropertyRowMapper.newInstance(User.class) ); } ``` #### 3. **更新(Update)** ```java public int updateEmail(Long userId, String newEmail) { return jdbcTemplate.update( "UPDATE users SET email = ? WHERE id = ?", newEmail, // 对应第一个? userId // 对应第二个? ); } // 更新整个对象 public int updateUser(User user) { return jdbcTemplate.update( "UPDATE users SET username=?, email=? WHERE id=?", user.getUsername(), user.getEmail(), user.getId() ); } ``` #### 4. **删除(Delete)** ```java public int deleteUser(Long userId) { return jdbcTemplate.update( "DELETE FROM users WHERE id = ?", userId ); } ``` --- ### 三、高级操作 #### 1. **批量插入** ```java public int[] batchInsert(List<User> users) { return jdbcTemplate.batchUpdate( "INSERT INTO users (username, email) VALUES (?, ?)", users.stream().map(user -> new Object[]{user.getUsername(), user.getEmail()}) .collect(Collectors.toList()) ); } ``` #### 2. **查询返回主键** ```java public Long insertAndReturnId(User user) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(connection -> { PreparedStatement ps = connection.prepareStatement( "INSERT INTO users (username, email) VALUES (?, ?)", Statement.RETURN_GENERATED_KEYS ); ps.setString(1, user.getUsername()); ps.setString(2, user.getEmail()); return ps; }, keyHolder); return keyHolder.getKey().longValue(); } ``` --- ### 四、关键注意事项 1. **SQL注入防护**:始终使用`?`占位符,**不要拼接SQL字符串** 2. **事务控制**:在Service层添加`@Transactional`注解保证原子性 ```java @Transactional public void transferEmail(Long fromId, Long toId) { // 多个update操作 } ``` 3. **异常处理**: - `EmptyResultDataAccessException`:查询无结果时抛出 - `DataIntegrityViolationException`:违反约束(如唯一索引) 4. **性能优化**:高频操作建议复用`BeanPropertyRowMapper`实例 ```java private static final RowMapper<User> USER_MAPPER = BeanPropertyRowMapper.newInstance(User.class); ``` --- ### 五、完整工具类示例 ```java @Repository public class UserRepository { private final JdbcTemplate jdbcTemplate; private static final RowMapper<User> USER_MAPPER = BeanPropertyRowMapper.newInstance(User.class); public UserRepository(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } // 实现上述CRUD方法... } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值