MyBatis 集成spring框架

MyBatis 集成 Spring 框架详解

MyBatis 是一个优秀的持久层框架,它通过简单、灵活的 SQL 语句与 Java 对象进行映射,而 Spring 是 Java 生态系统中最流行的框架之一,广泛用于依赖注入(DI)、面向切面编程(AOP)和事务管理等功能。将 MyBatis 集成到 Spring 框架中,能让开发者充分利用 Spring 的强大功能(如事务管理、IOC 容器等),同时使用 MyBatis 进行高效的数据库操作。


1. 项目依赖配置

在 Spring 项目中集成 MyBatis 通常使用 Spring 提供的 MyBatis Starter。下面以 Spring Boot 为例,演示如何通过 Maven 添加 MyBatis 相关依赖。

1.1 添加 Maven 依赖

在 Spring Boot 项目中集成 MyBatis 需要在 pom.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 Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok(可选,简化实体类代码) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
  • spring-boot-starter-web:提供 Spring MVC 功能。
  • mybatis-spring-boot-starter:MyBatis 与 Spring Boot 集成的 Starter,自动配置 MyBatis。
  • mysql-connector-java:MySQL 数据库驱动。
1.2 配置数据库连接

src/main/resources/application.yml 中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver
  mybatis:
    type-aliases-package: com.example.demo.model  # 实体类所在包
    mapper-locations: classpath:mapper/*.xml      # Mapper XML 文件位置
  • datasource.url:数据库连接 URL。
  • type-aliases-package:指定实体类所在的包,用于简化 MyBatis 中的类型映射。
  • mapper-locations:指定 Mapper XML 文件的存放位置。

2. MyBatis 基础配置

在集成 MyBatis 时,通常需要配置实体类、Mapper 接口以及相应的 XML 映射文件。

2.1 创建实体类

假设有一个 User 表,创建对应的实体类 User

package com.example.demo.model;

import lombok.Data;

@Data
public class User {
    private Integer id;
    private String username;
    private String email;
}
2.2 创建 Mapper 接口

在 MyBatis 中,Mapper 接口用于定义与数据库交互的方法。Mapper 接口可以使用注解或者通过 XML 文件进行 SQL 映射。

package com.example.demo.mapper;

import com.example.demo.model.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserMapper {

    @Select("SELECT * FROM user WHERE id = #{id}")
    User getUserById(int id);

    @Select("SELECT * FROM user")
    List<User> getAllUsers();

    @Insert("INSERT INTO user (username, email) VALUES (#{username}, #{email})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    void insertUser(User user);

    @Update("UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}")
    void updateUser(User user);

    @Delete("DELETE FROM user WHERE id = #{id}")
    void deleteUser(int id);
}
  • @Mapper:标注这是一个 MyBatis Mapper 接口,Spring Boot 会自动扫描并注入这些接口。
  • @Select、@Insert、@Update、@Delete:用于执行相应的 SQL 操作。
2.3 使用 XML 配置 Mapper(可选)

除了使用注解,还可以通过 XML 配置 Mapper SQL 语句。在 src/main/resources/mapper/ 目录下创建 UserMapper.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="getUserById" resultType="com.example.demo.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>

    <select id="getAllUsers" resultType="com.example.demo.model.User">
        SELECT * FROM user
    </select>

    <insert id="insertUser" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO user (username, email) VALUES (#{username}, #{email})
    </insert>

    <update id="updateUser">
        UPDATE user SET username = #{username}, email = #{email} WHERE id = #{id}
    </update>

    <delete id="deleteUser">
        DELETE FROM user WHERE id = #{id}
    </delete>

</mapper>

UserMapper.java 中,不需要再使用 SQL 注解,而是通过 XML 文件进行 SQL 映射。


3. 使用 MyBatis 与 Spring 进行数据库操作

MyBatis 与 Spring 集成后,Spring 可以自动管理 Mapper 的实例,可以通过依赖注入来调用数据库操作方法。

3.1 创建服务类

服务类中调用 UserMapper 接口来执行数据库操作。

package com.example.demo.service;

import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public User getUserById(int id) {
        return userMapper.getUserById(id);
    }

    public List<User> getAllUsers() {
        return userMapper.getAllUsers();
    }

    public void createUser(User user) {
        userMapper.insertUser(user);
    }

    public void updateUser(User user) {
        userMapper.updateUser(user);
    }

    public void deleteUser(int id) {
        userMapper.deleteUser(id);
    }
}
3.2 创建控制器

为了通过 REST API 调用数据库操作,创建一个简单的控制器:

package com.example.demo.controller;

import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public User getUserById(@PathVariable int id) {
        return userService.getUserById(id);
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.createUser(user);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable int id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable int id) {
        userService.deleteUser(id);
    }
}
  • @RestController:标注这是一个 REST 控制器。
  • @RequestMapping:定义基础 URL 路径。
  • @GetMapping@PostMapping 等注解用于处理 HTTP 请求。

4. 事务管理

Spring 提供了强大的事务管理功能,结合 MyBatis 可以轻松管理数据库事务。通常,我们可以通过 @Transactional 注解来声明事务。

4.1 在服务类中声明事务

在需要事务管理的方法或类上添加 @Transactional 注解,Spring 会自动管理事务的提交和回滚。

import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    @Transactional
    public void createUserAndLog(User user) {
        userMapper.insertUser(user);
        // 如果某个操作发生异常,整个事务将回滚
        // 例如日志写入失败,user 数据库插入也会回滚
        logMapper.insertLog(user.getId(), "User created");
   

 }
}
  • 事务回滚:当发生异常时,事务会自动回滚,确保数据库的一致性。

5. MyBatis 缓存与日志

5.1 MyBatis 一级缓存与二级缓存
  • 一级缓存:MyBatis 的默认缓存机制,作用范围是 SqlSession,同一个 SqlSession 内的查询会被缓存。
  • 二级缓存:可选的全局缓存,需要在 Mapper 中显式开启,通过 @CacheNamespace<cache> 配置启用。
5.2 日志配置

可以通过配置日志框架(如 SLF4J 和 Logback)来记录 MyBatis 的 SQL 执行情况。将日志级别设置为 DEBUG,可以查看每条 SQL 的执行详情。

logging:
  level:
    org.apache.ibatis: DEBUG

logback.xml 中配置 MyBatis 日志:

<logger name="org.apache.ibatis" level="DEBUG" additivity="false">
    <appender-ref ref="STDOUT"/>
</logger>

6. 总结

MyBatis 与 Spring 的集成为开发者提供了强大的数据持久化解决方案。通过 MyBatis,开发者可以灵活地编写 SQL 并进行高效的数据库交互,而 Spring 的事务管理、依赖注入、AOP 等功能则增强了持久层的管理能力。在实际项目中,可以根据业务需求选择注解或 XML 方式进行 SQL 映射,并利用 Spring 的强大功能实现数据操作的稳定性和可维护性。

集成 Spring 与 MyBatis 的关键步骤包括:

  • 配置数据库连接和 MyBatis 相关依赖。
  • 使用注解或 XML 定义 Mapper 接口和 SQL 语句。
  • 在服务层使用 @Transactional 进行事务管理,保证数据一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying_Fish_Xuan

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值