mybatis 自定义函数_[Java进阶之Mybatis]Mybatis所涉及主要的设计模式

本文深入探讨了Mybatis框架中涉及的主要设计模式,包括Builder模式、工厂模式、代理模式、单例模式、组合模式、模板方法模式、适配器模式、装饰者模式和迭代器模式。通过实例解析了每种模式的原理,并展示了在Mybatis中的具体体现,如SqlSessionFactoryBuilder、SqlSession的创建、Mapper接口的代理执行等。
摘要由CSDN通过智能技术生成

文章内容输出来源:拉勾教育Java高薪训练营

写在前面:
本人从一线城市回到二三线,怕自己技术落后,所以选择报名了这一期拉勾的java训练营,主要目的是为了再重新顺一遍框架底层,加深一下印象。很多技术在应用中,都忘记了原理,所以回来重新捡起来。自己找学习资源不方便的一点是版本,有很多技术,虽然与高版本通用,但会遗漏很多新特性。而且很多问题点没办法去问。平时工作忙起来的话,也不能随着自己的学习进度去调整,很快就遗忘了。所以尝试一下这种形式。
课程本身来说,讲义非常细致,也很全面。首先提出问题,然后提出针对这种问题,设计者们采用了什么思想和什么方式,一步步的去剖析框架,从最基础的需要入手,最终把框架完整的展现在面前。而不是像很多教程,直接上来就教底层,上来就教使用。全程没有废话,语言非常简洁,直接说明重点,没有任何拖泥带水。课程采用阶段闯关式,这种形式非常适合上班族,把一个质变的过程阶段化,让学习的人能通过完成阶段小目标得到阶段性的提升,最终实现整体上思维的升级。
学习群的氛围还是非常好的,大家都非常热心的互相解决工作和学习中的问题。良好的氛围有助于坚持学习的过程。 技术导师和班主任也非常负责,会反复确认学员的学习状态,快速的解答阶段中的疑惑。所以个人认为这个课程是物有所值。

在学习中还需要整理笔记,这一点由于我整理的比较杂乱,很多笔记都只有自己能看懂,所以像此篇,经过认真整理之后,才会发出来:

f0e29955b4e3ade10b5ce643fe1935af.png

接下来将会对每一种设计模式进行举例,同时找到Mybatis中的体现

1.Builder模式

builder模式的定义为:将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

它属于创建类模式,一般来说,如果一个对象的构建比较复杂,超出构造函数能包含的范围,就可以使用工厂模式和builder模式。工厂模式会产出完整产品,而builder应用于更加复杂的对象的构建,甚至只是一小部分,也就是用多个简单的对象一步步构建为复杂对象。

1.1 举栗子:用builder设计模式生产computer

步骤:

  1. 将需要构建的目标类分成多个部件(电脑可以分为主机、显示器、键盘、音箱等部件)
  2. 创建构建类
  3. 依次构建部件
  4. 将部件组装成目标对象

首先在项目中引入lombok辅助构建对象(可选)

<dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
</dependency>

1.1.1 定义computer

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Computer {
    
​
    // 显示器
    private String displayer;
    // 主机
    private String mainUnit;
    // 鼠标
    private String mouse;
    // 键盘
    private String keyboard;    
}

1.1.2 ComputerBuilder

public class ComputerBuilder {
    
​
    private Computer computer = new Computer();
​
    public void installDisplayer(String displayer) {
    
        computer.setDisplayer(displayer);
    }
​
    public void installMainUnit(String mainUnit) {
    
        computer.setMainUnit(mainUnit);
    }
​
    public void installMouse(String mouse) {
    
        computer.setMouse(mouse);
    }
​
    public void installKeyboard(String keyboard) {
    
        computer.setKeyboard(keyboard);
    }
​
    public Computer getComputer() {
    
        return computer;
    }
​
}

1.1.3 调用测试:

public static void main(String[]args){
    
    ComputerBuilder computerBuilder=new ComputerBuilder();
    computerBuilder.installDisplayer("显示器");
    computerBuilder.installMainUnit("主机");
    computerBuilder.installKeybord("键盘");
    computerBuilder.installMouse("鼠标");
    Computer computer=computerBuilder.Builder();
    System.out.println(computer);
}

1.2 Mybatis中的体现

Mybatis的初始化工作很复杂,构造函数搞不定,所以使用了builder模式,构建了大量builder,进行分层构造,核心对象Configuration使用XMLConfigBuilder来进行构造。

4a3eb059a9da82f04be68461497beaf1.png

在Mybatis环境的初始化过程中,SqlSessionFactoryBuilder会调用XMLConfigBuilder读取所有的MybatisMapConfig.xml 和所有的 *Mapper.xml 文件,构建 Mybatis 运行的核心对象 Configuration对 象,然后将该Configuration对象作为参数构建一个SqlSessionFactory对象。

private void parseConfiguration(XNode root) {
    
    try {
       
        //解析<properties />标签
        propertiesElement(root.evalNode("properties"));
        // 解析 <settings /> 标签
        Properties settings = settingsAsProperties(root.evalNode("settings"));
        //加载自定义的VFS实现类
        loadCustomVfs(settings);
        // 解析 <typeAliases /> 标签
        typeAliasesElement(root.evalNode("typeAliases"));
        //解析<plugins />标签
        pluginElement(root.evalNode("plugins"));
        // 解析 <objectFactory /> 标签
        objectFactoryElement(root.evaINode("obj ectFactory"));
        // 解析 <objectWrapper Factory /> 标签
        obj ectWrappe rFacto ryElement(root.evalNode("objectWrapperFactory"));
        // 解析 <reflectorFactory /> 标签
        reflectorFactoryElement(root.evalNode("reflectorFactory"));
        // 赋值 <settings /> 到 Configuration 属性
        settingsElement(settings);
        // read it after objectFactory and objectWrapperFactory issue #631
        // 解析 <environments /> 标签
        environmentsElement(root.evalNode("environments"));
        // 解析 <databaseIdProvider /> 标签
        databaseldProviderElement(root.evalNode("databaseldProvider"));
        typeHandlerElement(root.evalNode("typeHandlers"));
        mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
    
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
}

XMLConfigBuilder 在构建 Configuration 对象时,也会调用 XMLMapperBuilder 用于读取 *Mapper 文件,而XMLMapperBuilder会使用XMLStatementBuilder来读取和build所有的SQL语句。

//解析<mappers />标签
mapperElement(root.evalNode("mappers"));

在这个过程中,有一个相似的特点,就是这些Builder会读取文件或者配置,然后做大量的XpathParser 解析、配置或语法的解析、反射生成对象、存入结果缓存等步骤,这么多的工作都不是一个构造函数所 能包括的,因此大量采用了 Builder模式来解决 。

b5e6d53d4e14c0b87babec7839f188dc.png
SqlSessionFactoryBuilder根据不同参数,构建不同的SqlSessionFactory对象

2.工厂模式

Mybatis中比如SqlSessionFactory使用的是工厂模式,该工厂没有那么复杂的逻辑,是一个简单工厂 模式。简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于创 建型模式。 在简单工厂模式中,可以根据参数的不同返回不同类的实例。简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类 。

2.1 举栗子:生产Computer

假设有一个电脑的代工生产商,它目前已经可以代工生产联想电脑了,随着业务的拓展,这个代工生产 商还要生产惠普的电脑,我们就需要用一个单独的类来专门生产电脑,这就用到了简单工厂模式。

步骤

2.1.1 创建抽象产品类

我们创建一个电脑的抽象产品类,他有一个抽象方法用于启动电脑:

public abstract class Computer {
    
    public abstract void start();
}

2.1.2 创建具体产品类

接着我们创建各个品牌的电脑,他们都继承了他们的父类Computer,并实现了父类的start方法:

public class LenovoComputer extends Computer{
    
    @Override
    public void start() {
    
    System.out.println("联想电脑启动");
}
public class HpComputer extends Computer{
    
    @Override
    public void start() {
    
        System.out.println("惠普电脑启动");
    }
}

2.1.3 创建工厂类

接下来创建一个工厂类,它提供了一个静态方法createComputer用来生产电脑。你只需要传入你 想生 产的电脑的品牌,它就会实例化相应品牌的电脑对象。

public class ComputerFactory {
​
    public static Computer createComputer(String type) {
        Computer computer = null;
        switch (type) {
            case "lenovo":
                computer = new LenovoComputer();
            case "
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值