一直苦於團隊的成員不按既定的規範來編寫代碼以及使用JPA建立完實體後,還得建立對應的dao,service,controller、DTO,VO等等,因此就開發出了這款根據entity來自動生成這些既定的類以及對應的CRUD方法。好了,很少說了,直接進入主題吧!java
至於idea什麼建立MOJO項目,相信你們並不陌生,我這裏就不一一說明了。若是不會的朋友能夠參考這篇文章。spring
首先來看一下項目的結構apache
其中:Mojo是插件運行時的入口,Generator是用來生成對應的類,resources目錄存放對應的類模板。 好了,接下來將給你們一一說明實現的具體細節。bash
package com.luwei.maven.jpa;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.project.MavenProject;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @Description jpa插件-生成dao
* @Author LW-mochengdong
* @Date 2019/2/19 15:43
*/
@Mojo(name = "gen-dao")
public class GenerateDaoMojo extends AbstractMojo {
@Component
private MavenProject mavenProject;
@Override
public void execute() {
getLog().info("-----------------------start create dao---------------------------------");
final String packagePath = "/src/main/java/com/luwei/models/".replace('/', File.separatorChar);
String daoDir = mavenProject.getBasedir().getPath() + packagePath;
new DaoGenerator(daoDir);
}
}
複製代碼
說明app
MavenProject是引入插件的項目自己,好比若是項目 project 映入了 該插件,那麼mavenProject對象就是project,經過mavenProjec咱們能夠獲得項目的全部資源。maven
daoDir就是項目的entity所在的路徑ide
DaoGenerator.java測試
package com.luwei.maven.jpa;
import org.stringtemplate.v4.ST;
import java.io.File;
import java.io.FileWriter;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* @Description
* @Author LW-mochengdong
* @Date 2019/2/19 17:27
*/
class DaoGenerator {
DaoGenerator(String daoDir) {
createDao(daoDir);
}
/**
* @Description 根據entity所在的路徑,遞歸生成對應的DAO
* @param filepath entity所在的路徑
* @Return void
* @Author LW-mochengdong
* @Date 2019/3/7 20:17
*/
private void createDao(String filepath) {
File file = new File(filepath);
if (file.exists()) {
List<File> listFiles = Arrays.asList(Objects.requireNonNull(file.listFiles()));
if (0 != listFiles.size()) {
for (File f : listFiles) {//注意這裏不要用這種listFiles.forEach(file -> {});方式代替,不然會出現異常,具體緣由如今未清楚
String absolutePath = f.getAbsolutePath();
if (f.isDirectory()) {//若是是路徑就遞歸調用,直到是文件
createDao(absolutePath);
} else {
String entityName = f.getName();
if (!entityName.contains("Dao")) {//避免生成的DAO也會生DAO,這裏咱們只需對entity生成對應的DAO便可
System.out.println(absolutePath + "=====" + entityName);
try {
String entity = entityName.substring(0, entityName.indexOf("."));//獲取entity名稱
String table = Utils.buildTable(entity);//獲取entity對應的表名稱
//獲取entity對應的DAO
File file1 = new File(absolutePath.substring(0,
absolutePath.lastIndexOf(File.separatorChar)) + File.separatorChar + entity + "Dao.java");
if (!file1.exists()) {//若是DAO不存在則建立,避免覆蓋
//讀取DAO模板
ST st = new ST(Utils.getTemplate("/Dao.java"), '$', '$');
//獲取entity所在的子路徑(包名的一部分)
String childPackage = absolutePath.substring(absolutePath.indexOf("models"),
absolutePath.lastIndexOf(File.separatorChar)).replace(String.valueOf(File.separatorChar), ".");
//替換DAO模板中的佔位符
st.add("childPackage", childPackage);
st.add("entity", entity);
st.add("table", table);
String content = st.render();
//建立文件
file1.createNewFile();
//將文件寫指定位置
FileWriter writer = new FileWriter(file1);
writer.write(content);
writer.flush();
writer.close();
System.out.println(file1.getPath());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
}
複製代碼
說明ui
Utils.javaidea
package com.luwei.maven.jpa;
import org.codehaus.plexus.util.IOUtil;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
/**
* @Description
* @Return
* @Author LW-mochengdong
* @Date 2019/2/19 17:02
*/
class Utils {
static String getTemplate(String templateName) {
InputStream templateInputStream = Utils.class.getResourceAsStream(templateName);
StringWriter stringWriter = new StringWriter();
try {
IOUtil.copy(templateInputStream, stringWriter, "utf-8");
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
return stringWriter.toString();
}
static String buildTable(String entity) {
char[] chars = entity.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (char c : chars) {
if (Character.isUpperCase(c)) {
stringBuilder.append("_").append(Character.toLowerCase(c));
} else {
stringBuilder.append(c);
}
}
return stringBuilder.toString().substring(1);
}
}
複製代碼
package com.luwei.services.$childPackage$;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.Set;
public interface $entity$Dao extends JpaRepository<$entity$, Integer>, JpaSpecificationExecutor<$entity$> {
@Modifying
@Query(value = "UPDATE tb_$table$ set deleted = true where deleted <> true AND $table$_id IN ?1", nativeQuery = true)
int bathDeleted(@Param("ids") Set<Integer> ids);
}
複製代碼
以上,entity的Dao生成已經完成,接下來咱們只須要發佈到咱們的私服便可。
測試
項目中引入插件
<plugin>
<groupId>com.luwei</groupId>
<artifactId>jpa-maven-plugin</artifactId>
<version>1.0</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>gen-service</goal>
</goals>
</execution>
</executions>
</plugin>
複製代碼
運行插件,點擊jpa:gen-dao後生成的效果以下
至此,根據entity生成對應Dao插件已經開發完成,至於service、controller、DTO、VO的生成也是同樣的道理。若是有問題或疑問,歡迎你們在下方評論點贊,感謝您的支持!
成東
廣州蘆葦科技Java開發團隊
蘆葦科技-廣州專業互聯網軟件服務公司
抓住每一處細節 ,創造每個美好
關注咱們的公衆號,瞭解更多
想和咱們一塊兒奮鬥嗎?lagou搜索「 蘆葦科技 」或者投放簡歷到 server@talkmoney.cn 加入咱們吧
關注咱們,你的評論和點贊對咱們最大的支持