mybatis源码分析

Mybatis源码分析


第一章、回顾
1. 工具的版本
1. JDK8
2. IDEA2018.3
3. Maven3.5.3
4. MySQL 5.1.48 --> MySQL 5
   Mybatis 3.4.6
2. Mybatis开发的简单回顾
1. Mybatis做什么?
   Mybatis是一个ORM类型框架,解决的数据库访问和操作的问题,对现有JDBC技术的封装。
2. Mybaits搭建开发环境 
   1. 准备jar
     <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.6</version>
     </dependency>
     <dependency>
       <groupId>mysql</groupId>
       <artifactId>mysql-connector-java</artifactId>
       <version>5.1.48</version>
     </dependency>
   2. 准备配置文件
      a. 基本配置文件 mybatis-config.xml
         1. 数据源的设置 environments
         2. 类型别名
         3. mapper文件的注册
      b. Mapper文件
         1. DAO规定方法的实现 --> SQL语句 
   3. 初始化配置 
      mybatis-config.xml
      配置 environment
3. 开发步骤 7步
   1. entity
   2. 类型别名
   3. table 
   4. DAO接口
   5. Mapper文件
   6. Mapper文件的注册
   7. API编程 
  • 核心代码分析

    InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    SqlSession sqlSession = sqlSessionFactory.openSession();
    
    两种方式功能等价 
    实现效果 区别 
      
    那种方式好?第一种方式好 表达概念更清晰 
              第一种开发,本质上就是对第二种开发的封装。(代理设计模式)
      
    UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
    List<User> users = userDAO.queryAllUsers();
    
    List<User> users = sqlSession.selectList("com.baizhiedu.dao.UserDAO.queryAllUsers");
    
    String name = "huxz";
    
    public class User{
      private String name = "huxz";
    }
    
第二章、Mybaits的核心对象
1. Mybatis的核心对象及其作用
1. 数据存储类对象
   概念:在Java中(JVM)对Mybatis相关的配置信息进行封装
   mybatis-config.xml ----> Configuration
   Configuration 
      1. 封装了mybatis-config.xml
      2. 封装了mapper 文件  MappedStatement
      3. 创建Mybatis其他相关的对象 
   XXXDAOMapper.xml ----> MappedStatement(形象的认知,不准确)
  操nt对象 
      对应的就是 Mapper文件中的一个一个的 配置标签 
      <select id. -----> MappedStatement
      <insert id. -----> MappedStatement 
      
      注定 一个Mybatis应用中 N个MappedStament 对象 
      MappedStatment ---> Configuration 
   
      MappedStatment 中 封装SQL语句 ---> BoundSql
2. 操作类对象 (SqlSession) ---> 门面 
    Excutor
      Excutor 是Mybatis中处理功能的核心
              1. 增删改update  查query
              2. 事务操作 
                 提交 回滚
              3. 缓存相关的操作
      Excutor接口 
           BatchExcutor
               JDBC中批处理的操作, BatchExcutor 
           ReuseExcutor
               目的:复用 Statement 
               insert into t_user(ID,name)values(1,‘孙帅’);
               insert into t_user(ID,name)values(2,‘孙帅1’);
           SimpleExcutor
               常用Excutor Mybatis推荐 默认 
               Configuration protected ExecutorType defaultExecutorType = ExecutorType.SIMPLE;
           
    StatmentHandler
       StatementHandler是Mybatis封装了JDBC Statement,真正Mybatis进行数据库访问操作的核心
                  功能:增删改差
       StatementHandler接口
                  SimpleStatementHandler
                      JDBC 操作 
                  PreparedStatementHandler
                  CallableStatementHandler 
    
    ParameterHandler
        目的:Mybatis参数 ---》 JDBC 相关的参数 
             @Param ---> #{} --- > ?
    ResultSetHandler
        目的:对JDBC中查询结果集 ResultSet 进行封装 
        
    TypeHandler
        Java程序操作 数据库
        Java类型   数据库类型
        String    varchar
        int       number
        int       int 
    

在这里插入图片描述
在这里插入图片描述

2. Mybatis的核心对象 如何与SqlSession建立的联系?
Mybatis源码中的这些核心对象 在 SqlSession调用对应功能时候建立联系 

SqlSession.insert()
     DefaultSqlSession
             Exctutor
                 StatmentHandler 
SqlSession.update()
SqlSession.delete()
SqlSession.selectOne();
...
  
  
底层  SqlSession.insert()
      SqlSession.update()
      SqlSession.delete()
      ....

应用层面:
    UserDAO userDAO =  SqlSession.getMapper(UserDAO.class);
    //UserDAO接口的实现类的对象 
    //疑问? UserDAO接口实现类 在哪里?
    //动态字节码技术 ---> 类 在JVM 运行时创建 ,JVM运行结束后,消失了 
    //动态字节码技术 
          1. 如何 创建 UserDAO XXXDAO接口的实现类 
             代理 (动态代理)
             a. 为原始对象(目标)增加【额外功能】 
             b. 远程代理 1.网络通信 2.输出传输 (RPCDubbo 
             c. 接口实现类,我们看不见实实在在的类文件,但是运行时却能体现出来。
                无中生有
            
                Proxy.newProxyIntance(ClassLoader,Interface,InvocationHandler)
            
          2. 实现类 如何进行实现的             
             interface UserDAO{
                  List<User> queryAllUsers();         
                  save(User user)
             }
             UserDAOImpl implements UserDAO{
                 queryAllUsers(){
                     sqlSession.select("namespace.id",参数)
                        |-Excutor
                            |-StatementHandler
                                 |- ParameterHandler , ResultSetHandler
                                              TypeHandler 
                 }
                 save(){
                     sqlSession.insert("namespace.id",参数)
                 }
             }
    userDAO.queryUserById()
    userDAO.queryUsers();

MyBatis 完成代理创建 核心类型 ---> DAO接口的实现类 
     MapperProxy implements InvocationHandler 
     DAO接口Class
     SqlSession 
  
        invoke
              SqlSession.insert 
                         update
                         delete
                         selectOne
                         selectList
  
          SqlCommand:
                1. id = namespace.id
                2. type = insert|delete|select 
                          SqlSession.insert()
                          SqlSession.delete
                          ....
        
     MapperProxyFactory
         Proxy.newProxyInstrace()
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值