本系列针对MyBatis源码进行学习,将会从基本的流程到各个特性以及源码中涉及的设计模式等。
1.MyBatis简介
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。也是现在比较主流的SSM(Spring + SpringMVC + MyBatis)开发框架之一,相比较于目前流行的ORM框架,它更灵活,处理复杂的数据表关联查询更加自由,因此在ORM大火之时其依然保持了旺盛的生命力!
2.JDBC的前世
JDBC API是Java提供的一套数据库访问标准接口,它规定了数据库从连接到执行SQL以及获取返回结果等一系列操作的规范,数据库各个厂商比如MySQL和Oracle等自己实现该套标准接口供开发人员使用。其使用的基本流程如下:
2.1 加载驱动
String driverName = "com.mysql.jdbc.Driver"; //mysql数据库的驱动名
Class.forName(driverName);
2.2 获取连接
String password = "password";
2.3 创建语句
Statement statement = connection.createStatement();
2.4 执行语句
ResultSet resultSet = statement.executeQuery("select * from db_name_table_name");
2.5 获取结果
while (resultSet.next()) {
Integer id = resultSet.getInt(1);
System.out.println(id);
String name = resultSet.getString(2);
System.out.println(name);
String pwd = resultSet.getString(3);
System.out.println(pwd);
Integer age = resultSet.getInt(4);
System.out.println(age);
}
以上五个步骤简单阐述了使用JDBC API获取数据库中表中的全部记录的过程。MyBatis对JDBC中大量的重复代码做了封装,并针对结果集提供了面向对象的封装,使得涉及数据库的开发工作通过简单的配置即可完成。下面我们看看MyBatis是如何在JDBC的前世后在今生如何简化数据库的操作。
3 JDBC的今生-MyBatis
关于MyBatis中的一些配置此处不一一列出,后续会做专门学习分享文章。
3.1 加载驱动
数据源org.apache.ibatis.datasource.unpooled.UnpooledDataSource中有如下方法,用于加载驱动。PooledDataSource作为数据库连接池性质的数据源其内部是UnpooledDataSource,故其加载驱动也是此方法。
系统将加载的驱动类存储起来,每次加载前判断是否已经加载当前要加载的驱动,若已经加载则不再重复加载。
3.2 获取连接
3.3 创建语句
三种StatementHandler用于处理不同的语句类型,分别是SimpleStatementHandler,PreparedStatementHandler,CallableStatementHandler,他们都继承于实现了StatementHandler接口BaseStatementHandler,通过RoutingStatementHandler分发处理。不同的语句类型创建语句不相同,因此创建语句的方法在基类BaseStatementHandler中声明为抽象方法。下面我们逐一看看他们怎么创建语句:
3.3.1 SimpleStatementHandler
3.3.2 PreparedStatementHandler
3.3.3 CallableStatementHandler
3.4 执行语句
语句的执行基本上都是执行statement.execute(sql)方法,需要特别说明的就是有的时候在自动生成主键的时候我们希望将自动主键返回,这个时候需要在执行的时候需要加上autoGeneratedKey参数。
3.5 结果处理
对于增删改的数据库操作statement执行update方法,返回的是影响的记录数,值为int类型;查询操作的结果CallableStatement的处理与其他两种不同。ResultSetHandler接口定义了两个方法处理这两种情况的结果。
DefaultResultSetHandler是ResultSetHandler的唯一实现类,会根据返回结果的要求返回对应的结果。存储过程执行结果的调用handleOutputParameters()方法。
以上是MyBatis关于实现JDBC操作的基本流程,后续会进行更加详细的学习。