# 第09章 LanguageDriverRegistry语言驱动注册器

# 9.1 引入

MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL 查询。

Configuration的构造器如下:

public Configuration() {
    // ...类型注册 省略

    languageRegistry.setDefaultDriverClass(XMLLanguageDriver.class);
    languageRegistry.register(RawLanguageDriver.class);
}
1
2
3
4
5
6

在 mybatis-config.xml 文件中设置如下:

<typeAliases>
    <typeAlias type="org.sample.MyLanguageDriver" alias="myLanguage"/>
</typeAliases>
<settings>
    <setting name="defaultScriptingLanguage" value="myLanguage"/>
</settings>
1
2
3
4
5
6

除了设置默认语言,你也可以针对特殊的语句指定特定语言,这可以通过如下的 lang属性来完成:

<select id="selectBlog" lang="myLanguage">
    SELECT * FROM BLOG
</select>
1
2
3

或者在你正在使用的映射中加上注解 @Lang 来完成:

public interface Mapper {
    @Lang(MyLanguageDriver.class)
    @Select("SELECT * FROM BLOG")
    List<Blog> selectBlog();
}
1
2
3
4
5

# 9.2 语言驱动注册器

结构:

1552225795026

内含集合:

private final Map<Class<? extends LanguageDriver>, LanguageDriver> LANGUAGE_DRIVER_MAP = new HashMap<>();
1

key为LanguageDriver的子类的类信息,value为LanguageDriver接口的实现类

默认的类信息:

private Class<? extends LanguageDriver> defaultDriverClass;
1

# 9.2.1 获取语言驱动

  public LanguageDriver getDriver(Class<? extends LanguageDriver> cls) {
    return LANGUAGE_DRIVER_MAP.get(cls);
  }

  public LanguageDriver getDefaultDriver() {
    return getDriver(getDefaultDriverClass());
  }

  public Class<? extends LanguageDriver> getDefaultDriverClass() {
    return defaultDriverClass;
  }
1
2
3
4
5
6
7
8
9
10
11

# 9.2.2 注册语言驱动

// 根据类型注册
public void register(Class<? extends LanguageDriver> cls) {
    if (cls == null) {
        throw new IllegalArgumentException("null is not a valid Language Driver");
    }
    if (!LANGUAGE_DRIVER_MAP.containsKey(cls)) {
        try {
            LANGUAGE_DRIVER_MAP.put(cls, cls.newInstance());
        } catch (Exception ex) {
            throw new ScriptingException("Failed to load language driver for " + cls.getName(), ex);
        }
    }
}

// 根据实例注册
public void register(LanguageDriver instance) {
    if (instance == null) {
        throw new IllegalArgumentException("null is not a valid Language Driver");
    }
    Class<? extends LanguageDriver> cls = instance.getClass();
    if (!LANGUAGE_DRIVER_MAP.containsKey(cls)) {
        LANGUAGE_DRIVER_MAP.put(cls, instance);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

注册默认的驱动:

public void setDefaultDriverClass(Class<? extends LanguageDriver> defaultDriverClass) {
    register(defaultDriverClass);
    this.defaultDriverClass = defaultDriverClass;
  }
1
2
3
4

# 9.3 语言驱动

结构:

1552226211667

包括生成参数处理器(ParameterHandler)和sql源(SqlSource)

实现类:

1552226306202

Last Updated: 10/20/2019, 11:49:45 PM