mybatisplus源码底层实现原理,简述mybatis框架的工作原理和基本流程

  mybatisplus源码底层实现原理,简述mybatis框架的工作原理和基本流程

  

目录

1.前言2.案例项目源码3.米巴蒂斯源码解析底层执行原理3.1 读取框架配置文件创建出SqlSeesionFactory对象3.2 通过SqlSeesionFactory对象进而创建出使用对象3.3 通过使用的getMapper获取到接口代理对象3.4 通过制图人接口的代理对象执行令人厌恶的东西

 

  

1.前言

米巴提斯框架大家肯定都用过的,废话我就不再多说了,这篇文章就给大家分享一下有关米巴蒂斯框架底层的执行原理吧(调试!)

 

  

2.案例项目源码

我这里写了一个简单的米巴蒂斯相关的专家项目,把源码分享给大家,一会的调试就以这个项目的测试代码为主。

 

  首先给出砰的一声依赖。

  依赖项依赖项groupIdorg.mybatis/groupId artifactIdmybatis/artifactId版本3 .5 .1/版本/依赖项groupId MySQL/groupId artifact id MySQL-connector-Java/artifact id版本5 .1 .9/版本/依赖项依赖项groupIdorg.projectlombok/groupId artifactId lombok/artifactId版本1 .18 .20/版本/依赖项依赖项groupId JUnit/groupId artifact id JUnit/artifact id版本4.11/版本范围测试/范围/依赖性/依赖项构建!- 资源插件:处理src/main/java目录中的xml -资源资源目录rc/main/java/directory!- 所在的目录-包括!- 包括目录下的.属性,可扩展标记语言文件都会扫描到-包括**/*。属性/包含包括**/* .XML/包含/包含筛选错误/筛选/资源/资源/构建下面是实体类,以及数据库中表结构信息。

  包com。szh。实体;进口龙目岛AllArgsConstructor进口龙目岛。数据;进口龙目岛NoArgsConstructor/* * * */@ Data @ NoArgsConstructor @ AllArgsConstructorpublic class Student { private Integer id;私有字符串名称;私有整数年龄;私人字符串电子邮件;}

  ter">

  

然后是对应的mapper接口和xml映射文件。

 

  

package com.szh.dao;import com.szh.entity.Student;import java.util.List;/** * */public interface StudentDao { List<Student> selectAll();}
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.szh.dao.StudentDao"> <sql id="column"> id, name, age, email </sql> <select id="selectAll" resultType="com.szh.entity.Student"> select <include refid="column"></include> from student </select></mapper>
接下来是数据库配置文件和mybatis核心配置文件。

 

  

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/ssm?useUnicode=true&amp;characterEncoding=utf-8jdbc.username=rootjdbc.password=12345678
<?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> <properties resource="jdbc.properties" /> <!--设置日志--> <settings> <setting name="logImpl" value="STDOUT_LOGGING"/> </settings> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <!--配置数据源:创建Connection对象--> <dataSource type="POOLED"> <!-- driver:驱动内容 --> <property name="driver" value="${jdbc.driver}"/> <!-- 连接数据库的url --> <property name="url" value="${jdbc.url}"/> <!-- 用户名 --> <property name="username" value="${jdbc.username}"/> <!-- 密码 --> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <mappers> <mapper class="com.szh.dao.StudentDao"/><!-- <package name="com.szh.dao"/>--> </mappers></configuration>
最后给出获取mybatis中核心对象(SqlSeesion、SqlSeesionFactory这些对象)的工具类、以及测试代码。

 

  

package com.szh.utils; import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;import java.io.InputStream; /** * 工具类:创建SqlSession对象 */public class MyBatisUtil { private static SqlSessionFactory factory = null; static { String config = "mybatis.xml"; try { InputStream inputStream = Resources.getResourceAsStream(config); factory = new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } public static SqlSession getSqlSession() { SqlSession session = null; if (factory != null) { session = factory.openSession(); } return session; }}
package com.szh; import com.szh.dao.StudentDao;import com.szh.entity.Student;import com.szh.utils.MyBatisUtil;import org.apache.ibatis.session.SqlSession;import org.junit.Test; import java.util.List; /** * */public class MyTest { @Test public void testSelectStudents() { SqlSession session = MyBatisUtil.getSqlSession(); StudentDao studentDao = session.getMapper(StudentDao.class); //com.sun.proxy.$Proxy == StudentDaoImpl System.out.println("studentDao === " + studentDao.getClass().getName()); List<Student> studentList = studentDao.selectAll(); studentList.forEach(stu-> System.out.println("stu = " + stu)); session.close(); }}
下面我们测试一下,确保项目可以正常运行,然后再进行debug。

 

  

 

  

 

  

3.MyBatis源码解析底层执行原理

 

  

3.1 读取mybatis配置文件创建出SqlSeesionFactory对象

由于我们这里要摸清MyBatis框架到底是如何执行的?如何创建SqlSeesionFactory、SqlSession这些对象的?怎样解析配置文件的?

 

  所以debug的源头就从下面这张图开始。

  

 

  

然后我们按F7跟进去,这里需要按两次,因为有两个方法需要确定跟哪个?我们进到build方法中。

 

  

 

  

上图也就是跟进去的build方法,可以看到这个inputStream中读取的就是我们当前项目的 mybatis 核心配置文件了。

 

  接下来再次F7跟进这个build方法中。

  此时在下图可以看到,有一个XMLConfigBuilder这个类,从名字上大致可以猜到它就是来解析我们的mybatis 核心配置文件(mybatis.xml)。

  

 

  

 

  

在 parseConfiguration 这个方法中,我们可以通过 Evaluate 计算一下这个root 的值是什么。

 

  

<configuration><properties resource="jdbc.properties"/><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><mappers><mapper class="com.szh.dao.StudentDao"/></mappers></configuration>

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: