spring 依赖 mybatis使用流程

什么是mybatis

java生态中得半自动ORM框架,设计理念:sql与代码分离,开发者手动写sql并保持对查询的完全控制,框架负责繁琐的jdbc查询和结果映射
核心组件:
sqlSessionFactory:全局唯一,解析配置文件(数据源,mapper,插件),创建sqlSession
sqlSession:线程不安全,代表一次数据库会话,执行sql的入口
Mapperj接口:定义方法,与xml注解sql绑定,由jdk动态代理生成实现类
Configuration:全局配置对象,缓存所有的Mapper语句,类处理器,插件链
Exceutor:sql执行器,封装jdbc操作,支持简单/宠用/批量三种模式
TypeHandler:类型转换器,处理java类型与jdbc类型的映射

使用方式:在mapper.xml里手动编写sql查询语句,然后在service层里调用userMapper进行数据操作
第一步:引入依赖

<!-- Spring Boot 项目 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>

<!-- 数据库驱动 -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
</dependency>

<!-- 连接池(Spring Boot 默认已集成 HikariCP,无需额外引入) -->

第二步:在xml里配置数据源(mybatis支持多数据源,可以自己写一个配置类实现数据库源的切换)也可以自己编写mybatis-confige.xml,springboot默认从yml读取,如果使用mybatis-plus则需要修改对应的mybatis-confige.xml去执行一些事情(比如使用插件的时候是否生成对象)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5

# MyBatis 专属配置
mybatis:
  mapper-locations: classpath:mapper/*.xml    # XML 映射文件路径
  type-aliases-package: com.example.entity    # 实体类别名包(可选,简化 XML 中全限定名)
  configuration:
    map-underscore-to-camel-case: true        # 自动驼峰转换(下划线列名 → 驼峰字段)
    cache-enabled: true                       # 二级缓存开关
    lazy-loading-enabled: true                # 延迟加载

根据数据库表的字段信息创建java实体类

@Data
public class User {
    private Long id;
    private String userName;      // 对应数据库 user_name(配合 map-underscore-to-camel-case)
    private String email;
    private LocalDateTime createTime;
}

创建好对应的mapper接口和对应的mapper.xml映射文件(后序的sql查询语句都是在这里写的

@Mapper  // Spring Boot 需标记,或在启动类加 @MapperScan("com.example.mapper")
public interface UserMapper {
    
    // 注解方式(简单 SQL)
    @Select("SELECT * FROM t_user WHERE id = #{id}")
    User selectById(Long id);
    
    // XML 方式(复杂 SQL,需在 XML 中实现同名方法)
    List<User> selectByCondition(@Param("userName") String userName, 
                                  @Param("status") Integer status);
    
    int insert(User user);
    int update(User user);
    int deleteById(Long id);
}

对应的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.mapper.UserMapper">
    
    <!-- 结果映射(字段与属性不一致时使用) -->
    <resultMap id="userResultMap" type="com.example.entity.User">
        <id property="id" column="id"/>
        <result property="userName" column="user_name"/>
    </resultMap>
    
    <!-- 动态 SQL 查询 -->
    <select id="selectByCondition" resultMap="userResultMap">
        SELECT * FROM t_user
        <where>
            <if test="userName != null and userName != ''">
                AND user_name LIKE CONCAT('%', #{userName}, '%')
            </if>
            <if test="status != null">
                AND status = #{status}
            </if>
        </where>
    </select>
    
    <insert id="insert" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO t_user (user_name, email, create_time)
        VALUES (#{userName}, #{email}, #{createTime})
    </insert>
</mapper>

在启动配置类里要加上注解MapperScan("对应的xml映射文件")
然后在service层进行使用

@Service
public class UserService {
    
    @Autowired
    private UserMapper userMapper;
    
    @Transactional
    public User getUser(Long id) {
        return userMapper.selectById(id);
    }
}

注意:上述是基于spring boot的配置,如果采用原生spring框架进行开发,需要对手动创建mybatis-confige.xml,并且要额外增加config配置类实现数据源的读取和sqlfacotry的基本配置
需要分页操作的时候也需要进行额外config配置类实现

{} 和 ${} 是 MyBatis 中两种完全不同的占位符,核心区别在于预编译处理 vs 字符串拼接,这直接决定了安全性、性能和适用场景

一般采用 #{} 可以防止sql注入,

除了使用xml配置查询以外也可以使用使用注解进行查询,具体查询规则直接看官网/博客学习
执行流程:
业务层调用

userMapper.findById(1L)

【JDK 动态代理】MapperProxy.invoke()

构造 statementId = "com.example.mapper.UserMapper.findById"

【Configuration】查找 MappedStatement(解析时从 XML 加载)

【参数处理】ParamNameResolver 解析 @Param("id") → 封装为 Map{id=1L}

【SqlSession】selectOne(statementId, {id=1L})

【Executor】执行 JDBC:SELECT ... FROM t_user WHERE id = ?

【ResultSetHandler】按 BaseResultMap 映射列到对象属性

返回 UserDO 实例

导航