mybatis plus代碼生成工具的實(shí)現(xiàn)代碼
前言:
原本想使用AutoGenerator 是 MyBatis-Plus 的官方代碼生成器 ,嘗試了一下,竟然報(bào)錯(cuò),原因可能是MyBatis-Plus和mybatis-plus-generator 的版本不一致,因?yàn)槲矣玫腗yBatis-Plus 的版本是3.42 ,但是mybatis-plus-generator的3.4.2不知道怎么了,下載不下來,只能下載3.4.1,發(fā)現(xiàn)運(yùn)行起來老是報(bào)錯(cuò),還有一堆配置說明要看,于是自己手寫生成代碼的工具類,覺得更簡(jiǎn)單些。分享給大家,請(qǐng)多多指教。
pom文件引入java-mysql 驅(qū)動(dòng)依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
單類代碼實(shí)現(xiàn),復(fù)制粘貼到編輯器里,主方法運(yùn)行即可。
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* mybatis plus通用生成工具
* 可生成業(yè)務(wù)接口、mapper接口、實(shí)體類
*
* @author tarzan Liu
* @date 2021/4/10 19:44
*/
public class MyBatisPlusTools {
private static final String driver = "com.mysql.cj.jdbc.Driver";//驅(qū)動(dòng)
private static final String user = "root"; //數(shù)據(jù)庫(kù)賬號(hào)
private static final String pwd = "123456"; //數(shù)據(jù)庫(kù)密碼
private static final String url = "jdbc:mysql://127.0.0.1:3306/ofcms" + "?user=" + user + "&password=" + pwd+"&useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"; //鏈接參數(shù)
private static String tableName = "of_cms_ad"; // 數(shù)據(jù)庫(kù)表名
private static String aliasName = "cms_ad"; // 數(shù)據(jù)庫(kù)別名,可以與數(shù)據(jù)庫(kù)表名相同
private static final String packagePath = "com/tarzan/cms"; //mapper.xml命名空間路徑
private static final String packageName = "com.tarzan.cms"; //mapper.xml命名空間路徑
private static final String author = "tarzan"; // 作者
private static final String rootPathName = "src/main/java/"; // 默認(rèn)生成主文件夾路徑
private static Connection getConnection = null;
static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 鏈接數(shù)據(jù)庫(kù)
*/
private static Connection getConnections() {
try {
Class.forName(driver);
getConnection = DriverManager.getConnection(url);
} catch (Exception e) {
e.printStackTrace();
}
return getConnection;
}
/**
* 格式化默認(rèn)值
*/
private static String defaultValue(String value) {
if (StringUtils.isNotBlank(value)) {
return ";默認(rèn)值:" + value;
}
{
return "";
}
}
private static String getAliasName(String tableName,String prefix){
return tableName.substring(prefix.length());
}
/**
* 格式化數(shù)據(jù)類型
* 返回的是基本類型的包裝類
* 如果使用基本數(shù)據(jù)類型long
*/
private static String formatType(String typeValue) {
if ("bit".equalsIgnoreCase(typeValue)) {
return "Boolean";
}
else if (
typeValue.equalsIgnoreCase("int") || typeValue.equalsIgnoreCase("int unsigned")
|| typeValue.equalsIgnoreCase("tinyint") || typeValue.equalsIgnoreCase("tinyint unsigned")
|| typeValue.equalsIgnoreCase("smallint") || typeValue.equalsIgnoreCase("smallint unsigned")
|| typeValue.equalsIgnoreCase("mediumint") || typeValue.equalsIgnoreCase("mediumint unsigned")
) {
return "Integer";
} else if (typeValue.equalsIgnoreCase("bigint") || typeValue.equalsIgnoreCase("bigint unsigned")) {
return "Long";
} else if (typeValue.equalsIgnoreCase("float") || typeValue.equalsIgnoreCase("float unsigned")) {
return "Float";
} else if (typeValue.equalsIgnoreCase("decimal") || typeValue.equalsIgnoreCase("decimal unsigned") || typeValue.equalsIgnoreCase("numeric") || typeValue.equalsIgnoreCase("numeric unsigned")
|| typeValue.equalsIgnoreCase("real") || typeValue.equalsIgnoreCase("real unsigned") || typeValue.equalsIgnoreCase("money") || typeValue.equalsIgnoreCase("money unsigned")
|| typeValue.equalsIgnoreCase("smallmoney") || typeValue.equalsIgnoreCase("smallmoney unsigned")) {
return "Double";
} else if (typeValue.equalsIgnoreCase("varchar") || typeValue.equalsIgnoreCase("char")
|| typeValue.equalsIgnoreCase("nvarchar") || typeValue.equalsIgnoreCase("nchar")
|| typeValue.equalsIgnoreCase("text")) {
return "String";
} else if (typeValue.equalsIgnoreCase("datetime")) {
return "Date";
} else if (typeValue.equalsIgnoreCase("image")) {
return "Blod";
} else {
return "Long";
}
}
/**
* 駝峰轉(zhuǎn)換
*/
private static String columnToProperty(String column) {
StringBuilder result = new StringBuilder();
// 快速檢查
if (column == null || column.isEmpty()) {
// 沒必要轉(zhuǎn)換
return "";}
else column =column.toLowerCase();
if (!column.contains("_")) {
// 不含下劃線,僅將首字母小寫
return column.substring(0, 1).toLowerCase() + column.substring(1);
} else {
// 用下劃線將原始字符串分割
String[] columns = column.split("_");
for (String columnSplit : columns) {
// 跳過原始字符串中開頭、結(jié)尾的下?lián)Q線或雙重下劃線
if (columnSplit.isEmpty()) {
continue;
}
// 處理真正的駝峰片段
if (result.length() == 0) {
// 第一個(gè)駝峰片段,全部字母都小寫
result.append(columnSplit.toLowerCase());
} else {
// 其他的駝峰片段,首字母大寫
result.append(columnSplit.substring(0, 1).toUpperCase()).append(columnSplit.substring(1).toLowerCase());
}
}
return result.toString();
}
}
/**
* 實(shí)體名稱轉(zhuǎn)換
*/
private static String formatBeanName(String column) {
StringBuilder result = new StringBuilder();
// 快速檢查
if (column == null || column.isEmpty()) {
// 沒必要轉(zhuǎn)換
return "";
} else if (!column.contains("_")) {
// 不含下劃線,僅將首字母大寫
return column.substring(0, 1).toUpperCase() + column.substring(1);
} else {
// 用下劃線將原始字符串分割
String[] columns = column.split("_");
for (String columnSplit : columns) {
// 跳過原始字符串中開頭、結(jié)尾的下?lián)Q線或雙重下劃線
if (columnSplit.isEmpty()) {
continue;
}
// 處理真正的駝峰片段
result.append(columnSplit.substring(0, 1).toUpperCase()).append(columnSplit.substring(1).toLowerCase());
}
return result.toString();
}
}
/**
* 實(shí)體類字段
*/
private static void getBean(String tableName,String aliasName) {
getConnection = getConnections();
StringBuilder sb = new StringBuilder();
try {
DatabaseMetaData dbmd = getConnection.getMetaData();
ResultSet rs = dbmd.getColumns(null, "%", tableName, "%");
String beanName = formatBeanName(aliasName);
sb.append("package "+packageName+".entity;\n\n");
sb.append("import com.baomidou.mybatisplus.annotation.TableName;\n");
sb.append("import lombok.Data;\n");
int length=sb.length();
boolean dateFlag=false;
sb.append( " /**\n" +
" * @author " + author + "\n" +
" * @date "+ format.format(new Date())+"\n" +
" */\n" +
"@Data\n" +
"@TableName(\""+tableName+"\")\n" +
"public class "+beanName+"Entity {\n");
while (rs.next()) {
if(formatType(rs.getString("TYPE_NAME")).equals("Date")){
dateFlag=true;
}
sb.append("\t//").append(rs.getString("REMARKS")).append(defaultValue(rs.getString("COLUMN_DEF"))).append("\n");
sb.append("\tprivate ").append(formatType(rs.getString("TYPE_NAME"))).append(" ").append(columnToProperty(rs.getString("COLUMN_NAME"))).append(";\n");
}
sb.append("} ");
if(dateFlag){
sb.insert(length, "import java.util.Date;\n");
}
} catch (Exception e) {
e.printStackTrace();
}
write(sb.toString(),"Entity.java","entity");
System.err.println("\n類型:JAVA數(shù)據(jù)層實(shí)體類(bean.java)" + "\n狀態(tài):成功" + "\n時(shí)間:" + format.format(new Date()) + "\n");
}
/**
* 生成DAO層接口
*/
private static void getMapper(String tableName,String aliasName) {
StringBuilder sb = new StringBuilder();
try {
String beanName = formatBeanName(aliasName);
sb.append("package "+packageName+".mapper;\n\n");
sb.append("import com.baomidou.mybatisplus.core.mapper.BaseMapper;\n");
sb.append("import "+packageName+".entity."+beanName+"Entity;\n");
sb.append( "/**\n" +
" * @author " + author + "\n" +
" * @date "+ format.format(new Date())+"\n" +
" */\n" +
"public interface "+beanName+"Mapper extends BaseMapper<"+beanName+"Entity>{\n" +
" \n" +
"}");
} catch (Exception e) {
e.printStackTrace();
}
write(sb.toString(),"Mapper.java","mapper");
System.err.println("\n類型:JAVA數(shù)據(jù)持久層接口(dao.java)" + "\n狀態(tài):成功" + "\n時(shí)間:" + format.format(new Date()) + "\n");
}
/**
* 生成SERVICE層接口
*/
private static void getService(String tableName,String aliasName) {
StringBuilder sb = new StringBuilder();
try {
String beanName = formatBeanName(aliasName);
sb.append("package "+packageName+".service;\n\n");
sb.append("import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\n");
sb.append("import org.springframework.stereotype.Service;\n");
sb.append("import "+packageName+".mapper."+beanName+"Mapper;\n");
sb.append("import "+packageName+".entity."+beanName+"Entity;\n");
sb.append( "/**\n" +
" * @author " + author + "\n" +
" * @date "+ format.format(new Date())+"\n" +
" */\n" +
"@Service\n" +
"public class "+beanName+"Service extends ServiceImpl<"+beanName+"Mapper, "+beanName+"Entity>{\n" +
"\n" +
"}");
} catch (Exception e) {
e.printStackTrace();
}
write(sb.toString(),"Service.java","service");
System.err.println("\n類型:JAVA業(yè)務(wù)層接口(service.java)" + "\n狀態(tài):成功" + "\n時(shí)間:" + format.format(new Date()) + "\n");
}
/**
* 寫文件,支持中文字符,在linux redhad下測(cè)試過
* @param str 文本內(nèi)容
* @param name 文本名稱
* */
private static void write(String str, String name,String type) {
try {
File dir = new File(rootPathName +packagePath+ "/" + type);
dir.mkdirs();
String path = dir.getPath() + "/" + formatBeanName(aliasName)+name;
File file = new File(path);
if (!file.exists())
file.createNewFile();
FileOutputStream out = new FileOutputStream(file, false); //如果追加方式用true
StringBuilder sb = new StringBuilder();
sb.append(str + "\n");
out.write(sb.toString().getBytes("utf-8"));//注意需要轉(zhuǎn)換對(duì)應(yīng)的字符集
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//一次生產(chǎn)所有表
private static void tableNames() {
getConnection = getConnections();
try {
DatabaseMetaData dbmd = getConnection.getMetaData();
ResultSet rs = dbmd.getTables(getConnection.getCatalog(), null, null, new String[] { "TABLE" });
while (rs.next()) {
tableName=rs.getString("TABLE_NAME");
aliasName=getAliasName(tableName,"of_");
//實(shí)體
getBean(tableName,aliasName);
//dao層接口
getMapper(tableName,aliasName);
//業(yè)務(wù)類接口
getService(tableName,aliasName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// tableNames();
//實(shí)體
getBean(tableName,aliasName);
//mapper接口
getMapper(tableName,aliasName);
//業(yè)務(wù)類接口
getService(tableName,aliasName);
}
}
生成文件截圖
實(shí)體

mapper

service

到此這篇關(guān)于mybatis plus代碼生成工具的實(shí)現(xiàn)代碼的文章就介紹到這了,更多相關(guān)mybatis plus代碼生成工具內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis-Plus的應(yīng)用場(chǎng)景描述及注入SQL原理分析
- SpringBoot+MyBatisPlus+Vue 前后端分離項(xiàng)目快速搭建過程(前端篇)
- SpringBoot+Shiro+Redis+Mybatis-plus 實(shí)戰(zhàn)項(xiàng)目及問題小結(jié)
- SpringBoot基于Mybatis-Plus自動(dòng)代碼生成
- 使用springboot整合mybatis-plus實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪查改示例
- mybatis plus in方法使用詳解
- Mybatis-plus與Mybatis依賴沖突問題解決方法
- MybatisPlus 不修改全局策略和字段注解如何將字段更新為null
- 教你怎么用SpringBoot+Mybati-Plus快速搭建代碼
相關(guān)文章
基于Java注解(Annotation)的自定義注解入門介紹
要深入學(xué)習(xí)注解,我們就必須能定義自己的注解,并使用注解,在定義自己的注解之前,我們就必須要了解Java為我們提供的元注解和相關(guān)定義注解的語法2013-04-04
Java網(wǎng)絡(luò)通信中URL與HTTP編程技術(shù)詳解
要想實(shí)現(xiàn)網(wǎng)絡(luò)編程,除了可以使用Socket之外,我們還可以利用URL編程或HTTP編程技術(shù),所以今天這篇文章,就給大家介紹一下URL編程和HTTP編程技術(shù),看看這兩種技術(shù)有什么特點(diǎn),文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11
Java設(shè)計(jì)模式之模板模式(Template模式)介紹
這篇文章主要介紹了Java設(shè)計(jì)模式之模板模式(Template模式)介紹,定義一個(gè)操作中算法的骨架,將一些步驟的執(zhí)行延遲到其子類中,需要的朋友可以參考下2015-03-03
Java concurrency之AtomicLong原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
AtomicLong是作用是對(duì)長(zhǎng)整形進(jìn)行原子操作。下面通過本文給大家介紹Java concurrency之AtomicLong原子類的相關(guān)知識(shí),感興趣的朋友一起看看吧2017-06-06
鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件的實(shí)例代碼
這篇文章主要介紹了鴻蒙HarmonyOS App開發(fā)造輪子之自定義圓形圖片組件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
springboot通過SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期(示例詳解)
這篇文章主要介紹了springboot通過SchedulingConfigurer實(shí)現(xiàn)多定時(shí)任務(wù)注冊(cè)及動(dòng)態(tài)修改執(zhí)行周期,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Spring實(shí)戰(zhàn)之獲得Bean本身的id操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之獲得Bean本身的id操作,結(jié)合實(shí)例形式分析了spring獲取Bean本身id的相關(guān)配置與實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-11-11

