zoukankan      html  css  js  c++  java
  • Mybatis的简单分析

    设计模式分析
    1.读取配置文件

    读取配置文件有两种方式:
    

    使用类加载器,它只能读取类路径的配置文件

    使用ServletContext对象的getRealPath()

    2.创建SQLSessionFactory工厂

    创建工厂使用的构建者模式。 SqlSessionFactory即为构建者,它会处理一切构建。把配置文件输入流放进去,即可创建对象。把对象的创建细节隐藏,使用者可直接拿到对象。
    

    3.使用工厂生产SqlSession对象

    生产SqlSession使用了生产模式,可以解耦,降低类之间的依赖关系。无须重新编码。
    

    4.使用SqlSession创建Dao接口的代理对象

    getMapper,创建Dao接口实现类使用了代理模式,可以在不修改源码的基础上对已有方法增强。
    

    5.使用代理对象执行方法

    6.释放资源

    // 注意要把对象映射到实体类中

    Mybatis注解开发
    把IUserDao.xml移除,在dao接口的方法上使用@Select注解。

    同时需要再SqlMapConfig.xml的mapper上使用class注解
    

    编写Dao实现类的方式
    仍然支持Dao实现类,但是太 tm 麻烦。这里就不展示了。

    自定义Mybatis的分析
    Mybatis在使用代理Dao的方式实现增删改查时在做什么事呢?

    其实它只做了俩件事:
    
    		1.创建代理对象
    
    		2.执行selectList
    

    dataSource用于配置数据库的基本信息
    连接信息

    映射配置信息

    映射信息

    用于执行的sql语句,可获取preparedStatement,此配置中还有封装的实体类全限定类名。

    执行的SQL语句

    以上为配置文件,读取配置文件所用到的技术就是所谓的解析XML技术,此处所用的为dom4j解析xml的技术。

    简单解释:
    SelectList方法:

    根据配置文件的信息创建Connection对象。注册驱动,获取连接。

    获取预处理对象PreparedStatement。此时需要SQL语句。

    conn.prepareStatement(sql);

    执行查询。

    ResultSet resultSet = preparedStatement.executeQuery();其返回的对象是ResultSet类型

    遍历结果集用于封装

    首先 我们会需要有个List队列来便利。

    List list = new ArrayList();

    while(resultSet.next()){

    ​ E element = (E)CLass.forName(配置的全限定类名).newInstance;//此处就可以放入用于接受的类

    ​ //进行封装,把每个ResultSet的内容都添加到element中
    //我们实体类的属性和表中的列名是一致的,因此我们可以把列名看成实体类的属性名称,通过反射的方式来根据名称获取每个属性,并把值附进去。

    //把element加入到list中
    list.add(element);
    

    }

    List list = new ArrayList();

    while(resultSet.next()){

    • E element = (E)CLass.forName(配置的全限定类名).newInstance;//此处就可以放入用于接受的类

    • //进行封装,把每个ResultSet的内容都添加到element中
    //我们实体类的属性和表中的列名是一致的,因此我们可以把列名看成实体类的属性名称,通过反射的方式来根据名称获取每个属性,并把值附进去。

    //把element加入到list中
    list.add(element);
    


    }

    返回list

    return list;

    要想让selectList方法执行,需给方法提供两个信息。

    连接信息

    映射信息

    执行的SQL语句

    封装结果的实体类全限定类名

    可把映射信息的两部分定义成一个对象,从而重复使用。我们暂称之为,Mapper。

    String Mapper
    com.Sitr.dao.IUserDao Mapper对象
    findAll String sql/String domainClassPath
    以上 SelectList的部分则已经全部组装完成。

    创建代理对象的分析
    在前面,我们使用了如下语句来创建Dao接口的代理对象。

    IUserDao userDao = session.getMapper(IUserDao.class);
    在这里,我们使用了反射机制。

    //根据dao接口的字节码创建Dao的代理对象
    public T getMapper(Class daoInterfaceClass){
    /**
    类加载器:它使用的和被代理对象是相同的类加载器
    代理对象要实现的接口:和被代理对象相同的接口
    如何代理:增强的方法,需要自己提供。
    此处是一个InvocationHandler的接口,在这里需要自己写一个该接口的实现类,在实现类中调用selectList方法。
    */

    Proxy.newProxyInstance(类加载器,代理对象要实现的接口字节码数组,如何代理);
    

    }

    你好啊,谢谢你来看我。
  • 相关阅读:
    洛谷P4550 收集邮票 期望dp
    Codeforces Round #748 (Div. 3) G. Changing Brackets
    [Codeforces Round #748 (Div. 3)](https://codeforces.com/contest/1593) F. Red-Black Number 记忆化搜索
    [Codeforces Round #748 (Div. 3)](https://codeforces.com/contest/1593) D2 Half of Same
    HDU 3746 Cyclic Nacklace kmp找循环节
    Codeforces Round #747 (Div.2) D. The Number of Imposters
    Nand2tetris 学习笔记
    怎样解题表
    [省选]知识点板块
    List of Problems to be Solved
  • 原文地址:https://www.cnblogs.com/sitr/p/12563292.html
Copyright © 2011-2022 走看看