springboot中mybatis如何写
时间: 2025-07-20 15:16:26 浏览: 2
<think>我们正在讨论如何在Spring Boot项目中配置和使用MyBatis。根据用户的问题,他想要知道如何编写MyBatis相关的代码,包括配置和基本使用。
根据引用[1][2][3],我们知道在Spring Boot中使用MyBatis可以简化配置,主要依赖mybatis-spring-boot-starter。
我们将按照以下步骤进行:
1. 添加依赖
2. 配置数据源和MyBatis
3. 创建实体类(Entity)
4. 创建Mapper接口(使用注解或XML)
5. 在Service层调用Mapper
6. 编写测试
注意:引用[2]提到,使用mybatis-spring-boot-starter可以简化配置,我们不需要像传统SSM那样写大量的XML配置。
步骤详细说明:
1. 添加依赖(以Maven为例):
在pom.xml中添加以下依赖(版本号根据实际情况选择,这里使用引用[2]中提到的版本):
```xml
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<!-- 数据库驱动,比如MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
```
2. 配置数据源和MyBatis:
在application.properties(或application.yml)中配置数据源和MyBatis相关属性:
```properties
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# MyBatis配置:指定mapper.xml文件的位置(如果使用XML方式),实体类包路径
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
# 开启驼峰命名转换(数据库下划线字段转实体类驼峰属性)
mybatis.configuration.map-underscore-to-camel-case=true
```
3. 创建实体类:
```java
package com.example.demo.entity;
public class User {
private Long id;
private String name;
private String email;
// 省略getter/setter和toString
}
```
4. 创建Mapper接口:
有两种方式:注解方式和XML方式。这里先展示注解方式:
```java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper // 表示这是一个MyBatis的Mapper接口,Spring Boot启动时会自动扫描并生成实现
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO user(name, email) VALUES(#{name}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 获取自增主键
void insert(User user);
@Update("UPDATE user SET name=#{name}, email=#{email} WHERE id=#{id}")
void update(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
void delete(Long id);
// 复杂SQL建议用XML方式,这里仅作示例
@Select("SELECT * FROM user")
List<User> findAll();
}
```
如果使用XML方式,则需要在resources/mapper目录下创建对应的XML文件(如UserMapper.xml):
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.UserMapper">
<select id="findById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 其他SQL语句 -->
</mapper>
```
5. 创建Service层:
按照之前的最佳实践,我们定义接口和实现类,并注入Mapper:
```java
public interface UserService {
User findById(Long id);
void save(User user);
// 其他方法
}
@Service
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
// 构造器注入
public UserServiceImpl(UserMapper userMapper) {
this.userMapper = userMapper;
}
@Override
public User findById(Long id) {
return userMapper.findById(id);
}
@Override
public void save(User user) {
// 这里可以添加业务逻辑
userMapper.insert(user);
}
}
```
6. 测试:
可以编写单元测试或集成测试。这里使用Spring Boot的集成测试:
```java
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void testFindById() {
User user = userService.findById(1L);
assertNotNull(user);
}
}
```
注意:如果使用XML方式,确保Mapper接口和XML文件对应(同包同名,或者通过配置指定位置),并且XML文件被正确放置在resources/mapper目录下。
另外,如果不想在每个Mapper接口上写@Mapper注解,可以在启动类上添加@MapperScan注解来扫描整个包:
```java
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 指定Mapper接口所在的包
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
总结:
- 添加mybatis-spring-boot-starter依赖
- 配置数据源和MyBatis属性
- 使用@Mapper注解或@MapperScan扫描Mapper接口
- 在Mapper接口中使用注解或XML编写SQL
- 在Service中调用Mapper
通过以上步骤,就可以在Spring Boot项目中集成MyBatis并进行开发了。
相关问题:
1. 如何在MyBatis中实现动态SQL?
2. MyBatis的注解方式和XML方式各有什么优缺点?
3. Spring Boot中如何配置MyBatis的多数据源?</think>### Spring Boot 中 MyBatis 的配置与使用指南
#### 一、添加依赖(核心步骤)
在 `pom.xml` 中添加 MyBatis 启动器和数据库驱动(以 MySQL 为例):
```xml
<dependencies>
<!-- MyBatis 启动器 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
<!-- MySQL 驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
```
> 注意:`mybatis-spring-boot-starter` 已包含 MyBatis 核心库,无需单独添加 [^2]。
#### 二、配置数据源
在 `application.yml` 中配置数据库连接:
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: yourpassword
driver-class-name: com.mysql.cj.jdbc.Driver
# MyBatis 配置
mybatis:
mapper-locations: classpath:mapper/*.xml # XML映射文件位置
type-aliases-package: com.example.entity # 实体类包路径
configuration:
map-underscore-to-camel-case: true # 开启下划线转驼峰
```
#### 三、创建实体类
```java
// User.java
public class User {
private Long id;
private String userName; // 自动映射数据库 user_name 字段
private String email;
// getter/setter 省略
}
```
#### 四、创建 Mapper 接口
```java
@Mapper // 关键注解:标识为 MyBatis 映射器
public interface UserMapper {
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO users(user_name, email) VALUES(#{userName}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id") // 获取自增主键
void insert(User user);
// 复杂查询建议使用 XML 映射
List<User> findUsersByCondition(Map<String, Object> params);
}
```
#### 五、创建 XML 映射文件
在 `resources/mapper/UserMapper.xml` 中:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
<select id="findUsersByCondition" resultType="User">
SELECT * FROM users
<where>
<if test="userName != null">
AND user_name LIKE CONCAT('%', #{userName}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
</mapper>
```
#### 六、创建 Service 层
```java
@Service
public class UserService {
private final UserMapper userMapper;
// 构造器注入(推荐)
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Long id) {
return userMapper.findById(id);
}
public void createUser(User user) {
userMapper.insert(user);
}
public List<User> searchUsers(String keyword) {
Map<String, Object> params = new HashMap<>();
params.put("userName", keyword);
return userMapper.findUsersByCondition(params);
}
}
```
#### 七、事务管理
在 Service 方法上添加事务注解:
```java
@Transactional
public void createUserWithProfile(User user, UserProfile profile) {
userMapper.insert(user);
profileMapper.insert(profile); // 原子操作
}
```
#### 八、常见问题解决
1. **Mapper 未被扫描**:在启动类添加 `@MapperScan`
```java
@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描 Mapper 包
public class Application { ... }
```
2. **XML 未加载**:检查 `mybatis.mapper-locations` 路径是否正确
3. **驼峰命名失效**:确认配置中开启 `map-underscore-to-camel-case`
> 完整项目结构示例:
```
src
├── main
│ ├── java
│ │ └── com.example
│ │ ├── entity # 实体类
│ │ ├── mapper # Mapper接口
│ │ └── service # 服务层
│ └── resources
│ ├── mapper # XML映射文件
│ └── application.yml
```
### 最佳实践总结
1. **接口与实现分离**:Mapper 接口定义 SQL 契约
2. **简单SQL用注解**:`@Select`/`@Insert` 简化配置
3. **复杂SQL用XML**:动态 SQL 建议写在 XML 中
4. **事务控制**:在 Service 层使用 `@Transactional`
5. **依赖注入**:通过构造器注入 Mapper [^2]
---
### 相关问题
1. MyBatis 中如何实现多表关联查询?
2. MyBatis 的一级缓存和二级缓存有什么区别?
3. 如何在 MyBatis 中实现分页查询?
4. MyBatis-Plus 相比原生 MyBatis 有哪些优势?[^2]
阅读全文
相关推荐

















