Java MyBatis(3)------详解自定义Generator Plugin

1、创建基类

在项目中,我们经常要把一些具有通用方法的实体类建立一个基类,提高代码复用程度。
假设每一个表中都有字段id和username,且每一个表都需要类似的CRUD方法(如根据主键查XX等)。

public class BaseModel implements Serializable {

    private String id;
    private String name;
    private Date createDate;
    private Date modifyDate;
    private String creator;
    private String modifier;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Date getModifyDate() {
        return modifyDate;
    }

    public void setModifyDate(Date modifyDate) {
        this.modifyDate = modifyDate;
    }

    public String getCreator() {
        return creator;
    }

    public void setCreator(String creator) {
        this.creator = creator;
    }

    public String getModifier() {
        return modifier;
    }

    public void setModifier(String modifier) {
        this.modifier = modifier;
    }
}


public interface BaseDao<T extends BaseModel> {
    List<T> selectAll();
    int deleteByPrimaryKey(String id);
    int insert(T entity);
    int update(T entity, String id);
    T selectByPrimaryKey(String id);
}

2、编写GeneratorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <context id="baseTables" targetRuntime="MyBatis3">
        <!-- 自动生成toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!-- 自动生成equals方法和hashcode方法 -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/>
        <!-- 自定义方法 -->
        <plugin type="com.charlin.erp.common.base.plugin.CustomerMapperPlugin">
            <property name="targetProject" value="../erp/src/main/java"/>
            <property name="targetPackage" value="com.charlin.erp.common.base.dao"/>
        </plugin>
        <!-- 自定义方法 -->
        <plugin type="com.charlin.erp.common.base.plugin.SerializablePlugin"/>
        <commentGenerator>
            <!-- 是否去除自动生成的注释 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc://mysql://localhost:3306/erp?chararterEncoding=utf8"
                        userId="root" password="sasa"></jdbcConnection>
        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="true"></property>
        </javaTypeResolver>
        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.charlin.erp.common.base.model" targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubpackages" value="true"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
            <!--横型-->
            <property name="rootClass" value="com.charlin.erp.common.base.model.BaseModel">
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.charlin.erp.common.dao" targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.charlin.erp.common.base.dao" targetProject=".\src">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="true"/>
            <property name="rootInterface" value="com.charlin.erp.common.base.dao.BaseDao"/>
        </javaClientGenerator>
        <!-- 指定数据库表 -->
        <table tableName="items"></table>
        <table tableName="orders"></table>
    </context>
</generatorConfiguration>

3、创建CustomerMapperPlugin

public class CustomerMapperPlugin extends PluginAdapter{
    private static final String DEFAULT_DAO_SUPER_CLASS = "com.charlin.erp.common.base.dao.BaseDao";
    private static final String DEFAULT_EXPAND_DAO_SUPER_CLASS = "com.charlin.erp.common.base.dao.BaseExpandDao";
    private String daoTargetDir;
    private String daoTargetPackage;
    private String daoSuperClass;
    //扩展
    private String expandDaoTargetPackage;
    private String expandDaoSuperClass;
    private ShellCallback shellCallback = null;

    public CustomerMapperPlugin(){
        this.shellCallback = new DefaultShellCallback(false);
    }

    @Override
    public boolean validate(List<String> warnings) {
        daoTargetDir = properties.getProperty("targetProject");
        boolean isDir = stringHasValue(daoTargetDir);

        daoTargetPackage = properties.getProperty("targetPackage");
        boolean isPackage = stringHasValue(daoTargetPackage);

        daoSuperClass = properties.getProperty("daoSuperClass");
        if (!stringHasValue(daoSuperClass)) daoSuperClass = DEFAULT_DAO_SUPER_CLASS;

        expandDaoTargetPackage  = properties.getProperty("expandDaoTargetPackage");
        expandDaoSuperClass = properties.getProperty("expandDaoSuperClass");
        if (!stringHasValue(expandDaoSuperClass)) expandDaoSuperClass = DEFAULT_EXPAND_DAO_SUPER_CLASS;

        return isDir && isPackage;
    }


    @Override
    public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
        XmlElement select = new XmlElement("select");
        select.addAttribute(new Attribute("id", "selectAll"));
        select.addAttribute(new Attribute("resultMap","baseResultMap"));
        select.addAttribute(new Attribute("parameterType",introspectedTable.getBaseRecordType()));
        select.addElement(new TextElement(" select * from " + introspectedTable.getFullyQualifiedTableNameAtRuntime()));

        XmlElement parentElement = document.getRootElement();
        parentElement.addElement(select);

        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }

    @Override
    public List<GeneratedJavaFile> contextGenerateAdditionalJavaFiles(IntrospectedTable introspectedTable) {
        JavaFormatter javaFormatter = context.getJavaFormatter();
        List<GeneratedJavaFile> mapperJavaFiles = new ArrayList<GeneratedJavaFile>();
        for (GeneratedJavaFile javaFile : introspectedTable.getGeneratedJavaFiles()){
            CompilationUnit unit = javaFile.getCompilationUnit();
            FullyQualifiedJavaType baseModelJavaType = unit.getType();

            String shortName = baseModelJavaType.getShortName();

            GeneratedJavaFile mapperJavafile  = null;

            if(shortName.endsWith("Mapper")){ // 扩展Mapper
                if (stringHasValue(expandDaoTargetPackage)){
                    Interface mapperInterface  = new Interface(expandDaoTargetPackage + "." + shortName.replace("Mapper", "ExpandMapper"));
                    mapperInterface.setVisibility(JavaVisibility.PUBLIC);
                    mapperInterface.addJavaDocLine("/**");
                    mapperInterface.addJavaDocLine(" * " + shortName + "扩展");
                    mapperInterface.addJavaDocLine(" */");

                    FullyQualifiedJavaType daoSuperType = new FullyQualifiedJavaType(expandDaoSuperClass);
                    mapperInterface.addImportedType(daoSuperType);
                    mapperInterface.addSuperInterface(daoSuperType);

                    mapperJavafile  = new GeneratedJavaFile(mapperInterface, daoTargetDir, javaFormatter);
                    try {
                        File mapperDir = shellCallback.getDirectory(daoTargetDir, daoTargetPackage);
                        File mapperFile = new File(mapperDir, mapperJavafile .getFileName());
                        if (!mapperFile.exists()){
                            //mapperFile.mkdirs();
                            mapperJavaFiles.add(mapperJavafile );
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                }
            }else if(!shortName.endsWith("Example")){
                Interface mapperInterface = new Interface(daoTargetPackage + "." + shortName + "Mapper");
                mapperInterface.setVisibility(JavaVisibility.PUBLIC);
                mapperInterface.addJavaDocLine("/**");
                mapperInterface.addJavaDocLine(" * 由MyBatis Generator工具自动生成,请不要手动修改");
                mapperInterface.addJavaDocLine(" */");

                FullyQualifiedJavaType daoSuperType = new FullyQualifiedJavaType(daoSuperClass);
                // 添加泛型支持
                daoSuperType.addTypeArgument(baseModelJavaType);
                mapperInterface.addImportedType(baseModelJavaType);
                mapperInterface.addImportedType(daoSuperType);
                mapperInterface.addSuperInterface(daoSuperType);

                mapperJavafile = new GeneratedJavaFile(mapperInterface, daoTargetDir, javaFormatter);
                mapperJavaFiles.add(mapperJavafile);
            }
        }
        return mapperJavaFiles;
    }
}

4、运行

public class TestGeneratorRun {

    @Test
    public void test() throws Exception{

    }

    public static void main(String[] args) throws Exception {
        File configFile  = new File("E:\\git\\erp\\common\\src\\main\\java\\com\\charlin\\erp\\common\\base\\generator\\generatorConfig.xml");
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        ConfigurationParser cp = new ConfigurationParser(warnings);
        //String filePath = MyBatisGeneratorRun.class.getClassLoader().getResource("").getPath() + "generatorConfig.xml";
        InputStream inputStream = new FileInputStream(configFile);
        Configuration config = cp.parseConfiguration(inputStream);
        DefaultShellCallback dsc = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, dsc, warnings);
        myBatisGenerator.generate(null);
    }

}

—————————————————————————————————————————————————–

java架构师项目实战,高并发集群分布式,大数据高可用视频教程,共760G

下载地址:

https://item.taobao.com/item.htm?id=555888526201

01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
+
hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门

—————————————————————————————————————————————————–

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lovoo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值