
1. 从零搭建SpringBootMyBatisMySQL工程全指南刚入行Java后端开发时我最头疼的就是搭建开发环境。各种框架整合、配置项调试往往要耗费大半天时间直到掌握了IDEASpringBootMyBatis这套黄金组合。现在我用10分钟就能跑通一个基础工程这套方法论已经帮助团队新人节省了数百小时的搭建时间。这个技术栈之所以成为企业级开发标配关键在于SpringBoot的自动配置让项目初始化变得极其简单MyBatis在SQL灵活性和开发效率间取得了完美平衡IDEA作为Java开发神器提供了从编码到调试的全套工具链下面我就用最新版的工具链IDEA 2024.1 SpringBoot 3.2 MyBatis 3.5带你完整走一遍企业级项目的搭建流程。文末还会分享我总结的5个避坑技巧这些都是在生产环境踩过坑才积累的经验。2. 环境准备与工具选型2.1 开发环境配置清单先确认你的基础环境符合这些版本要求版本不匹配是80%搭建失败的根源组件推荐版本验证方式JDK17java -versionIDEA2024.1关于对话框查看版本号MySQL8.0SELECT VERSION();Maven3.9.5mvn -v特别注意SpringBoot 3.x必须使用JDK 17这是很多新手容易忽略的硬性要求。我曾见过同事用JDK 11折腾半天无法启动的案例。2.2 IDEA必要插件安装这几个插件能显著提升开发效率建议在开始前通过Settings Plugins安装MyBatisXMapper接口与XML文件智能跳转Lombok自动生成getter/setter等样板代码Database Tools可视化操作MySQL数据库Spring AssistantSpring项目专用增强工具安装后记得重启IDEA生效。有次我忘记重启导致MyBatisX的跳转功能失效白白浪费了半小时排查。3. 项目创建与基础配置3.1 初始化SpringBoot项目在IDEA中使用Spring Initializr创建项目时这几个选项需要特别注意打包方式选Maven企业项目主流选择Java版本选17与SpringBoot 3.x强关联依赖项至少包含Spring WebMyBatis FrameworkMySQL DriverLombok小技巧不要在这里勾选太多依赖容易引起版本冲突。其他依赖可以后期在pom.xml中手动添加。3.2 关键POM依赖解析创建完成后检查pom.xml的这些关键依赖版本2024年最新稳定版parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version /parent dependencies !-- 持久层相关 -- dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version3.0.3/version /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency !-- 开发工具 -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency /dependencies注意mybatis-spring-boot-starter已经包含了MyBatis核心和Spring整合包不需要单独引入MyBatis依赖这是新手常见的冗余配置问题。4. 数据库配置与MyBatis整合4.1 MySQL连接配置在application.yml中配置数据库连接生产环境建议用application-prod.ymlspring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo_db?useSSLfalseserverTimezoneAsia/Shanghai username: root password: 123456 mybatis: mapper-locations: classpath:mapper/*.xml configuration: map-underscore-to-camel-case: true关键配置说明useSSLfalse本地开发可以关闭SSL加密提升性能serverTimezone必须设置时区否则会有时区转换错误map-underscore-to-camel-case开启字段自动驼峰转换4.2 实体类与Mapper编写使用Lombok简化实体类代码Data Table(name user) public class User { Id private Long id; private String username; private LocalDateTime createTime; }Mapper接口建议这样组织Mapper public interface UserMapper { Select(SELECT * FROM user WHERE id #{id}) User selectById(Long id); Insert(INSERT INTO user(username) VALUES(#{username})) Options(useGeneratedKeys true, keyProperty id) int insert(User user); }经验简单的SQL可以直接用注解方式复杂查询再使用XML配置。我见过有人把所有SQL都写在XML里导致项目结构过于复杂。5. 服务层与接口开发5.1 服务层实现示例典型的服务层代码结构Service RequiredArgsConstructor public class UserService { private final UserMapper userMapper; public User getUserById(Long id) { return Optional.ofNullable(userMapper.selectById(id)) .orElseThrow(() - new RuntimeException(用户不存在)); } }这里使用了Lombok的RequiredArgsConstructor自动注入Mapper比Autowired更简洁。5.2 控制器开发规范RESTful接口的最佳实践RestController RequestMapping(/api/users) RequiredArgsConstructor public class UserController { private final UserService userService; GetMapping(/{id}) public ResultUser getById(PathVariable Long id) { return Result.success(userService.getUserById(id)); } // 统一返回封装 Data AllArgsConstructor public static class ResultT { private int code; private T data; private String message; public static T ResultT success(T data) { return new Result(200, data, success); } } }6. 常见问题排查指南6.1 高频错误解决方案错误现象可能原因解决方案启动时报DataSource配置错误数据库连接参数错误检查url中的数据库名、用户名密码确认MySQL服务已启动MyBatis映射文件找不到mapper-locations路径配置错误确认resources/mapper目录存在且yml配置路径匹配字段值为null数据库字段与实体类命名不匹配开启map-underscore-to-camel-case或使用Result注解显式映射插入记录后id不返回未配置主键回写添加Options(useGeneratedKeys true, keyProperty id)注解时区异常未指定serverTimezone在jdbc url中添加serverTimezoneAsia/Shanghai6.2 性能优化建议连接池配置生产环境务必配置HikariCP连接池spring: datasource: hikari: maximum-pool-size: 20 connection-timeout: 30000SQL监控开发阶段开启MyBatis日志logging: level: com.example.mapper: debug批量操作使用MyBatis的InsertProvider实现批量插入InsertProvider(type UserSqlProvider.class, method batchInsert) void batchInsert(ListUser users);7. 项目结构优化建议标准的Maven项目结构应该如下src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ ├── config/ # 配置类 │ │ ├── controller/ # 控制器 │ │ ├── service/ # 服务层 │ │ ├── mapper/ # 数据访问层 │ │ ├── model/ # 实体类 │ │ └── Application.java │ └── resources/ │ ├── mapper/ # MyBatis映射文件 │ ├── static/ # 静态资源 │ ├── templates/ # 模板文件 │ └── application.yml └── test/ # 测试代码特别提醒Mapper接口和XML文件建议放在不同目录但保持同名这是MyBatis的推荐做法可以避免很多奇怪的加载问题。8. 进阶技巧与避坑指南多数据源配置当需要连接多个数据库时这样配置Configuration MapperScan(basePackages com.example.mapper.db1, sqlSessionFactoryRef db1SqlSessionFactory) public class Db1Config { Bean ConfigurationProperties(spring.datasource.db1) public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } // 需要为每个数据源单独配置SqlSessionFactory }动态表名处理在XML中使用script标签实现select idselectByTable resultTypeUser ![CDATA[ SELECT * FROM ${tableName} WHERE id #{id} ]] /select枚举类型处理实现MyBatis的TypeHandler接口public class StatusTypeHandler implements TypeHandlerStatusEnum { Override public void setParameter(...) { ps.setInt(i, parameter.getCode()); } // 其他方法实现... }SQL注入防范永远不要这样写Select(SELECT * FROM user WHERE whereClause) // 危险 ListUser selectByCondition(String whereClause);事务管理在服务层添加事务注解Transactional(rollbackFor Exception.class) public void createUser(User user) { // 多个数据库操作 }这套技术栈我已经在5个生产项目中验证过稳定性最近一个日活10万的系统也是基于这个架构。刚开始可能会觉得配置项很多但熟悉后你会发现这已经是Java生态中最简洁高效的组合方案了。