MyBatis简介

本文最后更新于:3 年前

引言

本文是MyBatis系列的第一篇文章,将详细介绍MyBatis的基本用法和配置,使开发者能够快速上手并有效地使用MyBatis进行数据库开发。

简介

MyBatis简介

MyBatis是一个流行的持久层框架,它帮助开发者在Java程序中更方便地管理数据库操作。

具备特点:

  1. 数据映射:MyBatis主要提供了SQL映射功能,允许将数据库中的记录直接映射到Java对象上。这意味着可以将数据库表映射为Java类,表的行映射为类的实例,而表的列映射为类的属性。
  2. XML配置:MyBatis允许开发者通过XML配置文件详细定义SQL语句和映射规则,而不需要在Java代码中硬编码SQL。这样做的好处是可以更清晰地组织SQL语句,便于管理和优化。
  3. 灵活性:与其他ORM框架相比,MyBatis提供了更多的灵活性。它不会完全取代手写的SQL,而是允许开发者在必要时直接使用原始SQL语句,这对于复杂的数据库操作特别有用。
  4. 动态SQL:MyBatis支持动态SQL,允许在XML映射文件中根据不同的条件构建不同的SQL语句。这种灵活性使得开发者可以根据不同的业务需求动态地生成合适的SQL语句,而不是依赖于框架生成。
  5. 插件和拦截器:MyBatis支持自定义插件,这些插件可以插入到MyBatis核心处理的任何点,例如SQL语句构建、查询执行等环节。这提供了很大的灵活性来扩展MyBatis的功能。
  6. 会话管理:MyBatis 的SqlSession提供了执行命令、获取映射器和管理事务的方法。SqlSession是非线程安全的,通常是方法范围内使用,即在一个数据库会话中使用后关闭。

ORM思想

ORMObject-Relational Mapping,即对象关系映射,是一种程序设计技术,用于实现对象与数据库之间的映射,程序中的对象可以直接对应数据库中的表,对象的属性与表的列相对应,而对象的实例对应表中的一行。这使得开发者可以用更直观的面向对象的方式来操作数据库,而无需直接处理SQL语句。

MyBatis并不是一个全自动的ORM框架,更准确地说,MyBatis是一个半ORM框架,它不会像Hibernate那样自动生成SQL语句,而是提供SQL映射功能。相反,它需要开发者手动编写SQL语句,并通过MyBatis提供的映射机制将SQL查询结果映射到Java对象上。这种方式提供了更多的控制权和灵活性,允许开发者优化SQL语句,适应更复杂的查询需求。

DEMO

  1. 数据库实例创建库表mybatis_db.tt_vehicle

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    USE mybatis_db;
    CREATE TABLE `tt_vehicle`
    (
    `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
    `product_name` varchar(100) NOT NULL COMMENT '产品',
    `vin` varchar(50) NOT NULL COMMENT 'VIN码',
    `production_date` date NOT NULL COMMENT '生产日期',
    `guide_price` decimal(10, 2) NOT NULL COMMENT '销售价格',
    PRIMARY KEY (`id`)
    ) ENGINE = InnoDB
    AUTO_INCREMENT = 1
    DEFAULT CHARSET = utf8mb4 COMMENT ='车辆信息表';
  2. 创建Maven项目,引入MySQL连接以及Mybatis依赖

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <dependencies>
    <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.28</version>
    </dependency>
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.10</version>
    </dependency>
    </dependencies>
  3. 创建Mybatis核心配置文件mybatis-config.xml,配置数据库实例的数据源

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?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.cj.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mybatis_db"/>
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    </dataSource>
    </environment>
    </environments>
    <mappers>
    </mappers>
    </configuration>
  4. 创建单个表的Mapper文件VehicleMapper.xml,并写入一条insert语句

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?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="xxx">
    <insert id="insertTest">
    insert into tt_vehicle (product_name, vin, production_date, guide_price)
    values ("Audi A6L", "LVIN1", "2024-06-22", "400000.12")
    </insert>
    </mapper>
  5. 将表Mapper文件VehicleMapper.xml注册到核心配置文件mybatis-config.xml

    1
    2
    3
    <mappers>
    <mapper resource="mapper/VehicleMapper.xml"/>
    </mappers>
  6. 编写测试程序如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class Main {
    public static void main(String[] args) throws IOException {
    // 创建SqlSessionFactoryBuilder对象
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    // 获取mybatis配置文件的输入流
    InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
    // 通过配置文件的输入流构建SqlSessionFactory对象
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    // 从SqlSessionFactory中获取一个SqlSession对象
    SqlSession sqlSession = sqlSessionFactory.openSession();
    // 使用sqlSession调用mapper文件中的方法
    int insertTest = sqlSession.insert("insertTest");
    // 提交事务
    sqlSession.commit();
    }
    }
  7. 运行后,查看数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    mysql> use mybatis_db;
    Database changed
    mysql> select * from tt_vehicle;
    +----+--------------+-------+-----------------+-------------+
    | id | product_name | vin | production_date | guide_price |
    +----+--------------+-------+-----------------+-------------+
    | 1 | Audi A6L | LVIN1 | 2024-06-22 | 400000.12 |
    +----+--------------+-------+-----------------+-------------+
    1 row in set (0.00 sec)

    根据数据库查询结果可知,测试程序的代码运行后,执行了Mapper文件中的insert SQL语句,往数据库中插入了一行数据。

配置文件

全局配置文件

MyBatis的全局配置文件(通常命名为 mybatis-config.xml)是一个中心配置文件,通过它可以配置MyBatis运行时的行为和环境设置。下面简要介绍该配置文件中的各种标签及其作用:

configuration

这是最顶层的标签,包含了所有的MyBatis配置信息。

properties

此标签用于引入外部的配置文件,通常包含数据库连接信息等环境变量。可以通过resourceurl属性指定外部文件的位置。

settings

定义了MyBatis的运行时行为,比如是否开启延迟加载、生成SQL语句的形式等。每个设置都有其默认值,但可以通过此标签进行自定义配置。

typeAliases

定义别名,使配置文件中的类引用更简洁。可以为单个类指定别名,或指定一个包名自动为所有类生成别名。

typeHandlers

自定义类型处理器的配置。用于定义Java类型与数据库类型之间的映射关系,特别是当遇到MyBatis未提供默认处理器的类型时。

objectFactory

用于创建结果对象的实例,允许自定义结果对象的创建过程,例如通过依赖注入。

plugins

配置插件,MyBatis允许使用插件来拦截和修改其核心执行流程的某些部分,如SQL执行、参数设置等。

environments

定义多个数据库环境,可支持不同的数据库配置。每个环境包括一个transactionManager和一个dataSource

  • transactionManager:配置事务管理类型,通常是JDBCMANAGED
  • dataSource:配置数据源,包括连接池的各种属性,如驱动器、URL、用户名和密码等。

databaseIdProvider

支持基于数据库厂商标识来选择不同的SQL映射。这允许编写只有在特定数据库品牌和版本上才会被使用的SQL语句。

mappers

指定Mapper映射文件的位置。可以通过单个文件的方式引用,也可以指定整个包名自动扫描所有的Mapper文件。

这些标签共同构成了MyBatis的全局配置,允许开发者精细地控制MyBatis的行为和数据库的交互方式。正确配置这些标签对于确保应用程序的正确运行和性能优化至关重要。

Mapper配置文件

MyBatis的XML Mapper文件是用于定义SQL映射规则的关键配置文件,允许开发者指定如何将SQL语句映射到Java接口方法。以下是XML Mapper文件中常见标签的简要说明:

mapper

这是XML Mapper文件的根标签,所有的SQL映射定义都包含在这个标签内,通常会指定一个命名空间namespace

  • namespace:命名空间,关联一个具体的Java接口

cache

该标签用于配置该Mapper对应的缓存策略。通过启用缓存,可以提高查询效率并减少数据库访问次数。

cache-ref

允许当前Mapper引用另一个Mapper定义的缓存配置,实现缓存配置的复用。

insert

定义插入数据的SQL语句。可包含动态SQL元素,如标签<if>。通常还可以通过useGeneratedKeyskeyProperty属性获取数据库生成的主键。

update

定义更新操作的SQL语句。同样支持动态SQL元素,以适应不同的更新条件和要求。

delete

定义删除操作的SQL语句。可以包含条件判断,允许基于复杂逻辑执行删除操作。

select

定义查询操作的SQL语句。可以配置返回类型,支持返回单个对象或对象集合。通过resultMapresultType指定如何映射查询结果。

resultMap

定义如何将数据库的结果集映射到Java对象。这包括字段到属性的映射、复杂类型的处理(如集合和关联对象)等。resultMap是处理复杂查询结果的强大工具。

association和collection

这两个标签用于在resultMap中定义复杂的对象关系,如一对一和一对多关系。association用于一对一关系,而collection用于一对多关系。

sql

定义可重用的SQL代码片段。可以在同一个Mapper文件中的其他SQL映射中通过<include>标签引用这些片段,减少SQL代码的重复。

include

用于在 SQL 语句中包含<sql>标签定义的SQL片段。通过refid属性指向要包含的片段。

parameterMap(已废弃)

在早期版本的MyBatis中使用,用于定义参数映射。现已被推荐直接在SQL语句中使用#{}${}代替。

三大对象及其作用域

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder是用于构建SqlSessionFactory的一个构建器类。它的主要任务是在应用程序启动时解析MyBatis配置文件(如XML配置文件或注解),并基于这些配置信息创建SqlSessionFactorySqlSessionFactoryBuilder实例的使用通常是一次性的,即一旦创建了SqlSessionFactory后,就没有再继续使用的需要,即创建后即可丢弃。

SqlSessionFactory

SqlSessionFactory是MyBatis中的一个核心接口,它负责创建 SqlSession 实例,每个数据库会话或请求都通过SqlSessionFactory来获取SqlSession实例 。SqlSessionFactory一旦被创建,就应该在应用执行期间一直存在,这个对象是线程安全地,可以在应用程序中共享,通常以单例模式被管理。它确保所有的数据库操作都是通过有效的SqlSession实例进行的。

SqlSession

SqlSession是MyBatis中用于执行实际数据库操作的接口。它提供了访问数据库所需的所有方法,包括执行SQL语句、管理事务等。一个 SqlSession 通常代表一个数据库会话,SqlSession的实例不是线程安全的,通常每个线程或请求都应该获取自己的SqlSession实例,不能在多个线程间共享,且用完之后需要关闭。

作用域总结

通过以上对SqlSessionFactoryBuilderSqlSessionFactorySqlSession的了解,可以总结它们各自的作用域为:

  • SqlSessionFactoryBuilder:方法作用域(局部方法变量)
  • SqlSessionFactory:应用作用域
  • SqlSession:请求或方法作用域

总结

本文对MyBatis概念、配置文件以及三大对象做了一个简要介绍,通过本文,读者应该能够对MyBatis的概念有一个清晰的理解,后面文章将对MyBatis的各个模块进行更加深入的介绍。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!