mybatis总结

MyBatis 是一个半自动化的持久层框架,它允许用户自己编写 SQL 语句,并通过简单的 XML 或注解来配置映射关系。MyBatis 的核心优势在于其灵活性和对 SQL 的完全控制能力。用户可以直接书写原生的 SQL 语句,进行更细粒度的优化,这对于复杂和性能要求高的查询来说是一个很大的优势。需要注意Mybatis并没有实现J2EE的JPA规范。
官方清晰入门教程 传送门

1. mybatis使用示例

1.1. 添加 MyBatis 依赖

首先,在项目中添加 MyBatis 的依赖。如果使用 Maven,可以在 pom.xml 文件中添加以下依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>MyBatis版本号</version>
</dependency>

1.2. 配置 MyBatis

MyBatis 的配置可以通过 XML 文件或者 Java 代码来完成。最常见的是使用 mybatis-config.xml 配置文件来配置 MyBatis。

mybatis-config.xml 示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="数据库驱动"/>
                <property name="url" value="数据库URL"/>
                <property name="username" value="数据库用户名"/>
                <property name="password" value="数据库密码"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
    </mappers>
</configuration>

1.3. 创建操作对象实体,Mapper 接口和 XML 映射文件

创建操作对象实体,如User

public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;

    // 增加对应的Getter 和 Setter 方法
    ...
}

创建一个 Java 接口,定义执行的操作,例如:

public interface UserMapper {
    User getUserById(int id);
}

然后创建一个 XML 映射文件,定义 SQL 语句和结果映射:

<?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="org.mybatis.example.UserMapper">
  <select id="getUserById" resultType="User">
    select * from users where id = #{id}
  </select>
</mapper>

1.4. 执行 SQL 操作

使用 SqlSessionFactoryBuilder 来创建 SqlSessionFactory,然后使用 SqlSessionFactory 来创建 SqlSession,最后通过 SqlSession 执行数据库操作。

String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
try (SqlSession session = sqlSessionFactory.openSession()) {
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.getUserById(1);
    System.out.println(user.getUsername());
}

以上是 MyBatis 的基本使用流程。MyBatis 还支持更多高级特性,如动态 SQL、日志、插件等,可以根据项目的需要进行学习和使用。

2. mybatis执行过程

mybatis-workflow

3. mybatis核心类

  • SqlSessionFactoryBuilder
    用来创建会话工厂,最佳作用域:使用完就丢弃。
  • SqlSessionFactory
    用来创建会话,最佳作用域:应用级别,单列最好。
  • SqlSession
    数据库链接会话,提供给用户执行sql,最佳作用域:请求或作用方法,非线程安全。
  • Executor
    SqlSession持有,真正用于执行sql.其有多个实现类如下:
    Executor类图

    • CachingExecutor用于二级缓存,代理模式,内部持有一个实现了缓存的Executor类。
    • SimpleExecutor
      最简单的执行器,根据对应的sql直接执行,每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象。(可以是Statement或PrepareStatement对象)
    • ReuseExecutor
      ReuseExecutor与其它SimpleExecutor的区别是重用jdbc的Statement,该类内部维护了一个sql与Statement对映射集合。
    • BatchExecutor
      批处理执行器,用于将多个SQL一次性输出到数据库。
  • StatementHandler
    用来根据MappedStatement获取Statement
  • ParameterHandler
    用来处理参数绑定,将用户传入的参数半丁到sql上
  • ResultSetHandler
    用来处理结果绑定,将查询结果数据列转换为对象列表
  • TypeHandler
    负责java数据类型和jdbc数据类型之间的映射和转换

4. mybatis Executor的指定

mybatis默认使用对Executor为SimpleExecutor,如果需要指定,在配置文件Setting节点设置defaultExecutorType参数对值。
参数设定传送门

5. 高级使用

5.1. 拦截器

MyBatis 拦截器是 MyBatis 提供的一种强大的机制,允许用户在 SQL 执行过程中的某个特定点进行拦截,以实现特定的功能。拦截器可以用于多种用途,比如日志记录、性能监控、权限校验等。

要使用 MyBatis 拦截器,需要遵循以下步骤:

5.1.1. 创建拦截器类

创建一个类实现 Interceptor 接口,或者继承 Interceptor 接口的实现类,比如 Plugin 类。在这个类中,可以覆盖以下方法:

  • intercept(Invocation invocation): 实现拦截时需要执行的逻辑。
  • plugin(Object target): 用于生成目标对象的代理,可以通过该方法决定是否需要对目标对象进行代理。
  • setProperties(Properties properties): 用于设置拦截器所需的属性。

5.1.2. 注册拦截器

将创建的拦截器注册到 MyBatis 的配置中。可以通过以下几种方式:

在 MyBatis 的配置文件 mybatis-config.xml 中注册:
xml

<plugins>
    <plugin interceptor="com.example.MyInterceptor">
        <!-- 配置拦截器属性 -->
        <property name="someProperty" value="100"/>
    </plugin>
</plugins>

在 MyBatis 的 Java 配置中注册:

@Bean
public ConfigurationCustomizer configurationCustomizer() {
    return configuration -> {
        MyInterceptor interceptor = new MyInterceptor();
        interceptor.setSomeProperty("100");
        configuration.addInterceptor(interceptor);
    };
}

5.1.3. 使用拦截器

一旦拦截器被注册,MyBatis 在执行 SQL 语句时,就会在指定的拦截点调用的拦截器逻辑。

注意事项

  • 拦截器的执行顺序是由注册顺序决定的。
  • 应确保拦截器的实现不会对 MyBatis 的核心功能产生副作用。
  • 考虑到性能,不要在拦截器中执行过于复杂的逻辑。
  • 通过使用 MyBatis 拦截器,可以灵活地在 SQL 执行的前后插入自己的处理逻辑,以实现特定的需求。