zoukankan      html  css  js  c++  java
  • 设计模式在Mybatis中的应用

    SqlSession是MyBatis中提供的与数据库交互的接口,SqlSession实例通过工厂模式创建。为了创建SqlSession对象,首先需要创建SqlSessionFactory对象,而SqlSessionFactory对象的创建依赖于SqlSessionFactoryBuilder类,该类提供了一系列重载的build()方法,我们需要以主配置文件的输入流作为参数调用SqlSessionFactoryBuilder对象的bulid()方法,该方法返回一个SqlSessionFactory对象。有了SqlSessionFactory对象之后,调用SqlSessionFactory对象的openSession()方法即可获取一个与数据库建立连接的SqlSession实例。前面我们定义了UserMapper接口,这里需要调用SqlSession的getMapper()方法创建一个动态代理对象,然后调用UserMapper代理实例的方法即可完成与数据库的交互。SqlSessionManager使用了单例模式,在整个应用程序中只存在一个实例,我们可以通过该类提供的静态方法newInstance获取SqlSessionManager类的实例。SqlSessionManager实现了SqlSessionFactory和SqlSession接口,既可以获取SqlSession实例,又可以替代SqlSession完成与数据库的交互。

    MyBatis框架的配置信息有两种,一种是配置MyBatis框架属性的主配置文件;另一种是配置执行SQL语句的Mapper配置文件。Configuration的作用是描述MyBatis主配置文件的信息。Configuration组件还作为Executor、StatementHandler、ResultSetHandler、ParameterHandler组件的工厂类,用于创建这些组件的实例。Configuration类中提供了这些组件的工厂方法,这些工厂方法会根据MyBatis不同的配置创建对应的实现类。例如,Executor组件有4种不同的实现,分别为BatchExecutor、ReuseExecutor、SimpleExecutor、CachingExecutor,当defaultExecutorType的参数值为REUSE时,newExecutor()方法返回的是ReuseExecutor实例,当参数值为SIMPLE时,返回的是SimpleExecutor实例,这是典型的工厂方法模式的应用。

    MyBatis框架的基本使用时,我们使用到了SqlSession组件,它是用户层面的API。实际上SqlSession是Executor组件的外观,目的是为用户提供更友好的数据库操作接口,这是设计模式中外观模式(门面模式)的典型应用。真正执行SQL操作的是Executor组件,Executor可以理解为SQL执行器,它会使用StatementHandler组件对JDBC的Statement对象进行操作。当Statement类型为CallableStatement和PreparedStatement时,会通过ParameterHandler组件为参数占位符赋值。ParameterHandler组件中会根据Java类型找到对应的TypeHandler对象,TypeHandler中会通过Statement对象提供的setXXX()方法(例如setString()方法)为Statement对象中的参数占位符设置值。StatementHandler组件使用JDBC中的Statement对象与数据库完成交互后,当SQL语句类型为SELECT时,MyBatis通过ResultSetHandler组件从Statement对象中获取ResultSet对象,然后将ResultSet对象转换为Java对象。

    MyBatis提供了3种不同的Executor,分别为SimpleExecutor、ResueExecutor、BatchExecutor,这些Executor都继承至BaseExecutor,BaseExecutor中定义的方法的执行流程及通用的处理逻辑,具体的方法由子类来实现,是典型的模板方法模式的应用。SimpleExecutor是基础的Executor,能够完成基本的增删改查操作,ResueExecutor对JDBC中的Statement对象做了缓存,当执行相同的SQL语句时,直接从缓存中取出Statement对象进行复用,避免了频繁创建和销毁Statement对象,从而提升系统性能,这是享元思想的应用。BatchExecutor则会对调用同一个Mapper执行的update、insert和delete操作,调用Statement对象的批量操作功能。另外,我们知道MyBatis支持一级缓存和二级缓存,当MyBatis开启了二级缓存功能时,会使用CachingExecutor对SimpleExecutor、ResueExecutor、BatchExecutor进行装饰,为查询操作增加二级缓存功能,这是装饰器模式的应用。

    StatementHandler组件封装了对JDBC Statement的操作,例如设置Statement对象的fetchSize属性、设置查询超时时间、调用JDBC Statement与数据库交互等。BaseStatementHandler是一个抽象类,封装了通用的处理逻辑及方法执行流程,具体方法的实现由子类完成,这里使用到了设计模式中的模板方法模式。SimpleStatementHandler继承至BaseStatementHandler,封装了对JDBC Statement对象的操作,PreparedStatementHandler封装了对JDBC PreparedStatement对象的操作,而CallableStatementHandler则封装了对JDBC CallableStatement对象的操作。RoutingStatementHandler会根据Mapper配置中的statementType属性(取值为STATEMENT、PREPARED或CALLABLE)创建对应的StatementHandler实现。

  • 相关阅读:
    [BFS][链表][二分][STL]JZOJ 5875 听我说,海蜗牛
    [SPFA]JZOJ 5869 绿洲
    [Splay]Luogu 3960 NOIP2017 列队
    [扩欧]JZOJ 5855 吃蛋糕
    [模拟退火][堆优化Prim]2017TG Day2 T2 宝藏
    [并查集]奶酪
    [容斥]JZOJ 5843 b
    JS Undefined 类型
    Python logging 模块
    14.浏览器屏幕缩放bug修复
  • 原文地址:https://www.cnblogs.com/aohongzhu/p/15174382.html
Copyright © 2011-2022 走看看