MyBatis 入门教程

什么是 MyBatis

  • 持久层框架
  • 支持自定义 SQL、存储过程以及高级映射
  • 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.16</version>
</dependency>

持久层、持久化

为什么需要 MyBatis

便于将数据存入到数据库中

MyBatis 特点

  • 简单易用:避免了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索
  • 灵活:MyBatis 不像完全的 ORM 框架那样强迫你使用一种编程方式,它允许使用原始的 SQL 语句,提供了更大的灵活性和控制权
  • 动态 SQL:MyBatis 支持动态 SQL 语句,能够根据不同条件构建不同的 SQL 语句,极大地提升了 SQL 的复用性和灵活性
  • 映射器和 XML 文件:MyBatis 允许将 SQL 语句写在 XML 文件中,通过映射器接口与之对应,实现了 SQL 语句和 Java 代码的分离
  • 集成支持:MyBatis 可以很容易地与 Spring、Spring Boot 等流行的 Java 框架集成,提供了事务管理、连接池、懒加载等支持
  • 优秀的性能:MyBatis 提供了一些高级功能,如缓存支持,能够提升应用的性能
  • 类型安全的 Mapper 接口:MyBatis 允许开发者定义 Mapper 接口,通过 Java 泛型提供了更高的类型安全,并减少了错误的可能性
  • 部分 ORM 特性:虽然 MyBatis 不是一个完整的 ORM 框架,但它提供了对象图导航的部分支持,如延迟加载和级联映射等
  • 社区支持:活跃的社区
  • 跨数据库支持:MyBatis 能够很好地支持不同的数据库产品,只需要改变配置文件中的数据库连接信息即可轻松切换数据库

第一个 MyBatis 程序

搭建数据库

CREATE DATABASE `mybatis`;

USE `mybatis`;

CREATE TABLE `user`
(
    `id`       INT(20) NOT NULL,
    `name`     VARCHAR(30) DEFAULT NULL,
    `password` VARCHAR(30) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE = INNODB
  DEFAULT CHARSET = utf8;

INSERT INTO `user`(`id`, `name`, `password`)
VALUES (1, '张三', '123456'),
       (2, '李四', '123456'),
       (3, '王五', '123456');

新建项目

  • 创建一个普通的 Maven 项目
  • 删除 src 目录
  • 导入依赖
<dependencies>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.33</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.16</version>
    </dependency>
    <!-- junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>3.8.1</version>
    </dependency>
</dependencies>

创建一个模块

编写 MyBatis 的核心配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/huangqihong/dao/UserMapper.xml"/>
    </mappers>
</configuration>

编写 MyBatis 工具类

package com.huangqihong.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtil {
    private static SqlSessionFactory sqlSessionFactory;

    static {
        try {
            // get sqlSessionFactory object
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

编写代码

实体类

package com.huangqihong.pojo;

public class User {
    private int id;
    private String name;
    private String password;

    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + '}';
    }
}

Dao 接口

package com.huangqihong.dao;

import com.huangqihong.pojo.User;

import java.util.List;

public interface UserMapper {
    List<User> getUserList();
}

接口实现类由原来的 UserDaoImpl 转变为 Mapper 配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.huangqihong.dao.UserMapper">
    <select id="getUserList" resultType="com.huangqihong.pojo.User">
        select * from user
    </select>
</mapper>

测试

先在配置文件注册

package com.huangqihong.dao;

import com.huangqihong.pojo.User;
import com.huangqihong.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {
    @Test
    public void getUserList() {
        try (SqlSession sqlSession = MyBatisUtil.getSqlSession()) {
            // getMapper
            // recommended
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            List<User> userList = userMapper.getUserList();

            for (User user : userList) {
                System.out.println(user);
            }
        }
    }
}

注意:

  • 配置文件注册
  • 绑定接口错误
  • 方法名不对
  • 返回类型不对
  • Maven 导出资源问题
  • 记得关闭 sqlSession

CRUD

namespace

namespace 中的包名要和 Dao/mapper 接口的包名一致

select

  • id:对应的 namespace 中的方法名
  • resultType:SQL 语句执行的返回值
  • parameterType:参数类型

insert

update

delete

注意:增删改需要提交事务

万能的 Map

字段过多时,可以考虑使用 Map

模糊查询

配置解析

核心配置文件

  • configuration(配置)
    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
    • environment(环境变量)
    • transactionManager(事务管理器)
    • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

属性(properties)

动态替换某些配置(db.properties)

driver = com.mysql.jdbc.Driver
url = jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username = root
password = 123456

设置(settings)

类型别名(typeAliases)

<typeAliases>
    <!-- 1. type attribute: the full class name of the type to be aliased -->
    <typeAlias type="com.huangqihong.pojo.User" alias="user"/>
    <!-- 2. package attribute: the package name to be scanned -->
    <!-- <package name="com.huangqihong.pojo"/> -->
</typeAliases>

类型处理器

对象工厂

插件

环境配置

可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种选择,即每个数据库对应一个 SqlSessionFactory 实例

默认的事务管理器是 JDBC,连接池:POOLED

数据库厂商标识

映射器