1. 项目概述:基于IDEA的SpringBoot+MyBatis+MySQL工程搭建
十年前我第一次用Eclipse配置SSH框架时,花了整整三天时间处理jar包冲突。如今SpringBoot的自动化配置让Java后端开发效率提升了十倍不止,但新手在IDEA中整合SpringBoot、MyBatis和MySQL时仍会遇到各种"坑"。本文将分享一套经过50+项目验证的标准化搭建流程,包含版本选型、自动生成、配置优化等实战经验。
这个技术栈组合特别适合需要快速迭代的中小型Web项目,比如电商后台、OA系统或数据管理平台。SpringBoot负责依赖管理和应用组装,MyBatis处理数据库交互,MySQL作为持久化存储,三者通过IDEA的智能支持形成高效开发闭环。接下来我会从环境准备到功能测试完整走一遍流程,重点说明那些官方文档没写的实操细节。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与工具选型
2.1 开发环境配置清单
以下是经过兼容性验证的环境组合(2024年最新推荐):
markdown复制| 组件 | 推荐版本 | 备注 |
|----------------|------------|-------------------------------|
| IntelliJ IDEA | 2023.3+ | 需安装Spring Assistant插件 |
| JDK | 17 | 长期支持版(LTS) |
| SpringBoot | 3.1.5 | 注意groupId改为jakarta |
| MyBatis | 3.0.3 | 需配套mybatis-spring 3.0.3 |
| MySQL | 8.0.33 | 社区版即可 |
| Maven | 3.9.5 | 配置阿里云镜像 |
重要提示:SpringBoot 3.x开始javax包已迁移至jakarta,与旧版本不兼容。如果团队使用JDK8,需降级到SpringBoot 2.7.x版本。
2.2 IDEA必要插件安装
在Settings > Plugins中搜索安装:
- Spring Assistant - 官方Spring项目支持
- MyBatisX - XML与接口方法跳转
- Lombok - 自动生成getter/setter
- Database Tools - 内置数据库客户端
安装后建议重启IDEA,我在多个项目中发现不重启可能导致MyBatisX的XML映射识别异常。
3. 工程创建与基础配置
3.1 初始化SpringBoot项目
- 使用IDEA的Spring Initializr(不是普通的Maven项目)
- 关键依赖选择:
- Spring Web
- MyBatis Framework
- MySQL Driver
- Lombok
生成后检查pom.xml是否包含以下依赖(注意scope配置):
xml复制<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
3.2 数据库连接配置
在application.yml中配置(比properties文件更易读):
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
踩坑记录:MySQL 8.0必须指定serverTimezone参数,否则会报时区错误。useSSL=false在开发环境可关闭加密提升性能。
4. MyBatis集成与代码生成
4.1 逆向工程配置
推荐使用MyBatis Generator插件自动生成实体类和Mapper:
- 在pom.xml中添加:
xml复制<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.4.2</version>
</plugin>
- 创建generatorConfig.xml:
xml复制<context id="DB2Tables" targetRuntime="MyBatis3">
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/demo"
userId="root"
password="123456">
</jdbcConnection>
<javaModelGenerator targetPackage="com.example.demo.entity"
targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper"
targetProject="src/main/resources"/>
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.example.demo.mapper"
targetProject="src/main/java"/>
<table tableName="%">
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
- 执行生成命令:
bash复制mvn mybatis-generator:generate
4.2 手动编写Mapper的注意事项
当需要自定义SQL时:
- 接口方法添加@Mapper注解
- XML文件放在resources/mapper目录
- 参数传递推荐使用@Param注解:
java复制List<User> selectByCondition(@Param("name") String name,
@Param("status") Integer status);
对应的XML写法:
xml复制<select id="selectByCondition" resultType="User">
SELECT * FROM user
WHERE 1=1
<if test="name != null">
AND name LIKE CONCAT('%',#{name},'%')
</if>
<if test="status != null">
AND status = #{status}
</if>
</select>
5. 业务层与控制器开发
5.1 Service层最佳实践
建议采用接口+实现类的模式:
java复制public interface UserService {
User getUserById(Long id);
}
@Service
@RequiredArgsConstructor // Lombok生成构造器
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
@Override
@Transactional(readOnly = true)
public User getUserById(Long id) {
return userMapper.selectByPrimaryKey(id);
}
}
技巧:@Transactional注解最好加在实现类而非接口上,因为Spring的AOP代理机制对接口方法的注解支持不完善。
5.2 Controller的RESTful规范
使用SpringBoot的@RestController:
java复制@RestController
@RequestMapping("/api/users")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@GetMapping("/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
return ResponseEntity.ok(userService.getUserById(id));
}
@PostMapping
public ResponseEntity<Void> createUser(@Valid @RequestBody UserDTO userDTO) {
// 创建逻辑
return ResponseEntity.created(URI.create("/")).build();
}
}
验证参数建议使用Hibernate Validator:
java复制@Data
public class UserDTO {
@NotBlank
@Size(max = 20)
private String username;
@Email
private String email;
}
6. 调试与性能优化
6.1 SQL日志打印配置
开发阶段开启MyBatis日志:
yaml复制logging:
level:
com.example.demo.mapper: debug
更详细的SQL日志(显示参数值):
properties复制mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
6.2 连接池调优
默认的HikariCP配置建议调整:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
idle-timeout: 30000
max-lifetime: 1800000
connection-timeout: 30000
经验值:连接数 = (核心数 * 2) + 有效磁盘数。例如4核服务器建议设置10-20个连接。
7. 常见问题解决方案
7.1 字段映射问题
问题现象:查询结果中某些字段为null
解决方法:
- 确认数据库字段名与实体类属性名对应
- 添加@Results注解或配置map-underscore-to-camel-case
- 检查MySQL的tinyint(1)是否被误认为Boolean
7.2 事务失效场景
典型场景:
- 方法内部调用:this.method()
- 异常被捕获未抛出
- 非public方法
- 数据库引擎不支持(如MyISAM)
解决方案:
java复制// 正确的事务用法示例
@Service
public class OrderService {
@Transactional
public void createOrder(OrderDTO dto) {
// 主逻辑
}
}
7.3 分页查询实现
使用PageHelper插件:
- 添加依赖:
xml复制<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
- 控制器中使用:
java复制@GetMapping
public PageInfo<User> listUsers(@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size) {
PageHelper.startPage(page, size);
return new PageInfo<>(userService.listAll());
}
8. 项目结构规范建议
推荐的分层结构:
code复制src/main/java
├── com.example.demo
│ ├── config # 配置类
│ ├── controller # 控制器
│ ├── service # 服务层
│ ├── mapper # 数据访问
│ ├── entity # 实体类
│ ├── dto # 数据传输对象
│ └── DemoApplication.java
src/main/resources
├── application.yml
├── mapper # MyBatis XML
└── static # 静态资源
对于复杂项目可以按功能模块划分:
code复制com.example.demo
├── module1
│ ├── controller
│ ├── service
│ └── mapper
└── module2
├── controller
└── service
在IDEA中开发时,我习惯开启"自动编译"功能(Build > Compile Automatically),配合DevTools的热部署,修改代码后1-2秒即可看到变化。对于MyBatis XML文件,需要手动Rebuild Project(Ctrl+F9)才能生效,这是很多开发者容易忽略的点。
