SpringBoot集成Mybatis实战指南与最佳实践
目录
Spring Boot 和 MyBatis 的组合,在 Ja va 开发圈里几乎是“标配”级别的存在。Spring Boot 帮你省去了一堆繁琐的配置,让项目快速跑起来;MyBatis 则把 SQL 和 Ja va 代码优雅地解耦,灵活性和可控性都很出色。两者一结合,开发效率直接拉满。接下来,我们就一步步把这个组合装进你的项目里。先放一张整体架构图镇楼:
Spring Boot 集成 MyBatis
介绍
Spring Boot 是快速构建独立生产级应用的绝佳框架,而 MyBatis 作为一款久经考验的持久层框架,能与 Spring Boot 无缝配合,提供强大的数据库操作能力。这篇文章会带你走完整个集成流程,并给出常用的 CRUD 示例——看完后,你也能自己搭一套基础框架。
步骤
步骤一:创建 Spring Boot 项目
第一步,得先有个 Spring Boot 项目。推荐用 Spring Initializr 快速生成骨架,选好你需要的依赖和版本,一把梭。
步骤二:添加依赖
项目生成后,在 pom.xml 里补上 MyBatis 和数据库驱动的依赖。下面是一个最小依赖集合:
org.springframework.boot
spring-boot-starter-web
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.2.0
com.h2database
h2
runtime
注意:如果实际使用 MySQL,记得把 h2 换成 mysql-connector-ja va,版本号别搞错。
步骤三:配置数据库连接
在 application.properties 或 application.yml 中配置数据源。以 MySQL 为例:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
别忘了告诉 MyBatis 你的 Mapper XML 文件在哪儿,否则启动时会报绑定失败的错误:
mybatis.mapper-locations=classpath:mapping/*.xml
这一步是常见的坑,很多新手会忽略这个配置。
步骤四:创建实体类
写一个 POJO,映射数据库表字段。比如一个简单的 User 类:
public class User {
private Long id;
private String username;
private String password;
// 其他字段...
// getter 和 setter 方法...
}
字段类型尽量和表结构保持一致,主键推荐用包装类 Long 而不是基本类型 long,方便判断 null 值。
步骤五:创建 Mapper 接口
定义一个 Mapper 接口,声明数据库操作方法。注意是接口,不是类:
public interface UserMapper {
void insert(User user);
void update(User user);
void delete(Long id);
User findById(Long id);
List findAll();
}
方法名和参数类型看着来,后面 XML 文件里会一一对应。
步骤六:创建 Mapper XML 文件
在 resources/mapping/ 目录下新建 UserMapper.xml(名称和接口对应),写入 SQL:
INSERT INTO user (username, password) VALUES (#{username}, #{password})
UPDATE user SET username=#{username}, password=#{password} WHERE id=#{id}
DELETE FROM user WHERE id=#{id}
namespace 必须写接口的全限定名,id 对应方法名,parameterType 和 resultType 别写错。
步骤七:编写 Service 层
Service 层负责业务逻辑,通过注入 Mapper 来操作数据库。先定接口:
public interface UserService {
void addUser(User user);
void updateUser(User user);
void deleteUser(Long id);
User getUserById(Long id);
List getAllUsers();
}
然后写实现类:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public void addUser(User user) {
userMapper.insert(user);
}
@Override
public void updateUser(User user) {
userMapper.update(user);
}
@Override
public void deleteUser(Long id) {
userMapper.delete(id);
}
@Override
public User getUserById(Long id) {
return userMapper.findById(id);
}
@Override
public List getAllUsers() {
return userMapper.findAll();
}
}
注意要给实现类加上 @Service 注解,让它被 Spring 管理;@Autowired 注入 Mapper,如果报错可以检查一下 @MapperScan 有没有配。
步骤八:编写 Controller 层
最后写一个 REST 接口暴露出去:
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@PostMapping
public void addUser(@RequestBody User user) {
userService.addUser(user);
}
@PutMapping("/{id}")
public void updateUser(@PathVariable Long id, @RequestBody User user) {
user.setId(id);
userService.updateUser(user);
}
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
userService.deleteUser(id);
}
@GetMapping("/{id}")
public User getUserById(@PathVariable Long id) {
return userService.getUserById(id);
}
@GetMapping
public List getAllUsers() {
return userService.getAllUsers();
}
}
这样你就可以通过 POST /users、GET /users/1 等路径来操作数据了。
步骤九:运行项目
启动类上别忘了加 @MapperScan,指定 Mapper 接口所在的包路径,不然 Spring 会找不着 Bean 报异常:
package com.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.demo.dao")
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
大功告成,启动项目,用 Postman 或 curl 测试一下 API 吧。
总结
从创建项目到跑通接口,整个集成过程并不复杂,重点在于配置的正确性和代码结构的清晰度。本文的示例虽然简单,但已经覆盖了最常用的增删改查操作,你完全可以在此基础上扩展出更复杂的业务逻辑。如果遇到问题,欢迎留言讨论。
