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的架构,如下图所示:
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。