如何在新建Spring Boot应用中使用MySQL已有数据表
已有MySQL生产库对接Spring Boot开发全量查询GET接口流程
1. 项目依赖引入
- 新建Spring Boot项目时引入以下核心依赖:
spring-boot-starter-web:提供Web接口能力mysql-connector-j:MySQL官方驱动- 持久层框架二选一即可:习惯ORM选
spring-boot-starter-data-jpa,习惯简化CRUD选mybatis-plus-boot-starter - 可选引入
lombok简化实体类、方法的冗余代码编写
2. 数据源配置(核心:禁止自动改表)
和新建库表教程的最大区别是,必须关闭所有框架自动建表、自动修改表结构的配置,避免污染生产数据。
以application.yml配置为例:
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://数据库IP:端口/已有生产库名?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false username: 数据库账号 password: 数据库密码 # 使用JPA时必须配置以下项 jpa: hibernate: ddl-auto: none # 禁止Hibernate自动创建、修改、删除表 show-sql: true # 打印运行时SQL,方便调试排查 # 使用MyBatis-Plus时配置以下项 mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true # 自动映射下划线命名字段到驼峰命名属性
注意:连接生产库的账号建议只授予SELECT查询权限,从根源上避免增删改、改表等误操作。
3. 编写实体类映射已有表结构
先登录数据库确认目标表的实际表名、字段名、字段类型、主键规则,实体类的映射规则必须和已有表完全对齐,不能凭记忆编写。
举个例子,假设已有生产表为prod_biz_record,字段包含id(自增主键)、biz_no、content、create_time:
- JPA版本实体类写法:
import jakarta.persistence.*; import lombok.Data; import java.time.LocalDateTime; @Data @Entity @Table(name = "prod_biz_record") // 填写实际的生产表名 public class ProdBizRecord { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 和实际主键规则对齐,自增选IDENTITY,不要随便改生成策略 private Long id; private String bizNo; private String content; private LocalDateTime createTime; }
- MyBatis-Plus版本实体类写法:
import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.time.LocalDateTime; @Data @TableName("prod_biz_record") // 填写实际的生产表名 public class ProdBizRecord { private Long id; private String bizNo; private String content; private LocalDateTime createTime; }
4. 编写分层逻辑实现接口
4.1 数据访问层
- JPA场景:新建Repository接口继承
JpaRepository,无需额外写方法,框架自带全量查询能力
import org.springframework.data.jpa.repository.JpaRepository; public interface ProdBizRecordRepository extends JpaRepository<ProdBizRecord, Long> { }
- MyBatis-Plus场景:新建Mapper接口继承
BaseMapper,添加@Mapper注解
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; @Mapper public interface ProdBizRecordMapper extends BaseMapper<ProdBizRecord> { }
4.2 业务逻辑层
新建Service类,注入数据访问层Bean,实现全量查询逻辑:
import org.springframework.stereotype.Service; import java.util.List; @Service public class ProdBizRecordService { private final ProdBizRecordRepository prodBizRecordRepository; // MyBatis-Plus场景替换为注入ProdBizRecordMapper即可 public ProdBizRecordService(ProdBizRecordRepository prodBizRecordRepository) { this.prodBizRecordRepository = prodBizRecordRepository; } public List<ProdBizRecord> listAll() { // JPA直接调用内置findAll方法查全表 return prodBizRecordRepository.findAll(); // MyBatis-Plus场景调用mapper.selectList(null)即可查全表 } }
4.3 接口层
新建Controller类,编写GET接口:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController @RequestMapping("/api/prod/data") public class ProdDataController { private final ProdBizRecordService prodBizRecordService; public ProdDataController(ProdBizRecordService prodBizRecordService) { this.prodBizRecordService = prodBizRecordService; } @GetMapping("/list") public List<ProdBizRecord> listAllData() { return prodBizRecordService.listAll(); } }
5. 调试与上线注意事项
- 首次调试不要直接连主生产库,建议先连备份库、从库验证SQL逻辑、返回字段是否正确,确认无误再切生产地址。
- 如果目标表数据量超过10万条,禁止直接返回全量数据,必须添加分页参数,避免内存溢出、接口超时、数据库压力过大。
- 不要在实体类中随意添加表关联、非表字段映射注解,避免框架生成冗余SQL拖慢生产库性能。
- 启动项目后访问
http://服务IP:端口/api/prod/data/list即可拿到全表数据。
内容的提问来源于stack exchange,提问作者CokeVoAYCE
相关产品推荐
相关产品推荐

