MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis。 2013年11月迁移到Github,到2021年5月,版本升级到了 MyBatis v3.5.7。
    Mybatis是面向sql的持久层框架,它封装了jdbc访问数据库的过程,我们开发,只需专注于sql语句本身的拼装,其它复杂的过程全部可以交给Mybatis去完成。

    MyBatis的架构,如下图所示:

mybatis 架构图 mybatis功能架构图_java

1、MyBatis xml配置文件

    MyBatis的配置文件包括主配置文件、映射文件。
    其中,SqlConfig.xml是MyBatis的主配置文件,它是全局的,保存着数据库的连接信息、运行环境等。

    mapper.xml 是sql 映射文件,里面记录了对数据库进行增删改查的sql语句,映射文件需要在主配置文件SqlConfig.xml里显式的加载。

2、SqlSessionFactory会话工厂

    SqlSessionFactory是会话工厂,用来创建各种会话,它实际上一个接口,在该接口中定义了openSession的不同的加载方法,一般用单例模式来管理SqlSessionFactory,便于重复使用。
    MyBatis通过xml配置文件,来创建会话工厂。

3、SqlSession会话

    SqlSession是面向用户的,即一个用户,对应一个会话,它定义了数据库的操作方法。
    每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,因为它不是线程安全的。
    若打开了一个SqlSession,则在使用完毕后就需要关闭它。通常,把这个sqlsession.close()关闭操作,放到finally{}块里,以确保每次都能正确关闭。

4、executor执行器

    MyBatis底层自定义了Execuor执行器接口来操作数据库,它包括2个执行器:基本执行器、缓存执行器。

5、MappedStatement映射器

    MappedStatement映射器,是MyBatis定义的一个底层封装对象,它包装了xml配置信息、sql映射信息等。
    在Mapper.xml里,一个sql语句对应一个MappedStatement映射器对象,sql的id 也是MappedStatement映射器的id。

    映射器对sql执行前的输入参数类型进行包装,包括HashMap、基本类型、pojo。Executor通过MappedStatement在执行sql前,将输入的Java对象映射到sql中。我们在Java代码中通过preparedState设置参数,实际上就是进行输入参数映射,见下面代码中的步骤3)。

//1)加载数据库驱动
			Class.forName(JDBC_DRIVER);
			connection = DriverManager.getConnection(DB_URL,USER,PASS);
			
			//2)定义sql语句
			//String sqlString = "select username,address from user";
			String sqlString = "select * from user where username = ?";
			
			//3)预处理statement
			preparedStatement = connection.prepareStatement(sqlString);
			preparedStatement.setString(1, "张三");
			
			//4)执行sql语句
			resultSet = preparedStatement.executeQuery();
			
			//5) 遍历查询结果集
			while(resultSet.next()) {
				System.out.println(resultSet.getString("id")+" "+resultSet.getNString("username"));
			}

    同样,映射器,也可以把sql执行后的输出结果进行解析,它将sql的输出结果映射到Java对象中,无论这个对象是基本类型、HashMap,还是pojo,都可以成功映射。然后把这个结果解析,返回给Executor。