Mybatis-generator的SQLServer插件之with nolock

關(guān)于SQLServer數(shù)據(jù)庫委造,有時候不加nolock戳鹅,速度就會很慢。所以有必要寫個插件了昏兆。
新建一個Springboot項目枫虏,添加以下依賴:

       <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <scope>runtime</scope>
       </dependency>
       <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.3.7</version>
        </dependency>

接下來就進入正題了,新建一個類爬虱,繼承PluginAdapter.

public class SelectWithNolockPlugin extends PluginAdapter {

    /**
     * 判斷數(shù)據(jù)庫是否支持nolock
     */
    private boolean isSupportNolock = false;

    /**
     * 根據(jù)DriverClass判斷是否支持nolock
     */
    public void checkIsSupportNolock() {
        String driverClass = context.getJdbcConnectionConfiguration().getDriverClass();
        if (driverClass.contains("sqlserver")) {
            isSupportNolock = true;
        } else {
            isSupportNolock = false;
        }
    }

    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }

    /**
     * 代碼參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.CountByExampleElementGenerator
     *
     * @param element
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapCountByExampleElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        //return super.sqlMapCountByExampleElementGenerated(element, introspectedTable);
        checkIsSupportNolock();
        element.getElements().clear();

        StringBuilder sb = new StringBuilder();
        sb.append("select count(*) from "); //$NON-NLS-1$
        sb.append(introspectedTable
                .getAliasedFullyQualifiedTableNameAtRuntime());
        if (isSupportNolock)
            sb.append(" with (nolock) ");
        element.addElement(new TextElement(sb.toString()));
        element.addElement(getExampleIncludeElement(introspectedTable));

        return true;
    }

    /**
     * 代碼參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByExampleWithoutBLOBsElementGenerator
     *
     * @param element
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        //return super.sqlMapSelectByExampleWithoutBLOBsElementGenerated(element, introspectedTable);
        checkIsSupportNolock();
        element.getElements().clear();
        element.addElement(new TextElement("select")); //$NON-NLS-1$
        XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "distinct")); //$NON-NLS-1$ //$NON-NLS-2$
        ifElement.addElement(new TextElement("distinct")); //$NON-NLS-1$
        element.addElement(ifElement);

        StringBuilder sb = new StringBuilder();
        if (stringHasValue(introspectedTable
                .getSelectByExampleQueryId())) {
            sb.append('\'');
            sb.append(introspectedTable.getSelectByExampleQueryId());
            sb.append("' as QUERYID,"); //$NON-NLS-1$
            element.addElement(new TextElement(sb.toString()));
        }
        element.addElement(getBaseColumnListElement(introspectedTable));

        sb.setLength(0);
        sb.append("from "); //$NON-NLS-1$
        sb.append(introspectedTable
                .getAliasedFullyQualifiedTableNameAtRuntime());
        if (isSupportNolock)
            sb.append(" with (nolock) ");
        element.addElement(new TextElement(sb.toString()));
        element.addElement(getExampleIncludeElement(introspectedTable));

        ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
        ifElement.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
        element.addElement(ifElement);

        return true;
    }

    /**
     * 代碼參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByExampleWithBLOBsElementGenerator
     *
     * @param element
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapSelectByExampleWithBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        //return super.sqlMapSelectByExampleWithBLOBsElementGenerated(element, introspectedTable);
        checkIsSupportNolock();
        element.getElements().clear();
        element.addElement(new TextElement("select")); //$NON-NLS-1$
        XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "distinct")); //$NON-NLS-1$ //$NON-NLS-2$
        ifElement.addElement(new TextElement("distinct")); //$NON-NLS-1$
        element.addElement(ifElement);

        StringBuilder sb = new StringBuilder();
        if (stringHasValue(introspectedTable
                .getSelectByExampleQueryId())) {
            sb.append('\'');
            sb.append(introspectedTable.getSelectByExampleQueryId());
            sb.append("' as QUERYID,"); //$NON-NLS-1$
            element.addElement(new TextElement(sb.toString()));
        }

        element.addElement(getBaseColumnListElement(introspectedTable));
        element.addElement(new TextElement(",")); //$NON-NLS-1$
        element.addElement(getBlobColumnListElement(introspectedTable));

        sb.setLength(0);
        sb.append("from "); //$NON-NLS-1$
        sb.append(introspectedTable
                .getAliasedFullyQualifiedTableNameAtRuntime());
        if (isSupportNolock)
            sb.append(" with (nolock) ");
        element.addElement(new TextElement(sb.toString()));
        element.addElement(getExampleIncludeElement(introspectedTable));

        ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "orderByClause != null")); //$NON-NLS-1$ //$NON-NLS-2$
        ifElement.addElement(new TextElement("order by ${orderByClause}")); //$NON-NLS-1$
        element.addElement(ifElement);
        return true;
    }

    /**
     * 代碼參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SelectByPrimaryKeyElementGenerator
     * 和參考自org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SimpleSelectByPrimaryKeyElementGenerator
     *
     * @param element
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        //return super.sqlMapSelectByPrimaryKeyElementGenerated(element, introspectedTable);
        checkIsSupportNolock();
        String type = context.getTargetRuntime();
        if (!stringHasValue(type)) {
            type = IntrospectedTableMyBatis3Impl.class.getName();
        } else if ("MyBatis3".equalsIgnoreCase(type)) { //$NON-NLS-1$
            type = IntrospectedTableMyBatis3Impl.class.getName();
        } else if ("MyBatis3Simple".equalsIgnoreCase(type)) { //$NON-NLS-1$
            type = IntrospectedTableMyBatis3SimpleImpl.class.getName();
        } else if ("MyBatis3DynamicSql".equalsIgnoreCase(type)) { //$NON-NLS-1$
            type = IntrospectedTableMyBatis3DynamicSqlImpl.class.getName();
        }

        if (type.equals(IntrospectedTableMyBatis3Impl.class.getName())) {
            element.getElements().clear();
            StringBuilder sb = new StringBuilder();
            sb.append("select "); //$NON-NLS-1$

            if (stringHasValue(introspectedTable.getSelectByPrimaryKeyQueryId())) {
                sb.append('\'');
                sb.append(introspectedTable.getSelectByPrimaryKeyQueryId());
                sb.append("' as QUERYID,"); //$NON-NLS-1$
            }
            element.addElement(new TextElement(sb.toString()));
            element.addElement(getBaseColumnListElement(introspectedTable));
            if (introspectedTable.hasBLOBColumns()) {
                element.addElement(new TextElement(",")); //$NON-NLS-1$
                element.addElement(getBlobColumnListElement(introspectedTable));
            }

            sb.setLength(0);
            sb.append("from "); //$NON-NLS-1$
            sb.append(introspectedTable
                    .getAliasedFullyQualifiedTableNameAtRuntime());
            if (isSupportNolock)
                sb.append(" with (nolock) ");
            element.addElement(new TextElement(sb.toString()));

            boolean and = false;
            for (IntrospectedColumn introspectedColumn : introspectedTable
                    .getPrimaryKeyColumns()) {
                sb.setLength(0);
                if (and) {
                    sb.append("  and "); //$NON-NLS-1$
                } else {
                    sb.append("where "); //$NON-NLS-1$
                    and = true;
                }

                sb.append(MyBatis3FormattingUtilities
                        .getAliasedEscapedColumnName(introspectedColumn));
                sb.append(" = "); //$NON-NLS-1$
                sb.append(MyBatis3FormattingUtilities
                        .getParameterClause(introspectedColumn));
                element.addElement(new TextElement(sb.toString()));
            }
            return true;
        } else if (type.equals(IntrospectedTableMyBatis3SimpleImpl.class.getName())) {
            element.getElements().clear();
            StringBuilder sb = new StringBuilder();
            sb.append("select "); //$NON-NLS-1$

            if (stringHasValue(introspectedTable.getSelectByPrimaryKeyQueryId())) {
                sb.append('\'');
                sb.append(introspectedTable.getSelectByPrimaryKeyQueryId());
                sb.append("' as QUERYID,"); //$NON-NLS-1$
            }

            Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns()
                    .iterator();
            while (iter.hasNext()) {
                sb.append(MyBatis3FormattingUtilities.getSelectListPhrase(iter
                        .next()));

                if (iter.hasNext()) {
                    sb.append(", "); //$NON-NLS-1$
                }

                if (sb.length() > 80) {
                    element.addElement(new TextElement(sb.toString()));
                    sb.setLength(0);
                }
            }

            if (sb.length() > 0) {
                element.addElement(new TextElement(sb.toString()));
            }

            sb.setLength(0);
            sb.append("from "); //$NON-NLS-1$
            sb.append(introspectedTable
                    .getAliasedFullyQualifiedTableNameAtRuntime());
            if (isSupportNolock)
                sb.append(" with (nolock) ");
            element.addElement(new TextElement(sb.toString()));

            boolean and = false;
            for (IntrospectedColumn introspectedColumn : introspectedTable
                    .getPrimaryKeyColumns()) {
                sb.setLength(0);
                if (and) {
                    sb.append("  and "); //$NON-NLS-1$
                } else {
                    sb.append("where "); //$NON-NLS-1$
                    and = true;
                }

                sb.append(MyBatis3FormattingUtilities
                        .getAliasedEscapedColumnName(introspectedColumn));
                sb.append(" = "); //$NON-NLS-1$
                sb.append(MyBatis3FormattingUtilities
                        .getParameterClause(introspectedColumn));
                element.addElement(new TextElement(sb.toString()));
            }
            return true;
        } else {
            return super.sqlMapSelectByPrimaryKeyElementGenerated(element, introspectedTable);
        }
    }

    /**
     * 代碼參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.SimpleSelectAllElementGenerator
     *
     * @param element
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapSelectAllElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
        //return super.sqlMapSelectAllElementGenerated(element, introspectedTable);
        element.getElements().clear();
        StringBuilder sb = new StringBuilder();
        sb.append("select "); //$NON-NLS-1$
        Iterator<IntrospectedColumn> iter = introspectedTable.getAllColumns()
                .iterator();
        while (iter.hasNext()) {
            sb.append(MyBatis3FormattingUtilities.getSelectListPhrase(iter
                    .next()));

            if (iter.hasNext()) {
                sb.append(", "); //$NON-NLS-1$
            }

            if (sb.length() > 80) {
                element.addElement(new TextElement(sb.toString()));
                sb.setLength(0);
            }
        }

        if (sb.length() > 0) {
            element.addElement(new TextElement(sb.toString()));
        }

        sb.setLength(0);
        sb.append("from "); //$NON-NLS-1$
        sb.append(introspectedTable
                .getAliasedFullyQualifiedTableNameAtRuntime());
        if (isSupportNolock)
            sb.append(" with (nolock) ");
        element.addElement(new TextElement(sb.toString()));

        String orderByClause = introspectedTable.getTableConfigurationProperty(PropertyRegistry.TABLE_SELECT_ALL_ORDER_BY_CLAUSE);
        boolean hasOrderBy = StringUtility.stringHasValue(orderByClause);
        if (hasOrderBy) {
            sb.setLength(0);
            sb.append("order by "); //$NON-NLS-1$
            sb.append(orderByClause);
            element.addElement(new TextElement(sb.toString()));
        }
        return true;
    }

    /**
     * 該方法參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator
     * 新增IntrospectedTable類型參數(shù)
     *
     * @param introspectedTable
     * @return
     */
    protected XmlElement getBaseColumnListElement(IntrospectedTable introspectedTable) {
        XmlElement answer = new XmlElement("include"); //$NON-NLS-1$
        answer.addAttribute(new Attribute("refid", //$NON-NLS-1$
                introspectedTable.getBaseColumnListId()));
        return answer;
    }

    /**
     * 該方法參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator
     * 新增IntrospectedTable類型參數(shù)
     *
     * @param introspectedTable
     * @return
     */
    protected XmlElement getBlobColumnListElement(IntrospectedTable introspectedTable) {
        XmlElement answer = new XmlElement("include"); //$NON-NLS-1$
        answer.addAttribute(new Attribute("refid", //$NON-NLS-1$
                introspectedTable.getBlobColumnListId()));
        return answer;
    }

    /**
     * 該方法參考o(jì)rg.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator
     * 新增IntrospectedTable類型參數(shù)
     *
     * @param introspectedTable
     * @return
     */
    protected XmlElement getExampleIncludeElement(IntrospectedTable introspectedTable) {
        XmlElement ifElement = new XmlElement("if"); //$NON-NLS-1$
        ifElement.addAttribute(new Attribute("test", "_parameter != null")); //$NON-NLS-1$ //$NON-NLS-2$

        XmlElement includeElement = new XmlElement("include"); //$NON-NLS-1$
        includeElement.addAttribute(new Attribute("refid", //$NON-NLS-1$
                introspectedTable.getExampleWhereClauseId()));
        ifElement.addElement(includeElement);

        return ifElement;
    }
}

然后在generatorConfig.xml中新增配置即可

<plugin type="com.onlyas.app.utils.generator.plugin.SelectWithNolockPlugin" />

注意通過這種方式隶债,需要寫代碼來生成,不能使用一些IDEA等插件了饮潦。
接下來就說寫一個生成的main方法了燃异。
如下:

public class GeneratorStartUp {
    public static void main(String[] args) throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        InputStream resourceAsStream = GeneratorStartUp.class.getClassLoader().getResourceAsStream("generator/generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(resourceAsStream);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);

        for (String warning : warnings) {
            System.out.println(warning);
        }
    }

}

好了,這樣就實現(xiàn)了相關(guān)select的SQL語句后面自動加上了with nolock继蜡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末回俐,一起剝皮案震驚了整個濱河市逛腿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仅颇,老刑警劉巖单默,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異忘瓦,居然都是意外死亡搁廓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門耕皮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境蜕,“玉大人,你說我怎么就攤上這事凌停×荒辏” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵罚拟,是天一觀的道長台诗。 經(jīng)常有香客問我,道長赐俗,這世上最難降的妖魔是什么拉队? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阻逮,結(jié)果婚禮上粱快,老公的妹妹穿的比我還像新娘。我一直安慰自己叔扼,他們只是感情好皆尔,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著币励,像睡著了一般慷蠕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上食呻,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天流炕,我揣著相機與錄音,去河邊找鬼仅胞。 笑死每辟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的干旧。 我是一名探鬼主播渠欺,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼椎眯!你這毒婦竟也來了挠将?” 一聲冷哼從身側(cè)響起胳岂,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎舔稀,沒想到半個月后乳丰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡内贮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年产园,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夜郁。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡什燕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竞端,到底是詐尸還是另有隱情秋冰,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布婶熬,位于F島的核電站,受9級特大地震影響埃撵,放射性物質(zhì)發(fā)生泄漏赵颅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一暂刘、第九天 我趴在偏房一處隱蔽的房頂上張望饺谬。 院中可真熱鬧,春花似錦谣拣、人聲如沸募寨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拔鹰。三九已至,卻和暖如春贵涵,著一層夾襖步出監(jiān)牢的瞬間列肢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工宾茂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓷马,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓跨晴,卻偏偏與公主長得像欧聘,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子端盆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容