一、什么是mybatis
MyBatis是一种优秀的基于Java的持久层框架,它利用了面向对象的编程思想来操作数据库。
MyBatis 工作原理 主要是通过 XML 文件或注解配置 SQL 语句,然后运用“对象关系映射(ORM)”技术将数据库中的数据转换为Java对象,方便Java程序的使用。
MyBatis 并不会对Java对象进行过多的侵入性操作,仅仅提供了一种便捷的方式来操作数据库,这带来了极为优秀的“扩展性”和“可插拔性”。
MyBatis 最初是一个由 Apache 软件基金会支持的开源项目 iBATIS,在2009年正式更名为 MyBatis。与其他 ORM 框架相比,MyBatis 的优势在于它具有极高的灵活性和可配置性,可以轻松地满足各种复杂的数据库操作需求。同时 MyBatis 还提供了Caching,Batching和Deferred loading 等高级特性,这些特性使得它可以方便地处理高并发和大数据量的场景,从而获得更好的性能。
除了官方提供的基于 XML 配置的 SQL 映射文件之外,MyBatis 还提供了注解和 API 的方式来进行配置。 这使得开发者可以根据具体需求来选择最适合的方式进行工作,极大地提高了开发效率和代码的可读性。
总的来说,MyBatis 是一个具有高度灵活性和可配置性的 ORM 框架,具有成熟的性能优化机制和易于使用的 API,可以轻松地集成到各种 Java 项目中,使得 Java 数据库访问更加高效、灵活和易于维护。
二、 mybatis的核心是什么
MyBatis 核心主要包括以下三个方面:
1. 映射器 Mapper:
MyBatis 的核心组件即 Mapper,其主要作用是定义各种操作数据库的 SQL 语句和方法。映射器中的 SQL 语句可以通过 XML 或注解来定义,其中 XML 风格的映射器比较流行,因为其更加易于管理和维护。Mapper 接口中的方法必须与 SQL 语句中的参数和返回值类型一致,以便 MyBatis 可以正确执行 SQL 语句,同时将结果封装成对象返回给 Java 代码。
2. 配置 Configuration:
MyBatis 的配置文件主要用于配置数据源、插件、类型转换器、别名等信息,以及指定映射器的位置和加载方式。Configuration 中的所有信息都可以通过 Java API 或 XML 文件来配置,使得 MyBatis 的配置变得非常灵活和可扩展。
3. 执行器 Executor:
Executor 是 MyBatis 执行 SQL 语句的核心组件,它的工作原理主要是将 SQL 语句交给 StatementHandler 来处理,然后由 ParameterHandler 来设置 SQL 参数,最后由 ResultSetHandler 来处理查询结果。MyBatis 有三种 Executor 实现类型,分别是 SimpleExecutor、ReuseExecutor 和 BatchExecutor,每种实现方式都有各自的优点和适用场景,具体根据实际业务情况来选择最合适的 Executor 类型。
![](/qrcode.jpg)
总之,MyBatis 的核心是 Mapper、Configuration 和 Executor
,它们共同协作来实现对数据库的操作。这种基于 XML 或注解配置的方式,使得 MyBatis 具有高度的灵活性和可扩展性,可以方便地集成到各种 Java 项目中,同时也让 MyBatis 成为了一个备受欢迎的 ORM 框架。
mybatis的核心框架图:
三、mybatis的优缺点
** 优点:**
1、简单易学
mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。
2、灵活
mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。
3、解除sql与程序代码的耦合
通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。
4、提供映射标签,支持对象与数据库的orm字段关系映射
5、提供对象关系映射标签,支持对象关系组建维护
6、提供xml标签,支持编写动态sql。
缺点:
1、编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
2、SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
3、框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
四、mybatis的基本配置
MyBatis 的基本配置主要包括配置数据源信息、映射器信息、类型别名等,一般通过 XML 文件进行配置或者java进行配置。
下面是一个示例 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="com.mysql.cj.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 配置映射器 -->
<mappers>
<mapper resource="com/mybatis/demo/mapper/UserMapper.xml" />
<mapper class="com.mybatis.demo.mapper.OrderMapper" />
</mappers>
<!-- 配置类型别名 -->
<typeAliases>
<typeAlias alias="User" type="com.mybatis.demo.entity.User" />
<typeAlias alias="Order" type="com.mybatis.demo.entity.Order" />
</typeAliases>
</configuration>
上述代码中,配置文件以元素为根节点,包括三个部分:数据源配置、映射器配置和类型别名配置。其中 元素指定了 MyBatis 的环境配置,包括数据源和事务管理器等信息。 元素用于配置映射器信息,可以通过 元素指定映射器文件路径或映射器接口类。 元素用于配置类型别名,可以通过其alias属性为类型起一个名称,以便在其他地方使用。
此外,还可以通过 Java 代码直接配置 MyBatis,例如:
public class MyBatisConfig {
// 通过 Java 代码配置数据源
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}
// 通过 Java 代码配置 SqlSessionFactory
@Bean
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
Resource[] mapperLocations = new PathMatchingResourcePatternResolver().getResources("classpath*:com/mybatis/demo/mapper/*.xml");
sessionFactory.setMapperLocations(mapperLocations);
return sessionFactory.getObject();
}
// 通过 Java 代码配置 MapperScannerConfigurer
@Bean
public MapperScannerConfigurer mapperScannerConfigurer() {
MapperScannerConfigurer scannerConfigurer = new MapperScannerConfigurer();
scannerConfigurer.setBasePackage("com.mybatis.demo.mapper");
scannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
return scannerConfigurer;
}
}
上述代码中,通过创建 Java 配置类来配置数据源信息、SqlSessionFactory 和映射器信息,最后使用MapperScannerConfigurer扫描 Mapper 接口,并自动将这些接口的代理对象注入到 Spring 容器中,以便在业务中使用。
五. mybatis基本流程
MyBatis 的基本流程包括以下四个步骤:
1. 加载配置文件:
MyBatis 首先会读取配置文件(XML 或 Java)信息,并解析出对数据库的配置和映射器信息。
2. 创建 SqlSessionFactory:
基于配置文件信息,MyBatis 会创建一个 SqlSessionFactory
对象,该对象是数据库访问的入口,它能够根据配置信息创建 SqlSession 对象。
3. 创建 SqlSession:
SqlSession
是 MyBatis 操作数据库的核心,该对象提供了丰富的方法,包括插入、更新、删除、查询等操作。创建 SqlSession
对象时,需要指定执行 SQL 语句的参数,以及事务的隔离级别等信息。SqlSession
对象可以通过 SqlSessionFactory 的 openSession() 方法来创建。
4. 执行 SQL 语句:
SqlSession
对象提供了多种方式执行 SQL 语句,包括直接执行 SQL 语句、调用映射器接口和调用 annocation 注解等方式。其中调用映射器接口是最为常用的方式,MyBatis 会根据接口、方法名和入参类型查找对应的 SQL 语句,并执行该语句。执行结果会自动封装成 Java 对象返回。