首先附上项目的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());