mybatis-generator结合freemarker生成简单的service

本文介绍了如何结合mybatis-generator和freemarker模板来自动生成Service类。首先在generatorConfig.xml中添加javaServiceGenerator元素,接着创建对应的Configuration类,并在MyBatisGeneratorConfigurationParser中进行相应修改。然后编写freemarker模板,解析模板并生成Service代码。通过创建一个ServiceTemplateEntity参数实体类,将配置信息传递给模板生成方法,最终在MyBatisGenerator的执行流程中调用这个方法完成Service类的生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先附上项目的github地址:点击打开链接
第一步:在generatorConfig.xml里添加标签,点击进入xml文件对应的dtd文件,在contex那添加需要的标签
<!ELEMENT context (property*, plugin*, commentGenerator?, (connectionFactory | jdbcConnection), javaTypeResolver?,
        javaBoGenerator?,javaModelGenerator, sqlMapGenerator?, javaClientGenerator?,javaServiceGenerator?,javaDomainGenerator?, table+)>
<!ATTLIST context id ID #REQUIRED
  defaultModelType CDATA #IMPLIED
  targetRuntime CDATA #IMPLIED
  introspectedColumnImpl CDATA #IMPLIED>

加上service 的element
<!ELEMENT javaServiceGenerator (property*)>
<!ATTLIST javaServiceGenerator
        targetPackage CDATA #REQUIRED
        targetProject CDATA #REQUIRED>

第二步:添加对应的Configuration类,修改和添加MyBatisGeneratorConfigurationParser类里面的相关方法
public class JavaServiceGeneratorConfiguration  extends PropertyHolder{
    private String targetPackage;

    private String targetProject;

    /**
     *
     */
    public JavaServiceGeneratorConfiguration() {
        super();
    }

    public String getTargetProject() {
        return targetProject;
    }

    public void setTargetProject(String targetProject) {
        this.targetProject = targetProject;
    }

    public String getTargetPackage() {
        return targetPackage;
    }

    public void setTargetPackage(String targetPackage) {
        this.targetPackage = targetPackage;
    }

    public XmlElement toXmlElement() {
        XmlElement answer = new XmlElement("javaServiceGenerator"); //$NON-NLS-1$

        if (targetPackage != null) {
            answer.addAttribute(new Attribute("targetPackage", targetPackage)); //$NON-NLS-1$
        }

        if (targetProject != null) {
            answer.addAttribute(new Attribute("targetProject", targetProject)); //$NON-NLS-1$
        }

        addPropertyXmlElements(answer);

        return answer;
    }


}
第三步写service的freemarker模板,并对模板进行解析:
package ${templatePackage};

import java.util.List;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import ${boPackage};
import ${mapperPackage};

/**
*
* Created by CodeGenerator
*/

@Service
public class ${className} {
    @Resource
    private ${mapperType} ${mapperName};

    public void save(${boClazz} boName){
        this.${mapperName}.insertSelective(boName);
    }

    public void deleteByPrimaryKey(Integer primaryKey){
        this.${mapperName}.deleteByPrimaryKey(primaryKey);
    }

    public ${boClazz} getByPrimaryKey(Integer primaryKey){
        return this.${mapperName}.selectByPrimaryKey(primaryKey);
    }

    public ${boClazz} getNotDeleteByPrimaryKey(Integer primaryKey){
        return this.${mapperName}.selectNotDeleteByPrimaryKey(primaryKey);
    }

    public List<${boClazz}> findAll(){
        return this.${mapperName}.selectAll();
    }

    public List<${boClazz}> findNotDeleteAll(){
        return this.${mapperName}.selectNotDeleteAll();
    }
}

我创建了一个对应的参数实体类:
public class ServiceTemplateEntity {
    private String templatePackage;//包名
    private String boPackage;//所需要导入的model包
    private String mapperPackage;//所需要导入的mapper包
    private String className;//生成的Service类名
    private String mapperType;//对应的Mapper类
    private String mapperName;//Mapper类的实例对象名
    private String boClazz;//对应的model类
    private String projectTargetPackage;//Service生成的目标工程包

    public String getTemplatePackage() {
        return templatePackage;
    }

    public void setTemplatePackage(String templatePackage) {
        this.templatePackage = templatePackage;
    }

    public String getBoPackage() {
        return boPackage;
    }

    public void setBoPackage(String boPackage) {
        this.boPackage = boPackage;
    }

    public String getMapperPackage() {
        return mapperPackage;
    }

    public void setMapperPackage(String mapperPackage) {
        this.mapperPackage = mapperPackage;
    }

    public String getClassName() {
        return className;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public String getMapperType() {
        return mapperType;
    }

    public void setMapperType(String mapperType) {
        this.mapperType = mapperType;
    }

    public String getMapperName() {
        return mapperName;
    }

    public void setMapperName(String mapperName) {
        this.mapperName = mapperName;
    }

    public String getBoClazz() {
        return boClazz;
    }

    public void setBoClazz(String boClazz) {
        this.boClazz = boClazz;
    }

    public String getProjectTargetPackage() {
        return projectTargetPackage;
    }

    public void setProjectTargetPackage(String projectTargetPackage) {
        this.projectTargetPackage = projectTargetPackage;
    }
}

然后在MyBatisGenerator类里添加对模板实体类的赋值
 public List<ServiceTemplateEntity> assignmentServiceTemplateEntity(){
        List<Context> contexts = configuration.getContexts();
        List<ServiceTemplateEntity> serviceTemplateEntities = new ArrayList<>();
        for (Context c:contexts){
            JavaServiceGeneratorConfiguration jgc = c.getJavaServiceGeneratorConfiguration();

            List<TableConfiguration> tableConfigurations = c.getTableConfigurations();
            for (TableConfiguration t:tableConfigurations){
                ServiceTemplateEntity serviceTemplateEntity = new ServiceTemplateEntity();
                serviceTemplateEntity.setClassName(t.getDomainObjectName()+"Service");
                String projectTargetPackage = jgc.getTargetProject()+"/"+jgc.getTargetPackage().replaceAll("\\.","/")+"/";
                serviceTemplateEntity.setProjectTargetPackage(projectTargetPackage);
                serviceTemplateEntity.setTemplatePackage(jgc.getTargetPackage());
                serviceTemplateEntity.setMapperType(t.getDomainObjectName()+"Mapper");
                serviceTemplateEntity.setMapperName(t.getDomainObjectName().toLowerCase()+"Mapper");
                serviceTemplateEntity.setBoClazz(t.getBoObjectName());
                serviceTemplateEntity.setMapperPackage(c.getJavaClientGeneratorConfiguration().getTargetPackage()+"."+t.getDomainObjectName()+"Mapper");
                serviceTemplateEntity.setBoPackage(c.getJavaBoGeneratorConfiguration().getTargetPackage()+"."+t.getBoObjectName());
                serviceTemplateEntities.add(serviceTemplateEntity);
            }
        }
        return serviceTemplateEntities;
    }
添加模板的生成方法
public static void addJavaServiceGenerator(List<ServiceTemplateEntity> serviceTemplateEntitylist) {
        Configuration cfg = new  Configuration();
        try  {
            for (ServiceTemplateEntity s:serviceTemplateEntitylist) {
                cfg.setClassForTemplateLoading(JavaServiceGenerator.class, "/template"); //指定模板所在的classpath目录
                Template t = cfg.getTemplate("ServiceTemplate"); //指定模板
                File f = new File(System.getProperty("user.dir") +"/"+ s.getProjectTargetPackage());
                f.mkdirs();
                FileOutputStream fos = new FileOutputStream(new File(System.getProperty("user.dir") +"/"+ s.getProjectTargetPackage() + s.getClassName()+".java")); //java文件的生成目录
                t.process(s, new OutputStreamWriter(fos, "utf-8")); //
                fos.flush();
                fos.close();
            }
        } catch  (IOException e) {
            e.printStackTrace();
        } catch  (TemplateException e) {
            e.printStackTrace();
        }

    }
最后在MyBatisGenerator的generator的方法里调用上面方法
JavaServiceGenerator.addJavaServiceGenerator(assignmentServiceTemplateEntity());

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值