很多人一提到 SpringBoot 操作数据库就只想到 MyBatis、JPA其实在很多简单业务、小工具项目、后台管理模块里根本没必要上重型框架。JdbcTemplate 才是轻量、简单、开箱即用的神器没有复杂配置、没有 XML、没有各种插件几行代码就能完成增删改查非常适合快速开发。一、JdbcTemplate 适合什么场景• 单表简单业务不想写 MyBatis XML/注解• 微服务内部小模块、轻量接口• 快速原型开发、临时数据处理• 对 SQL 可控但又不想引入复杂 ORM优点• 极轻量无额外依赖• 直接写原生 SQL灵活直观• 性能接近原生 JDBC无损耗• Spring 自带自动整合事务二、引入依赖只需要 web jdbc mysql 驱动即可dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency三、application.yml 配置和 MyBatis 数据源配置完全一样spring: datasource: url: jdbc:mysql://localhost:3306/testdb?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver不需要任何额外配置启动项目自动装配JdbcTemplate。四、建表 SQLCREATE TABLE user ( id bigint NOT NULL AUTO_INCREMENT, username varchar(50) DEFAULT NULL, age int DEFAULT NULL, email varchar(50) DEFAULT NULL, create_time datetime DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;五、实体类 Userpackage com.demo.entity; import lombok.Data; import java.time.LocalDateTime; Data public class User { private Long id; private String username; private Integer age; private String email; private LocalDateTime createTime; }六、直接使用 JdbcTemplate最简洁方式JdbcTemplate 常用方法•update()增、删、改•queryForObject()查询单个对象•query()查询列表•batchUpdate()批量操作1. 新增Autowired private JdbcTemplate jdbcTemplate; public int addUser(User user) { String sql insert into user(username, age, email) values(?, ?, ?); return jdbcTemplate.update( sql, user.getUsername(), user.getAge(), user.getEmail() ); }2. 删除public int deleteById(Long id) { String sql delete from user where id?; return jdbcTemplate.update(sql, id); }3. 修改public int updateUser(User user) { String sql update user set username?, age?, email? where id?; return jdbcTemplate.update( sql, user.getUsername(), user.getAge(), user.getEmail(), user.getId() ); }4. 根据 ID 查询单个对象public User findById(Long id) { String sql select * from user where id?; return jdbcTemplate.queryForObject( sql, new BeanPropertyRowMapper(User.class), id ); }5. 查询列表public ListUser findAll() { String sql select * from user; return jdbcTemplate.query( sql, new BeanPropertyRowMapper(User.class) ); }6. 带条件查询public ListUser findByAge(Integer age) { String sql select * from user where age?; return jdbcTemplate.query( sql, new BeanPropertyRowMapper(User.class), age ); }7. 统计数量public Long count() { String sql select count(*) from user; return jdbcTemplate.queryForObject(sql, Long.class); }8. 批量插入public void batchAdd(ListUser userList) { String sql insert into user(username, age, email) values(?,?,?); jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() { Override public void setValues(PreparedStatement ps, int i) throws SQLException { User user userList.get(i); ps.setString(1, user.getUsername()); ps.setInt(2, user.getAge()); ps.setString(3, user.getEmail()); } Override public int getBatchSize() { return userList.size(); } }); }七、封装成标准 Service 层Service public class UserService { Autowired private JdbcTemplate jdbcTemplate; // 新增 Transactional(rollbackFor Exception.class) public boolean add(User user) { String sql insert into user(username,age,email) values(?,?,?); return jdbcTemplate.update(sql, user.getUsername(), user.getAge(), user.getEmail()) 0; } // 删除 Transactional public boolean delete(Long id) { String sql delete from user where id?; return jdbcTemplate.update(sql, id) 0; } // 修改 Transactional public boolean update(User user) { String sql update user set username?,age?,email? where id?; return jdbcTemplate.update(sql, user.getUsername(), user.getAge(), user.getEmail(), user.getId()) 0; } // 根据ID查询 public User findById(Long id) { String sql select * from user where id?; try { return jdbcTemplate.queryForObject( sql, new BeanPropertyRowMapper(User.class), id); } catch (EmptyResultDataAccessException e) { return null; } } // 查询全部 public ListUser list() { String sql select * from user; return jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class)); } }注意queryForObject查询不到会抛异常必须try-catch处理。八、Controller 接口RestController RequestMapping(/user) public class UserController { Autowired private UserService userService; PostMapping(/add) public Result add(RequestBody User user) { userService.add(user); return Result.success(添加成功); } DeleteMapping(/delete/{id}) public Result delete(PathVariable Long id) { userService.delete(id); return Result.success(删除成功); } PutMapping(/update) public Result update(RequestBody User user) { userService.update(user); return Result.success(修改成功); } GetMapping(/{id}) public Result findById(PathVariable Long id) { return Result.success(userService.findById(id)); } GetMapping(/list) public Result list() { return Result.success(userService.list()); } }九、JdbcTemplate 事务支持直接使用Transactional即可和 MyBatis 完全一致Transactional(rollbackFor Exception.class) public void testTransaction() { // 两次修改要么都成功要么都回滚 jdbcTemplate.update(update user set age20 where id1); int i 1 / 0; // 模拟异常 jdbcTemplate.update(update user set age30 where id2); }十、JdbcTemplate 与 MyBatis 如何选择•简单单表、快速开发→ JdbcTemplate•复杂查询、多表关联、动态SQL→ MyBatis•企业后台管理系统→ MyBatis 更易维护•小接口、轻量服务→ JdbcTemplate 更清爽十一、注意事项1.查询不到数据报错queryForObject无数据会抛异常需要捕获EmptyResultDataAccessException2.类型不匹配数据库日期、数字类型要与实体类对应3.SQL 注入风险必须使用?占位符不要字符串拼接4.批量操作性能大量数据建议分批插入避免一次过大十二、总结SpringBoot 整合 JdbcTemplate 可以说是最简单的数据层方案只需要引入spring-boot-starter-jdbc自动装配直接写 SQL 就能完成所有操作。没有配置、没有 XML、没有学习成本非常适合小项目、快速开发场景也是 Spring 生态最原生的数据访问方式。