MyBatis全解

目录

一, MyBatis 概述

1.1-介绍 MyBatis 的历史和发展

1.2-MyBatis 的特点和优势

1.3-MyBatis 与 JDBC 的对比

1.4-MyBatis 与其他 ORM 框架的对比

二, 快速入门

2.1-环境搭建

2.2-第一个 MyBatis 应用程序

2.3-配置文件详解 (mybatis-config.xml)

2.4-Mapper 文件详解 (xxxMapper.xml)

三,核心概念

3.1-Session 和 SqlSessionFactory

3.2-映射器 (Mapper) 接口和 XML 映射文件

3.3-SQL 语句的执行流程

3.4-结果映射 (Result Mapping)

四,动态 SQL

4.1-if, choose, when, otherwise

4.2-trim, where, set

4.3-foreach

4.4-bind

五,参数处理

5.1-单个参数

5.2-多个参数

5.3-Map 参数

5.4-POJO 参数

六,类型处理器 (Type Handlers)

6.1-内置类型处理器

6.2-自定义类型处理器

七,高级特性

7.1-关联映射 (一对一、多对一)

7.2-集合映射 (一对多)

7.3-嵌套查询和嵌套结果

7.4-缓存机制 (一级缓存和二级缓存)

7.5-事务管理

八,插件机制

8.1-日志插件

8.2-分页插件

九,集成 Spring

9.1-Spring 中的 MyBatis 配置

9.2-使用 Spring 管理 MyBatis 的 SqlSessionFactory 和 Mapper

十, 最佳实践

10.1-代码组织结构

10.2-异常处理

10.3-测试策略

十一,实战案例

十二,社区和扩展

12.1-MyBatis 生态系统

12.2-第三方工具集成

12.3-社区资源和文档


一, MyBatis 概述

1.1-介绍 MyBatis 的历史和发展

  • 起源:MyBatis 的前身是 iBatis,最初由 Clinton Begin 在2001年创建。
  • 发展:2008年左右,iBatis 被捐赠给了 Apache 软件基金会,并更名为 MyBatis。
  • 版本演变:MyBatis 3.x 版本引入了大量的改进和新特性,成为目前最广泛使用的版本。
  • 社区与生态:MyBatis 拥有活跃的社区和丰富的插件生态系统,包括 MyBatis Generator、MyBatis Plus 等工具。

1.2-MyBatis 的特点和优势

  • 轻量级:MyBatis 相对于其他 ORM 框架来说更为轻量,易于上手且灵活性高。
  • SQL 语句编写:允许直接编写 SQL 语句,提供更高的定制能力和优化空间。
  • 结果映射:提供强大的结果映射机制,能够灵活地处理复杂的数据结构。
  • 动态 SQL:支持动态 SQL 语法,可以根据条件生成不同的 SQL 语句。
  • 插件机制:支持插件扩展,可以方便地添加日志记录、分页等功能。
  • 与 Spring 的良好集成:能够很好地与 Spring 框架集成,提供依赖注入和事务管理等功能。

1.3-MyBatis 与 JDBC 的对比

  • 封装性:MyBatis 对 JDBC 进行了封装,避免了直接与 JDBC API 交互的繁琐步骤。

  • 资源管理:MyBatis 自动管理 SQL 会话,减少了资源泄漏的风险。

  • 错误处理:MyBatis 提供更友好的异常处理机制,使得错误定位更加容易。

  • SQL 语句编写:MyBatis 支持直接编写 SQL 语句,而 JDBC 需要程序员自行构建 SQL 语句。

  • 结果映射:MyBatis 提供了自动化的结果映射机制,使得数据转换更为简单。

1.4-MyBatis 与其他 ORM 框架的对比

Hibernate:

  • 全自动 vs 半自动:Hibernate 是全自动的 ORM 框架,而 MyBatis 是半自动的。
  • 易用性:Hibernate 提供了更多的自动化特性,如懒加载、缓存等。
  • 性能:MyBatis 因为更接近 SQL 的控制,所以可能在某些场景下有更好的性能。

JPA (Java Persistence API):

  • 标准 vs 实现:JPA 是一种规范,而 Hibernate 是 JPA 的实现之一;MyBatis 则是一种具体的框架。
  • API 使用:JPA 使用面向对象的方式,而 MyBatis 更偏向于 SQL 语句的编写。

Spring Data JPA:

  • 集成度:Spring Data JPA 与 Spring 集成度更高,提供了更多的便捷方法。
  • 灵活性:MyBatis 在编写 SQL 方面提供了更大的灵活性。


二, 快速入门

2.1-环境搭建

1.安装 JDK

  • 确保已安装 JDK 1.8 或以上版本。
  • 设置环境变量 JAVA_HOME。

2.安装 Maven (可选)

  • 如果使用 Maven 管理项目依赖,则需安装 Maven。
  • 设置环境变量 M2_HOME 和 MAVEN_HOME。

3.创建 Maven 项目

  • 使用 IntelliJ IDEA 或 Eclipse 创建一个新的 Maven 项目。
  • 添加 MyBatis 和 MySQL 的依赖到 pom.xml 文件中。
   <dependencies>
       <!-- MyBatis -->
       <dependency>
           <groupId>org.mybatis</groupId>
           <artifactId>mybatis</artifactId>
           <version>3.5.11</version>
       </dependency>
       <!-- MySQL Connector/J -->
       <dependency>
           <groupId>mysql</groupId>
           <artifactId>mysql-connector-java</artifactId>
           <version>8.0.32</version>
       </dependency>
       <!-- Logging -->
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-api</artifactId>
           <version>1.7.36</version>
       </dependency>
       <dependency>
           <groupId>org.slf4j</groupId>
           <artifactId>slf4j-simple</artifactId>
           <version>1.7.36</version>
       </dependency>
   </dependencies>

4.配置 MySQL 数据库

  • 创建数据库和表。
  • 配置数据库连接信息。

5.创建实体类

  • 根据数据库表结构创建对应的 Java 实体类。

6.创建 MyBatis 配置文件

  • 创建 mybatis-config.xml 文件。

7.编写 Mapper 文件

  • 创建 UserMapper.xml 文件。

2.2-第一个 MyBatis 应用程序

1.创建实体类

  • 创建 User.java 实体类。
        @Data
        @NoArgsConstructor
        @AllArgsConstructor    
         public class User {
         private int id;
         private String name;
         private String email;
        }

2.创建 Mapper 接口

  • 创建 UserMapper.java 接口。
     import org.apache.ibatis.annotations.Select;
     public interface UserMapper {
         @Select("SELECT * FROM users WHERE id = #{id}")
         User getUserById(int id);
     }

3.创建 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.mapper.UserMapper">
         <select id="getUserById" resultType="com.example.entity.User">
             SELECT * FROM users WHERE id = #{id}
         </select>
     </mapper>

4.配置文件详解 (mybatis-config.xml)

  • 创建 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="com.mysql.cj.jdbc.Driver"/>
                     <property name="url" value="jdbc:mysql://localhost:3306/mydatabase?useSSL=false&amp;serverTimezone=UTC"/>
                     <property name="username" value="root"/>
                     <property name="password" value="password"/>
                 </dataSource>
             </environment>
         </environments>
         <mappers>
             <mapper resource="com/example/mapper/UserMapper.xml"/>
         </mappers>
     </configuration>

5.编写测试类

  • 创建 UserTest.java 文件来测试 MyBatis 的基本功能。
     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 UserTest {
         public static void main(String[] args) throws IOException {
             InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
             SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
             try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
                 UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
                 User user = userMapper.getUserById(1);
                 System.out.println(user);
             }
         }
     } 

2.3-配置文件详解 (mybatis-config.xml)

        mybatis-config.xml 是 MyBatis 的核心配置文件,用于配置 MyBatis 的运行环境以及其他各种属性。下面是 mybatis-config.xml 的详细说明:


1. 根元素 <configuration>

属性:

说明:根元素,包含了所有子元素。

2.<properties>

属性:

  • resource:指定外部 properties 文件的位置。
  • url:指定外部 properties 文件的 URL。
  • defaultPrefix:指定默认前缀,用于在 properties 文件中区分默认值。

说明:

  • 用于读取外部的 properties 文件,可以用来配置数据库连接信息等。

3. <settings>

属性:
说明:包含一系列的设置项,用于改变 MyBatis 的行为。

4. <typeAliases>

属性:
说明:用于配置别名,可以简化 Java 类型的引用。

5. <typeHandlers>

属性:
说明:用于配置自定义的类型处理器,可以处理特定类型的转换。

6. <objectFactory>

属性:
说明:用于配置 MyBatis 创建新实例的方式,默认使用 Java 默认构造器。

7. <plugins>

属性:
说明:用于配置 MyBatis 的插件,可以增强或修改 MyBatis 的行为。

8. <environments>

属性:
说明:用于配置不同的环境,如开发、测试、生产等。

<environment>:表示一个具体的环境配置。

        属性:
                id:环境标识符。
        子元素:
                <transactionManager>:配置事务管理器。
                        属性:
                                type:事务管理器类型,如 JDBC、MANAGED。
                <dataSource>:配置数据源。
                        属性:
                                type:数据源类型,如 UNPOOLED、POOLED、JNDI。
                        子元素:
                                <property>:配置数据源的属性,如 url、username、password。

9. <databaseIdProvider>

属性:
说明:用于配置数据库 ID 提供者,可以用于区分不同的数据库方言。

10. <mappers>

属性:
说明:用于配置 Mapper 接口或 Mapper XML 文件的位置。
        <mapper>:配置单个 Mapper 文件或接口。
                属性:
                        resource:指定 Mapper 文件的资源路径。
                        url:指定 Mapper 文件的 URL。
                        class:指定 Mapper 接口的全限定类名。
        <package>:批量注册指定包下的所有 Mapper 接口。
                属性:
                        name:指定包名。

<?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>
    <properties resource="db.properties"/>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <typeAliases>
        <typeAlias alias="User" type="com.example.entity.User"/>
    </typeAliases>
    <typeHandlers>
        <typeHandler handler="com.example.handler.MyTypeHandler"/>
    </typeHandlers>
    <objectFactory>
        <property name="defaultScope" value="prototype"/>
    </objectFactory>
    <plugins>
        <plugin interceptor="com.example.interceptor.MyInterceptor">
            <property name="someProperty" value="100"/>
        </plugin>
    </plugins>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/example/mapper/UserMapper.xml"/>
        <mapper class="com.example.mapper.UserMapper"/>
        <package name="com.example.mapper"/>
    </mappers>
</configuration>

2.4-Mapper 文件详解 (xxxMapper.xml)

xxxMapper.xml 是 MyBatis 的映射文件,用于定义 SQL 语句和结果映射规则。下面是 xxxMapper.xml 的详细说明:


1. 根元素 <mapper>

属性:namespace:指定 Mapper 接口的全限定类名或唯一标识符。
说明:根元素,包含了所有的映射语句。

2. <insert>

属性:

  • id:映射语句的唯一标识符。
  • parameterType:传入参数的类型。
  • useGeneratedKeys:是否使用主键自动生成。
  • keyProperty:指定自动生成的主键值放入哪个字段。
  • keyColumn:指定自动生成的主键值的列名。

说明:定义插入语句。

3. <update>

属性:

  • id:映射语句的唯一标识符。
  • parameterType:传入参数的类型。

说明:定义更新语句。

4. <delete>

属性:

  • id:映射语句的唯一标识符。
  • parameterType:传入参数的类型。

说明:定义删除语句。

5. <select>

属性:

  • id:映射语句的唯一标识符。
  • parameterType:传入参数的类型。
  • resultType:返回结果的类型。
  • resultSetType:结果集类型,如 FORWARD_ONLY、SCROLL_INSENSITIVE、SCROLL_SENSITIVE。

说明:定义查询语句。

6. <resultMap>

属性:

  • id:映射语句的唯一标识符。
  • type:返回结果的类型。

说明:定义结果映射规则,可以用于复杂的映射逻辑。

7. <sql>

属性:id:SQL 片段的唯一标识符。
说明:定义可重用的 SQL 片段。

8. <include>

属性:refid:引用 <sql> 元素的 ID。
说明:引用 <sql> 元素定义的 SQL 片段。

9. 动态 SQL<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

啵啵薯条

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

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

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

打赏作者

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

抵扣说明:

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

余额充值