Spring Boot Mybatis使用详解含示例(值得珍藏)

1. Mybatis介绍

MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs (Plain Old Java Objects, 普通的 Java 对象)映射成数据库中的记录。

以下是 MyBatis 的主要特点:

  1. 简单易学:MyBatis 框架结构简单,学习门槛相对较低,易于上手。
  2. 灵活性强:MyBatis 允许自定义 SQL、存储过程以及高级映射,以满足复杂的业务需求。
  3. 降低耦合度:MyBatis 使得应用程序与数据库实现了解耦,便于代码的模块化管理和维护。
  4. 简化数据库操作:MyBatis 简化了 JDBC 代码的编写,减少了手动设置参数和获取结果集的工作量。
  5. 支持事务管理:MyBatis 可以与 Spring 框架集成,利用 Spring 的事务管理功能,确保数据的完整性和一致性。
  6. 缓存机制:MyBatis 内置了二级缓存机制,可以在一定程度上提高查询效率。
  7. 插件化支持:MyBatis 支持自定义插件,可以对框架进行扩展,满足特定的业务需求。
  8. 支持多数据库操作:MyBatis 可以通过配置文件或注解的方式适配不同的数据库方言,实现对多种数据库的操作。
  9. 良好的社区支持:MyBatis 拥有庞大的用户群体和活跃的社区,可以提供丰富的参考资料和解决方案。
  10. 支持 ActiveMQ 等异步消息队列:通过与异步消息队列集成,MyBatis 可以实现异步数据操作,提高系统的响应速度。

2. Mybatis使用

以下是如何在 Spring Boot 项目中使用 MyBatis 的详细步骤和示例

2.1 添加依赖

首先,你需要在你的 pom.xml 文件中添加 MyBatis 和 MyBatis-Spring 的依赖。

<dependencies>  
      
  
      
    <dependency>  
        <groupId>org.mybatis.spring.bootgroupId>  
        <artifactId>mybatis-spring-boot-starterartifactId>  
        <version>2.2.0version>  
    dependency>  
dependencies>

2.2 配置数据源

application.propertiesapplication.yml 中配置数据源信息。

# application.properties  
spring.datasource.url=jdbc:mysql://localhost:3306/test  
spring.datasource.username=root  
spring.datasource.password=rootpassword  
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

2.3 创建实体类

创建一个实体类来表示数据库中的表。例如,一个用户实体类 User

public class User {  
    private Long id;  
    private String name;  
    private String email;  
    // getters and setters ...  
}

2.4 创建 Mapper 接口

创建一个接口来定义对数据库的操作。使用 MyBatis 的注解来定义 SQL 语句。例如,一个 UserMapper

import org.apache.ibatis.annotations.*;  
import java.util.List;  
import static org.apache.ibatis.annotations.Select.*;  
  
public interface UserMapper {  
    @Select("SELECT * FROM users WHERE id = #{id}")  
    User getUserById(Long id);  
  
    @Select("SELECT * FROM users")  
    List<User> getAllUsers();  
}

2.5 在 Service 或 Controller 中使用 Mapper

你可以在你的 Service 或 Controller 中注入 UserMapper 并使用它。例如,在一个简单的 UserService:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

import static org.springframework.transaction.annotation.Transactional;
import static org.springframework.transaction.annotation.Propagation.*;

@Service("userService")
@Transactional(propagation = REQUIRED)
public class UserService {
    @Autowired
    private UserMapper userMapper;

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

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

3. Mybatis语法

3.1 增删改查

MyBatis 在 XML 文件中定义 SQL 语句时,主要使用以下元素:

  1. :映射器,通常作为根元素使用,它允许你为 SQL 语句定义一个命名空间。
  2. 元素一起使用,以处理集合或数组参数。
  
<insert id="insertUsers" parameterType="list">  
  INSERT INTO users (id, name, email, phone)  
  VALUES  
  <foreach collection="list" item="user" separator=",">  
    (#{user.id}, #{user.name}, #{user.email}, #{user.phone})  
  foreach>  
insert>

  
<resultMap id="userResultMap" type="User">  
  <id property="id" column="id" />  
  <result property="name" column="name" />  
  <result property="email" column="email" />  
  <result property="phone" column="phone" />  
resultMap>  
  
  
<select id="getUsersByList" resultMap="userResultMap">  
  SELECT * FROM users  
  WHERE id IN  
  <foreach collection="list" item="userId" open="(" separator="," close=")">  
    #{userId}  
  foreach>  
select>

在上面的示例中, 元素用于迭代集合。在 元素中,我们指定了集合的名称(list)、每个元素的别名(user)和元素之间的分隔符(,)。然后,我们使用 #{user.id}#{user.name} 等语法来引用每个元素的属性。最后,我们将每个插入语句以逗号分隔的形式列出。

在上面的 元素中,我们使用 元素来迭代传入的集合参数 list 元素的属性指定了集合的名称(list)、每个元素的别名(userId)和元素之间的分隔符(,)。在 元素内部,我们使用 #{userId} 来引用每个元素的属性。

  • 最后,查询语句中的 IN 子句使用了 元素生成的子查询,以匹配传入的集合中的用户ID。
    1. 结果映射:当数据库中的列名与 Java 对象的属性名不匹配时,或者当查询返回多个结果集时,你需要定义结果映射。这可以通过使用 元素来完成。
      
    <resultMap id="userResultMap" type="User">  
      <id property="id" column="id" />  
      <result property="name" column="name" />  
      <result property="email" column="email" />  
      <result property="phone" column="phone" />  
    resultMap>  
      
      
    <select id="getUserById" resultMap="userResultMap">  
      SELECT id, name, email, phone FROM users WHERE id = #{id}  
    select>
    

    在上面的示例中:

    • 首先,我们定义了一个名为 userResultMap 的结果集映射。该映射指定了 Java 对象的属性与数据库表的列之间的对应关系。通过 元素指定主键列,并通过 元素指定其他列。
    • 然后,在