手写mybatis框架分析

sql解析流程(从配置文件中获取JDBC需要的数据信息)

Sql解析流程不是一边执行一边解析,而是需要一次性先解析完成配置文件,将所有解析出来的数据封装到Configuration对象中

1.通过全局配置文件的读取和解析工作,最终将解析出来的信息,封装到【Configuration】对象中

  • 运行时环境信息,其实在此指的就是DateSource的配置信息,将DataSource对象中存储。
  • 加载全局配置文件的时候,会触发映射文件的加载;
  • 映射文件的加载,先针对每个select标签进行解析,获取【id值(statement)、SQL语句、参数类型、结果类型、statement类型】,最终将解析出来的信息,封装到【MappedStatement】对象,将该对象封装集合,key为statementId,vaue就是该对象,然后就集合存储到【Configuration】对象中
  • MappedStatement对象中存储sql信息,是通过SqlSource进行存储的。SqlSource对象,不只是存储sql信息,而且还提供了对SQl信息进行处理的功能
  • SqlSource是通过一个SqlNode集合数据来封装的SQL信息
全局配置文件: 

        
            
            
                
                
                
                
            
        
    

映射配置文件:

        
        


    
    
        
        
        
        
            
        
    
    

sql执行流程(使用JDBC代码,加上从配置文件读取的SQL相关信息,就可以完成CRUD的执行过程)

  获取数据源对象(需要driverClassName、url、username、password),提升Configuration性能

    【获取Configuration对象,从该对象中获取dataSource对象】

    【获取dataSource对象,就可以从该对象中获取Connection对象】

 //加载数据库的驱动
 Class.forName(driverClassName);
 //通过驱动管理类获取数据库连接connetion=DriverManager
 connection = DriverManager.getConnection(url, username, password);
 【获取JDBC可以执行的SQL语句,其实此处获取的是BoundSql,此时其实调用的就是【SqlSource】的SQL解析功能】
 【从BoundSql语句获取sql语句】
 //定义sql语句?表示占位符
 String sql=sqlStr;
 【从MappedStatement对象中获取statement的类型:sinple、prepared、callable】
 //获取预处理statement
 preparedStatement = connection.prepareStatement(sql);
 【从BoundSql中获取参数集合信息List】
 【遍历给参数赋值,先需要读取ParameterMapping中的属性名称从入参对象中获取指定属性的值】
 【调用JDBC代码,完成属性设置】
 //设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的
 preparedStatement.setString(1,"hgd");
 【执行statement,并获取结果集ResultSet】
 //向数据库发出sql执行查询,查询出结果集
 resultSet = preparedStatement.executeQuery();
 【从MappedStatement对象中获取输出结果类型,也就是要映射的类型】
 【遍历结果集,获取结果集中每一行的数据】
 【获取结果集中每一行每一列的数据,获取列的名称】
 【根据列的名称,通过反射,去设置要映射的java类型的知道属性值】
 //遍历查询结果集
 where(resultSet.next()){
    System.out.println(resultSet.getString("id"))
 }

   

你可能感兴趣的:(mybatis)