springboost 创建mapper
时间: 2025-07-19 14:35:19 浏览: 3
<think>我们使用Spring Boot和MyBatis框架来创建Mapper。在Spring Boot中整合MyBatis,通常需要以下步骤:
1. 添加依赖
2. 配置数据源
3. 创建实体类(POJO)
4. 创建Mapper接口
5. 创建Mapper XML文件(或使用注解)
6. 在启动类上添加Mapper扫描
下面是一个完整的示例:
### 步骤1:添加依赖
在`pom.xml`中添加MyBatis和数据库驱动依赖(这里以MySQL为例):
```xml
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
<!-- MySQL Driver -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok (可选) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
```
### 步骤2:配置数据源
在`application.properties`或`application.yml`中配置数据源:
```properties
# application.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
mybatis.mapper-locations=classpath:mapper/*.xml
# 配置实体类所在的包
mybatis.type-aliases-package=com.example.demo.entity
```
### 步骤3:创建实体类
假设我们有一个`User`实体:
```java
package com.example.demo.entity;
import lombok.Data;
@Data // 使用Lombok,自动生成getter/setter等方法
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
```
### 步骤4:创建Mapper接口
创建一个接口,使用`@Mapper`注解(或者通过启动类扫描):
```java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface UserMapper {
// 查询所有用户
List<User> findAll();
// 根据ID查询用户
User findById(Long id);
// 插入用户
int insert(User user);
// 更新用户
int update(User user);
// 删除用户
int delete(Long id);
}
```
### 步骤5:创建Mapper 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.demo.mapper.UserMapper">
<resultMap id="BaseResultMap" type="User">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="name" property="name" jdbcType="VARCHAR"/>
<result column="age" property="age" jdbcType="INTEGER"/>
<result column="email" property="email" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id, name, age, email
</sql>
<select id="findAll" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM user
</select>
<select id="findById" parameterType="Long" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List" />
FROM user
WHERE id = #{id}
</select>
<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO user (name, age, email)
VALUES (#{name}, #{age}, #{email})
</insert>
<update id="update" parameterType="User">
UPDATE user
SET
name = #{name},
age = #{age},
email = #{email}
WHERE id = #{id}
</update>
<delete id="delete" parameterType="Long">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
```
### 步骤6:在启动类上添加Mapper扫描(如果使用@Mapper注解则不需要)
如果不在每个Mapper接口上添加`@Mapper`注解,可以在启动类上添加`@MapperScan`注解:
```java
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 指定Mapper接口所在的包
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
### 使用注解方式(可选)
如果不使用XML,也可以使用注解方式,例如:
```java
@Mapper
public interface UserMapper {
@Select("SELECT * FROM user")
List<User> findAll();
@Select("SELECT * FROM user WHERE id = #{id}")
User findById(Long id);
@Insert("INSERT INTO user(name, age, email) VALUES(#{name}, #{age}, #{email})")
@Options(useGeneratedKeys = true, keyProperty = "id")
int insert(User user);
@Update("UPDATE user SET name=#{name}, age=#{age}, email=#{email} WHERE id=#{id}")
int update(User user);
@Delete("DELETE FROM user WHERE id=#{id}")
int delete(Long id);
}
```
### 测试Mapper
可以编写一个Service和Controller来测试,或者使用单元测试:
```java
@SpringBootTest
class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
void testFindAll() {
List<User> users = userMapper.findAll();
Assert.notNull(users, "查询失败");
users.forEach(System.out::println);
}
}
```
### 常见问题解决
1. **Mapper接口无法注入**:确保使用了`@Mapper`或在启动类上使用了`@MapperScan`。
2. **XML文件未找到**:检查`application.properties`中`mybatis.mapper-locations`的配置是否正确。
3. **绑定异常**:检查XML中的`namespace`和`id`是否和Mapper接口一致。
### 总结
通过以上步骤,我们完成了Spring Boot中MyBatis Mapper的创建。使用MyBatis有两种方式:XML配置和注解方式。对于复杂的SQL,推荐使用XML配置,而对于简单的SQL,可以使用注解方式。
§§相关问题§§:
1. 如何在Spring Boot中配置多数据源并创建对应的Mapper?
2. MyBatis的XML映射文件和注解方式各有什么优缺点?
3. 如何实现MyBatis的分页功能?
4. 在Spring Boot中如何整合MyBatis-Plus?</think>### Spring Boot 中创建 MyBatis Mapper 的完整指南
在 Spring Boot 中创建 MyBatis Mapper 需要以下步骤,我将提供完整的实现方案:
#### 1. 添加必要依赖 (`pom.xml`)
```xml
<dependencies>
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<!-- 数据库驱动 (以MySQL为例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Lombok (可选但推荐) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
```
#### 2. 配置数据源 (`application.yml`)
```yaml
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username: root
password: password
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # Mapper XML文件位置
type-aliases-package: com.example.demo.entity # 实体类包路径
configuration:
map-underscore-to-camel-case: true # 自动转换下划线命名到驼峰命名
```
#### 3. 创建实体类
```java
package com.example.demo.entity;
import lombok.Data;
@Data // Lombok注解,自动生成getter/setter
public class User {
private Long id;
private String username;
private String email;
private LocalDateTime createdAt;
}
```
#### 4. 创建 Mapper 接口
```java
package com.example.demo.mapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper // 关键注解:标识这是MyBatis的Mapper接口
public interface UserMapper {
// 方法1:使用注解方式
@Select("SELECT * FROM users WHERE id = #{id}")
User findById(Long id);
// 方法2:使用XML映射方式
List<User> findAll();
// 方法3:带参数的插入
int insert(User user);
// 方法4:带@Param注解的多参数查询
List<User> findByCondition(
@Param("username") String username,
@Param("email") String email
);
}
```
#### 5. 创建 XML 映射文件 (`src/main/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.demo.mapper.UserMapper">
<!-- 查询所有用户 -->
<select id="findAll" resultType="User">
SELECT id, username, email, created_at as createdAt
FROM users
</select>
<!-- 插入用户 -->
<insert id="insert" parameterType="User" useGeneratedKeys="true" keyProperty="id">
INSERT INTO users (username, email, created_at)
VALUES (#{username}, #{email}, #{createdAt})
</insert>
<!-- 条件查询 -->
<select id="findByCondition" resultType="User">
SELECT id, username, email, created_at as createdAt
FROM users
<where>
<if test="username != null">
AND username LIKE CONCAT('%', #{username}, '%')
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
</mapper>
```
#### 6. 创建服务层使用 Mapper
```java
package com.example.demo.service;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.util.List;
@Service
public class UserService {
private final UserMapper userMapper;
// 通过构造器注入Mapper
public UserService(UserMapper userMapper) {
this.userMapper = userMapper;
}
public User getUserById(Long id) {
return userMapper.findById(id);
}
public List<User> getAllUsers() {
return userMapper.findAll();
}
@Transactional // 事务注解
public User createUser(String username, String email) {
User user = new User();
user.setUsername(username);
user.setEmail(email);
user.setCreatedAt(LocalDateTime.now());
userMapper.insert(user);
return user;
}
public List<User> searchUsers(String username, String email) {
return userMapper.findByCondition(username, email);
}
}
```
#### 7. 配置 MyBatis 扫描 (可选)
如果不想在每个Mapper接口上添加`@Mapper`注解,可以在启动类添加扫描:
```java
package com.example.demo;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描指定包下的Mapper接口
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
### 关键点解释
1. **`@Mapper` 注解**:
- 标识接口为 MyBatis Mapper
- Spring Boot 会自动为这些接口创建实现类
2. **两种SQL定义方式**:
- **注解方式**:直接在方法上使用`@Select`、`@Insert`等注解
- **XML方式**:在XML文件中定义复杂SQL和动态SQL
3. **XML映射文件位置**:
- 通过`mybatis.mapper-locations`配置指定
- 建议放在`resources/mapper`目录下
4. **参数处理**:
- 单个参数可直接使用
- 多个参数需使用`@Param`注解
- 对象参数可直接使用属性名
5. **结果映射**:
- `resultType`指定返回的实体类
- `resultMap`可自定义复杂映射关系
- `map-underscore-to-camel-case`自动转换数据库字段命名
6. **事务管理**:
- 在Service层使用`@Transactional`注解
- 确保数据库操作的原子性
### 高级技巧
1. **动态SQL**:
```xml
<update id="updateUser" parameterType="User">
UPDATE users
<set>
<if test="username != null">username = #{username},</if>
<if test="email != null">email = #{email},</if>
</set>
WHERE id = #{id}
</update>
```
2. **结果映射**:
```xml
<resultMap id="userResultMap" type="User">
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="email" column="email"/>
<result property="createdAt" column="created_at"/>
</resultMap>
```
3. **分页查询**:
```java
// 使用PageHelper插件
PageHelper.startPage(1, 10);
List<User> users = userMapper.findAll();
PageInfo<User> pageInfo = new PageInfo<>(users);
```
4. **枚举处理**:
```java
public enum UserStatus {
ACTIVE, INACTIVE, PENDING
}
// 在实体类中使用
private UserStatus status;
```
### 常见问题解决
1. **Mapper接口无法注入**:
- 确保添加了`@Mapper`或`@MapperScan`
- 检查包路径是否正确
2. **XML文件未加载**:
- 检查`application.yml`中的`mybatis.mapper-locations`配置
- 确保XML文件在resources的正确目录下
3. **参数绑定错误**:
- 多个参数必须使用`@Param`注解
- 检查参数名是否与SQL中的占位符一致
4. **字段映射失败**:
- 启用`map-underscore-to-camel-case`
- 使用`<resultMap>`自定义映射关系
阅读全文
相关推荐






