在 Spring Boot 项目中整合 MyBatis 实现 Mapper 层开发,需遵循以下核心步骤和关键实现细节,结合多个最佳实践案例:
一、项目基础配置
1. 添加依赖
在 pom.xml
中引入 MyBatis 核心依赖及数据库驱动:
<!-- MyBatis Spring Boot Starter -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version> <!-- 根据Spring Boot版本选择,需要符合Spring boot版本号 -->
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2. 数据源配置
在 application.properties
或 application.yml
中配置数据库连接和 MyBatis 参数,修改一下配置,数据库名称,密码,用户:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
mapper-locations: classpath:mapper/*.xml # XML映射文件路径
type-aliases-package: com.example.model # 实体类包别名
configuration:
map-underscore-to-camel-case: true # 字段名驼峰转换
二、Mapper 层实现方式
1. 注解方式(适合简单SQL)
通过 @Mapper
或 @MapperScan
声明接口,并直接编写 SQL 注解:
@Mapper
public interface UserMapper {
// 查询所有用户(@Results处理字段映射)
@Select("SELECT id, user_name, create_time FROM user")
@Results({
@Result(property = "userName", column = "user_name"),
@Result(property = "createTime", column = "create_time")
})
List<User> findAll();
// 动态参数插入(@Param绑定参数)
@Insert("INSERT INTO user(user_name, password) VALUES(#{name}, #{pwd})")
int insert(@Param("name") String name, @Param("pwd") String password);
}
优势:代码简洁,无需 XML 文件;局限:复杂 SQL 或动态条件处理不便。
2. XML 方式(推荐复杂场景)
• Step 1:定义接口
@Mapper
public interface UserMapper {
User findById(Long id);
int updateUser(User user);
}
• Step 2:创建 XML 映射文件(resources/mapper/UserMapper.xml
)
<mapper namespace="com.example.mapper.UserMapper">
<select id="findById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<update id="updateUser" parameterType="User">
UPDATE user
<set>
<if test="userName != null">user_name = #{userName},</if>
<if test="password != null">password = #{password}</if>
</set>
WHERE id = #{id}
</update>
</mapper>
优势:支持动态 SQL(如 <if>
、<choose>
标签),便于维护复杂查询。
三、关键实现细节
1. 实体类映射
• 字段名映射:通过 @Result
注解或 XML 的 <resultMap>
解决数据库字段与实体类属性不一致问题。
• Lombok 简化代码:使用 @Data
注解自动生成 Getter/Setter(需添加 Lombok 依赖)。
2. 动态 SQL 实现
在 XML 中使用 MyBatis 动态标签:
<select id="findByCondition" resultType="User">
SELECT * FROM user
<where>
<if test="name != null">AND user_name LIKE #{name}</if>
<if test="minAge != null">AND age >= #{minAge}</if>
</where>
</select>
支持条件分支、循环等复杂逻辑。
3. 事务管理
在 Service 层添加 @Transactional
注解实现事务控制:
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
@Transactional
public void updateUserWithTx(User user) {
userMapper.updateUser(user);
// 其他数据库操作
}
}
四、常见问题解决
-
Mapper 接口未被扫描
• 方案1:在启动类添加@MapperScan("com.example.mapper")
• 方案2:每个 Mapper 接口单独添加@Mapper
注解
注意一下包放的位置。每个包 -
包的体系结构
需要严格遵守这个包结构,否则会出现包无法扫描的结果。src/ ├── main/ │ ├── java/ │ │ └── com.example/ │ │ ├── controller/ # 表示层 │ │ ├── service/ # 业务逻辑层 │ │ ├── mapper/ # 数据访问层接口 │ │ └── entity/ # 数据库实体 │ └── resources/ │ ├── mapper/ # MyBatis XML文件 │ ├── application.yml # 全局配置 │ └── mybatis-config.xml # 高级配置(可选) └── test/ # 单元测试
五、总结
• 注解 vs XML:简单查询优先用注解,复杂动态 SQL 用 XML
• 性能优化:结合二级缓存、批量操作(@Options
注解)提升效率
• 扩展性:通过自定义 TypeHandler 处理特殊数据类型(如 JSON 字段)