首页>代码>maven整合mybatis+generator生成java自定义model实体类,dao接口和mapper映射文件>/demo-generator-mybatis/src/main/java/com/xe/demo/common/generator/GenPlugin.java
package com.xe.demo.common.generator;

import java.text.MessageFormat;
import java.util.HashSet;
import java.util.List;
import java.util.Properties;
import java.util.Set;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.config.CommentGeneratorConfiguration;
import org.mybatis.generator.config.Context;

/**
 * 自定义插件
 * @author CZH
 */
public class GenPlugin extends PluginAdapter {
	private Set<String> mappers = new HashSet<String>();
	// 注释生成器
	private CommentGeneratorConfiguration commentCfg;

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

	@Override
	public void setContext(Context context) {
		super.setContext(context);
		// 设置默认的注释生成器
		commentCfg = new CommentGeneratorConfiguration();
		commentCfg.setConfigurationType(GenCommentGenerator.class.getCanonicalName());
		context.setCommentGeneratorConfiguration(commentCfg);
		// 支持oracle获取注释#114
		context.getJdbcConnectionConfiguration().addProperty("remarksReporting", "true");
	}

	@Override
	public void setProperties(Properties properties) {
		super.setProperties(properties);
		String mappers = this.properties.getProperty("mappers");
		for (String mapper : mappers.split(",")) {
			this.mappers.add(mapper);
		}
	}

	/**
	 * 生成的Mapper接口
	 * @param interfaze
	 * @param topLevelClass
	 * @param introspectedTable
	 * @return
	 */
	@Override
	public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
		// 获取实体类
		FullyQualifiedJavaType entityType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
		// import接口
		for (String mapper : mappers) {
			interfaze.addImportedType(new FullyQualifiedJavaType(mapper));
			interfaze.addSuperInterface(new FullyQualifiedJavaType(mapper + "<" + entityType.getShortName() + ">"));
		}
		// import实体类
		interfaze.addImportedType(entityType);
		return true;
	}

	/**
	 * 拼装SQL语句生成Mapper接口映射文件
	 */
	@Override
	public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
		XmlElement rootElement = document.getRootElement();
		// 数据库表名
		String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();
		// 主键
		IntrospectedColumn pkColumn = introspectedTable.getPrimaryKeyColumns().get(0);

		// 公共字段
		StringBuilder columnSQL = new StringBuilder();
		// IF判断语句
		StringBuilder ifSQL = new StringBuilder();
		// 要插入的字段(排除自增主键)
		StringBuilder saveColumn = new StringBuilder("insert into ").append(tableName).append("(\n");
		// 要保存的值
		StringBuilder saveValue = new StringBuilder("(\n");
		// 拼装更新字段
		StringBuilder updateSQL = new StringBuilder("update ").append(tableName).append(" set ").append(pkColumn.getActualColumnName())
				.append(" = #{item.").append(pkColumn.getJavaProperty()).append("}\n");

		// 数据库字段名
		String columnName = null;
		// java字段名
		String javaProperty = null;
		for (IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
			columnName = MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn);
			javaProperty = introspectedColumn.getJavaProperty();
			// 拼接字段
			columnSQL.append(columnName).append(",");
			// 拼接IF语句
			ifSQL.append("      <if test=\"null != item.").append(javaProperty).append(" and '' != item.").append(javaProperty).append("\">");
			ifSQL.append("and ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");

			// 拼接SQL
			if (!introspectedColumn.isAutoIncrement()) {
				saveColumn.append("\t  <if test=\"null != item.").append(javaProperty).append("\">, ").append(columnName).append("</if>\n");

				saveValue.append("\t  <if test=\"null != item.").append(javaProperty).append("\">, ").append("#{item.").append(javaProperty)
						.append("}</if>\n");

				// 时间格式用now()作为值
				/*
				 * if(Types.TIMESTAMP == introspectedColumn.getJdbcType()){
				 * saveValue.append(", now()"); }else{ saveValue.append(
				 * ", #{item.").append(javaProperty).append("}"); }
				 */

				updateSQL.append("      <if test=\"null != item.").append(javaProperty).append("\">");
				updateSQL.append(", ").append(columnName).append(" = #{item.").append(javaProperty).append("}</if>\n");
			}
		}
		String columns = columnSQL.substring(0, columnSQL.length() - 1);
		rootElement.addElement(createSql("sql_columns", columns));

		String whereSQL = MessageFormat.format("<where>\n{0}\t</where>", ifSQL.toString());
		rootElement.addElement(createSql("sql_where", whereSQL));

		rootElement.addElement(createSelect("selectById", tableName, pkColumn));
		rootElement.addElement(createSelect("selectOne", tableName, null));
		rootElement.addElement(createSelect("selectList", tableName, null));
		rootElement.addElement(createSelect("selectPage", tableName, null));

		rootElement.addElement(createSql("sql_save_columns", saveColumn.append("\t) values").toString().replaceFirst(",", "")));
		rootElement.addElement(createSql("sql_save_values", saveValue.append("\t)").toString().replaceFirst(",", "")));
		rootElement.addElement(createSave("save", pkColumn));
		rootElement.addElement(createSave("batchSave", null));

		updateSQL.append("\twhere ").append(pkColumn.getActualColumnName()).append(" = #{item.").append(pkColumn.getJavaProperty()).append("}");
		rootElement.addElement(createSql("sql_update", updateSQL.toString()));

		rootElement.addElement(createUpdate("update"));
		rootElement.addElement(createUpdate("batchUpdate"));

		rootElement.addElement(createDels(tableName, pkColumn, "delArray", "array"));
		rootElement.addElement(createDels(tableName, pkColumn, "delList", "list"));
		return super.sqlMapDocumentGenerated(document, introspectedTable);
	}

	/**
	 * 公共SQL
	 * @param id
	 * @param sqlStr
	 * @return
	 */
	private XmlElement createSql(String id, String sqlStr) {
		XmlElement sql = new XmlElement("sql");
		sql.addAttribute(new Attribute("id", id));
		sql.addElement(new TextElement(sqlStr));
		return sql;
	}

	/**
	 * 查询
	 * @param id
	 * @param tableName
	 * @param pkColumn
	 * @return
	 */
	private XmlElement createSelect(String id, String tableName, IntrospectedColumn pkColumn) {
		XmlElement select = new XmlElement("select");
		select.addAttribute(new Attribute("id", id));
		select.addAttribute(new Attribute("resultMap", "BaseResultMap"));

		StringBuilder selectStr = new StringBuilder("select <include refid=\"sql_columns\" /> from ").append(tableName);
		if (null != pkColumn) {
			selectStr.append(" where ").append(pkColumn.getActualColumnName()).append(" = #{").append(pkColumn.getJavaProperty()).append("}");
		} else {
			selectStr.append(" <include refid=\"sql_where\" />");
		}
		if ("selectPage".equals(id)) {
			selectStr.append(" limit #{page.startRow}, #{page.pageSize}");
		}
		select.addElement(new TextElement(selectStr.toString()));
		return select;
	}

	/**
	 * 保存
	 * @param id
	 * @param pkColumn
	 * @return
	 */
	private XmlElement createSave(String id, IntrospectedColumn pkColumn) {
		XmlElement save = new XmlElement("insert");
		save.addAttribute(new Attribute("id", id));
		if (null != pkColumn) {
			save.addAttribute(new Attribute("keyProperty", "item." + pkColumn.getJavaProperty()));
			save.addAttribute(new Attribute("useGeneratedKeys", "true"));
			save.addElement(new TextElement("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />"));
		} else {
			StringBuilder saveStr = new StringBuilder(
					"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t  ")
							.append("<include refid=\"sql_save_columns\" /><include refid=\"sql_save_values\" />\n\t</foreach>");
			save.addElement(new TextElement(saveStr.toString()));
		}
		return save;
	}

	/**
	 * 更新
	 * @param id
	 * @return
	 */
	private XmlElement createUpdate(String id) {
		XmlElement update = new XmlElement("update");
		update.addAttribute(new Attribute("id", id));
		if ("update".equals(id)) {
			update.addElement(new TextElement("<include refid=\"sql_update\" />"));
		} else {
			update.addElement(new TextElement(
					"<foreach collection=\"list\" index=\"index\" item=\"item\" open=\"\" separator=\";\" close=\"\">\n\t  <include refid=\"sql_update\" />\n\t</foreach>"));
		}
		return update;
	}

	/**
	 * 删除
	 * @param tableName
	 * @param pkColumn
	 * @param method
	 * @param type
	 * @return
	 */
	private XmlElement createDels(String tableName, IntrospectedColumn pkColumn, String method, String type) {
		XmlElement delete = new XmlElement("delete");
		delete.addAttribute(new Attribute("id", method));
		StringBuilder deleteStr = new StringBuilder("delete from ").append(tableName).append(" where ").append(pkColumn.getActualColumnName())
				.append(" in\n\t")
				.append("<foreach collection=\"").append(type)
				.append("\" index=\"index\" item=\"item\" open=\"(\" separator=\",\" close=\")\">#{item}</foreach>");
		delete.addElement(new TextElement(deleteStr.toString()));
		return delete;
	}

	// 以下设置为false,取消生成默认增删查改xml
	@Override
	public boolean clientDeleteByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean clientInsertMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean clientSelectAllMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean clientSelectByPrimaryKeyMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean clientUpdateByPrimaryKeyWithoutBLOBsMethodGenerated(Method method, Interface interfaze, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean sqlMapDeleteByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean sqlMapInsertElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean sqlMapSelectAllElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean sqlMapSelectByPrimaryKeyElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
		return false;
	}

	@Override
	public boolean sqlMapUpdateByPrimaryKeyWithoutBLOBsElementGenerated(XmlElement element, IntrospectedTable introspectedTable) {
		return false;
	}

}
最近下载更多
212600  LV7 2022年3月7日
blackcat123  LV7 2020年12月8日
hjc810794  LV8 2020年4月25日
jj1201  LV1 2020年3月31日
0312wangchen  LV26 2019年9月20日
xiegeping  LV24 2019年9月19日
xp95323  LV14 2019年8月21日
Swordmeng888  LV5 2019年7月2日
wumeicun  LV1 2019年7月1日
随便1212  LV1 2019年6月26日
最近浏览更多
youwuzuichen  LV10 2023年6月26日
yeali178  LV1 2023年6月10日
张真狗  LV9 2023年5月22日
李亮  LV19 2023年3月6日
dengjunjun  LV15 2023年1月5日
谢谢谢谢谢谢你  LV6 2022年7月19日
aqin_qin  LV1 2022年5月29日
wubinbin  LV11 2022年4月12日
212600  LV7 2022年3月7日
felixsxf  LV5 2022年1月11日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友