Mybatis在Spring boot里面的简单使用

在 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.propertiesapplication.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);
        // 其他数据库操作
    }
}

四、常见问题解决

  1. Mapper 接口未被扫描
    • 方案1:在启动类添加 @MapperScan("com.example.mapper")
    • 方案2:每个 Mapper 接口单独添加 @Mapper 注解
    注意一下包放的位置。每个包

  2. 包的体系结构
    需要严格遵守这个包结构,否则会出现包无法扫描的结果。

     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 字段)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值