玖叶教程网

前端编程开发入门

SpringBoot整合Mybatis-Plus源码分析(九) SqlSession Insert流程

上文已经说到Dao代理对象经过一步步执行最后会调用到SqlSession对象,该对象是一个接口,具体实现类是DefaultSqlSession,调用该类的insert方法会调用update方法,该方法的截图如下:

从截图可以看成该方法从Configuration中获取MappedStatement对象,接着调用BaseExecutor的update方法,update方法调用doUpdate()方法,方法截图如下:

该方法逻辑是从MappedStatement中获取Configuration对象,通过调用Configuration的newStatementHandler方法,新创建一个RoutingStatementHandler对象,该对象实现了StatementHandler接口,该接口是Mybatis最为重要的一个接口,它的主要作用主要有:

1.SQL语句的生成:根据用户传递的参数和配置的映射规则,StatementHandler接口会根据不同的操作(如查询、插入、更新、删除)生成对应的SQL语句。

2.参数绑定:StatementHandler接口将根据生成的SQL语句和用户传递的参数,将参数绑定到预编译的SQL语句中,确保SQL语句中的占位符得到正确的值。

3.SQL语句的执行:StatementHandler接口将执行绑定好参数的SQL语句,与数据库进行交互。它负责创建并管理JDBC的Statement对象,执行SQL语句并处理查询结果。

4.结果集的处理:对于查询操作,StatementHandler接口将获取执行结果的数据集,并根据配置的映射规则将结果集映射为Java对象或集合。

通过上面罗列的几条我们可以看出该对象的重要性,我们接着分析该对象有成员属性StatementHandler的delegate变量,在构造方法时候判断ms.getStatementType()的值是PREPARED,构造PreparedStatementHandler,该源码截图如下:

由截图看出delegate变量赋值为PreparedStatementHandler,该对象主要实现了StatementHandler接口,通过调用父类的构造方法赋值boundSql属性,该属性主要是要执行的sql语句的封装,创建一个成员属性为ParameterHandler对象,同时创建一个成员属性为ResultSetHandler对象,该类的构造函数截图如下:

下面我们说一下ParameterHandler对象和ResultSetHandler对象的作用。

一、ParameterHandler对象的作用

1.参数设置:ParameterHandler接口负责将用户传递的参数设置到预编译的SQL语句中的占位符位置。它会根据SQL语句中的参数占位符的位置和参数的类型,将参数正确地绑定到SQL语句中。

2.参数转换:ParameterHandler接口还负责将Java对象类型的参数转换为数据库所需的类型。这个过程通常涉及类型转换、格式化和序列化等操作。

3.参数获取:在某些情况下,我们可能需要在执行SQL语句之前获取参数的值,例如在插入数据后获取自动生成的主键。ParameterHandler接口提供了获取参数值的方法,以便在需要时获取参数的实际值。

二、ResultSetHandler对象的作用

1.结果集的映射:ResultSetHandler接口将根据配置的映射规则,将查询结果集中的每一行数据映射为Java对象或集合。它会通过读取结果集的元数据信息和配置的映射规则,将每一行数据转换为相应的Java对象。

2.结果集的处理:对于查询操作,ResultSetHandler接口将处理查询结果集中的每一行数据,并将其映射为Java对象或集合。它会根据映射规则设置Java对象的属性值,并将对象添加到最终的结果集中。

3.结果集的分页和排序:ResultSetHandler接口还可以进行结果集的分页和排序操作,根据配置的分页参数和排序规则,从整个结果集中提取出指定范围的数据。

从上面分析ParameterHandler和ResultSetHandler作用可以看出,这两个类与StatementHandler接口密切配合,共同完成SQL语句的执行任务。

在生成完StatementHandler对象以后,又调用了一个方法,该方法主要是调用了InterceptorChain的pluginAll方法,参数是StatementHandler对象,调用该方法获取一个StatementHandler接口的代理类,该方法的主要作用是做分页处理和一些定制化的执行,例如在sql语句执行之前设置一个时间,在执行之后设置一个时间,可以做到sql语句的执行时间功能,这个类是个插件,关于插件的分析大概在下下节会进行详细的分析。

接着从当前线程获取一个Connection对象,调用StatementHandler对象prepare方法传入Connection对象,接着调用PreparedStatementHandler对象的prepare方法,又继续调用instantiateStatement方法,该方法截图如下:

调用boundSql对象的getsql方法获取要执行的sql语句,接着调用jdbc操作Connection对象的prepareStatement执行sql语句,返回预编译对象Statement,继续调用StatementHandler对象的parameterize方法传入Statement对象,该方法截图如下:

可以看出又调用了成员属性ParameterHandler对象的setParameters对sql语句占位符就行填充值,该接口的实现类是MybatisParameterHandler,该方法截图如下:

从BoundSql获取List<ParameterMapping>集合,变量该集合获取要替换的属性列,反射获取对象的属性的值,获取TypeHandler的类型,本例子中TypeHandler类型是StringTypeHandler,就是把属性设置为string类型,设置完成以后又调用了StatementHandler对象的update方法最终调用JDBC PreparedStatement对象的execute执行最终返回结果。

总结:

本篇文章分析了SqlSession的insert执行流程,该流程主要是创建了StatementHandler对象,继而创建了ParameterHandler对象,由于本例子是新增操作没有设置结果集的返回,所以没有说ResultSetHandler,这个我在下节分析查询操作时候再详细分析,最终还是调用JDBC的一些操作数据库的方法,可见Mybati-Plus底层封装了JDBC的操作,方便开发。我们下节见。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言