關(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继蜡。