在Spring Boot 4.2中,仅用spring-boot-starter-data-jdbc实现轻量CRUD:需正确配置依赖与sql.init.mode,实体字段名须匹配列名或用@Column指定,Repository接口继承JdbcRepository并加@Repository注解,仅支持AUTO_INCREMENT主键回填。

要在SpringBoot 4.2中用最轻量的方式完成数据库读写,不引入JPA的复杂约定、不依赖MyBatis的XML或注解扫描,只靠Spring官方原生支持的Starter Data JDBC实现对象到表的映射与基础CRUD,你需要避开自动建表陷阱、绕过实体字段名与列名不一致导致的空值问题,并确保查询结果能正确填充Java对象。
添加依赖与启用基础配置
在pom.xml中仅添加两个必要依赖:
① spring-boot-starter-data-jdbc 提供核心模板与Repository自动装配能力;
② 对应数据库驱动(如MySQL需mysql-connector-java,H2则用h2)。
注意:SpringBoot 4.2已将spring-boot-starter-jdbc整合进spring-boot-starter-data-jdbc,【不可再重复引入前者】,否则可能触发Bean定义冲突。
application.yml中配置数据源时,必须显式指定spring.sql.init.mode: always或never,否则4.2默认启用schema初始化,会尝试执行schema.sql——而Starter Data JDBC本身不解析该文件,导致启动失败。
定义实体类与列名映射
实体类无需@Entity或@Table,但字段命名必须严格匹配数据库列名(如数据库列为user_name,Java字段就必须叫user_name)。
若坚持使用驼峰命名(如userName),必须配合@Column注解并指定name = "user_name",否则JDBC Repository无法完成字段绑定,所有值均为null。
实体类必须提供无参构造函数,且每个字段要有标准getter/setter——这是RowMapper反射填充的硬性前提。
编写JdbcRepository接口
创建接口继承JdbcRepository<User, Long>,泛型中User为实体类,Long为主键类型。
接口上必须标注@Repository,否则Spring容器无法识别并注册该Bean。
方法命名遵循简单规则:直接写findById、findAll、save、deleteById即可生效,无需实现类——这些由Spring Data JDBC在运行时动态代理生成。
若需自定义SQL查询,用@Query注解,SQL语句中参数用:paramName占位,对应方法参数加@Param("paramName");【不支持方法名派生查询中的下划线转驼峰】,例如findByUser_name会被解析为列user_name,但findByUserName将查找不存在的列user_name(除非你手动配置NamingStrategy)。
执行插入与主键回填
调用repository.save(user)前,确保user.getId()为null或0——Starter Data JDBC仅支持AUTO_INCREMENT主键,且要求数据库表定义中明确声明id BIGINT AUTO_INCREMENT PRIMARY KEY。
保存后,user.getId()会自动被赋值为数据库生成的主键,无需手动调用getGeneratedKeys()。
如果主键是UUID或业务生成的字符串,必须改用@Insert + 自定义JdbcTemplate,Starter Data JDBC原生不支持非数字自增主键的回填。
查询列表并映射为对象
方法一:直接调用repository.findAll(),返回List<User>,每条记录按字段名1:1映射。
方法二:用@Query("SELECT * FROM users WHERE age > :minAge")定义带条件的查询,参数传入Map.of("minAge", 18)或单个@Param参数。
方法三:若需关联查询(如查用户+部门名称),不能依赖@OneToOne等JPA注解——Starter Data JDBC不处理关联映射。必须手写SQL把所有字段查出来,实体类字段名与结果集列名完全一致,否则缺失字段值为null。

















