using JavaCode.cs; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using System.Windows.Forms; namespace JavaCode { public partial class FrmMain : Form { #region 成员变量+构造函数 string baseDir = AppDomain.CurrentDomain.BaseDirectory; private PostgreHelper _dbHelper; private List _list; public FrmMain() { InitializeComponent(); } private void FrmMain_Load(object sender, EventArgs e) { _dbHelper = new PostgreHelper(DbEnum.langfang); } #endregion #region 查询表结构 private void btnReadTab_Click(object sender, EventArgs e) { string txtTab = this.txtTabPre.Text.Trim(); string sql = "select c.relname as \"tab\", cast(obj_description(c.oid) as varchar) as \"desc\", a.attnum as \"num\", a.attname as \"col\", concat_ws('', t.typname, SUBSTRING(format_type(a.atttypid, a.atttypmod) from '\\(.*\\)')) as \"type\", d.description as \"bak\" from pg_attribute a left join pg_description d on d.objoid = a.attrelid and d.objsubid = a.attnum left join pg_class c on a.attrelid = c.oid left join pg_type t on a.atttypid = t.oid where a.attnum >= 0 and c.relname like '" + txtTab + "%' and obj_description(c.oid) is not null and relnamespace=" + this.txtNS.Text.Trim() + " order by c.relname desc, a.attnum asc"; DataTable dt = _dbHelper.GetDataTable(sql, null); _list = ModelHandler.FillModel(dt); if (_list == null || _list.Count == 0) { MessageBox.Show("没有查询到数据!"); return; } List tabList = new List(); foreach (TabInfo ti in _list) { if (!tabList.Contains(ti.tab)) { tabList.Add(ti.tab); } } this.tabList.DataSource = tabList; } private void tabList_SelectedIndexChanged(object sender, EventArgs e) { string tab = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == tab orderby p.num select p).ToList(); this.dgvTab.DataSource = new BindingList(tabs); if (tabs != null && tabs.Count > 1) { this.dgvTab.Rows[1].Selected = true; this.dgvTab.CurrentCell = this.dgvTab.Rows[1].Cells[0]; } } private void selectAll_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { this.tabList.SetSelected(i, true); } } private void selectFlag_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { bool flag = this.tabList.GetSelected(i); this.tabList.SetSelected(i, !flag); } } private void selectNone_Click(object sender, EventArgs e) { for (int i = 0; i < this.tabList.Items.Count; i++) { this.tabList.SetSelected(i, false); } } #endregion #region 生成 Mapper.Xml private void mapperXml_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateMapperXml(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void GenerateMapperXml(string name, List tabs) { string tabName = this.txtTabNS.Text.Trim() + name; name = name.Replace(this.txtTabPre.Text, ""); string shortName = NameConvert(name, true); string mapperNS = this.txtMapperNS.Text.Trim(); string mapperName = shortName + "Mapper"; string entityNS = this.txtEntityNS.Text.Trim(); string entityName = shortName + "Entity"; int idx = this.dgvTab.CurrentRow.Index; TabInfo selectTabInfo = tabs[idx]; string colType = GetJavaType(selectTabInfo); string colName = NameConvert(selectTabInfo.col, false); string testExpr = colName + " != null"; string testWhere = selectTabInfo.col + (colType == "String" ? " like " : " = ") + "#{" + colName + "}"; string insertCols = GetInsertCols(tabs); string insertVal = GetInsertVal(tabs); string insertVals = GetInsertVals(tabs); string updateVal = GetUpdateVal(tabs); string updateVals = GetUpdateVals(tabs); string xml = File.ReadAllText(Path.Combine(baseDir, "Template\\Mapper.xml")); xml = xml .Replace("{mapperNS}", mapperNS) .Replace("{mapperName}", mapperName) .Replace("{tabName}", tabName) .Replace("{testExpr}", testExpr) .Replace("{testWhere}", testWhere) .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{insertCols}", insertCols) .Replace("{insertVal}", insertVal) .Replace("{insertVals}", insertVals) .Replace("{updateVal}", updateVal) .Replace("{updateVals}", updateVals); string path = Path.Combine(baseDir, "Generate"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string fileName = shortName + "Mapper.xml"; File.WriteAllText(Path.Combine(path, fileName), xml); } private static string NameConvert(string name, bool firstUpper) { string[] strs = name.Split(new char[] { '_' }); string str = ""; for (int i = 0, c = strs.Length; i < c; i++) { if (i == 0 && !firstUpper) { str += strs[i]; continue; } str += ToUpperFirst(strs[i]); } return str; } public static string ToUpperFirst(string str) { return Regex.Replace(str, @"^\w", t => t.Value.ToUpper()); } public string GetInsertCols(List tabs) { List excluds = this.txtInsert.Text.Trim().Split(new char[] { ',' }).ToList(); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { if (excluds.Contains(ti.col)) { continue; } sb.Append(ti.col + ","); } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } public string GetInsertVal(List tabs) { List excluds = this.txtInsert.Text.Trim().Split(new char[] { ',' }).ToList(); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { if (excluds.Contains(ti.col)) { continue; } if (ti.type == "timestamp(6)") { sb.Append("now(),"); continue; } sb.Append("#{" + NameConvert(ti.col, false) + "},"); } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } public string GetInsertVals(List tabs) { List excluds = this.txtInsert.Text.Trim().Split(new char[] { ',' }).ToList(); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { if (excluds.Contains(ti.col)) { continue; } if (ti.type == "timestamp(6)") { sb.Append("now(),"); continue; } sb.Append("#{item." + NameConvert(ti.col, false) + "},"); } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } public string GetUpdateVal(List tabs) { List excluds = this.txtUpdate.Text.Trim().Split(new char[] { ',' }).ToList(); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { if (excluds.Contains(ti.col)) { continue; } if (ti.type == "timestamp(6)") { sb.Append(ti.col + "=now(),"); continue; } sb.Append(ti.col + "=#{" + NameConvert(ti.col, false) + "},"); } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } public string GetUpdateVals(List tabs) { List excluds = this.txtUpdate.Text.Trim().Split(new char[] { ',' }).ToList(); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { if (excluds.Contains(ti.col)) { continue; } if (ti.type == "timestamp(6)") { sb.Append(ti.col + "=now(),"); continue; } sb.Append(ti.col + "=#{item." + NameConvert(ti.col, false) + "},"); } if (sb.Length > 0) { sb.Remove(sb.Length - 1, 1); } return sb.ToString(); } private static void OpenFolder(string folderPath) { if (string.IsNullOrEmpty(folderPath)) return; Process process = new Process(); ProcessStartInfo psi = new ProcessStartInfo("Explorer.exe"); psi.Arguments = folderPath; process.StartInfo = psi; try { process.Start(); } catch (Exception ex) { throw ex; } finally { process.Close(); } } #endregion #region 生成 Mapper.java private void mapperJava_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateMapperJava(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void GenerateMapperJava(string name, List tabs) { name = name.Replace(this.txtTabPre.Text, ""); string shortName = NameConvert(name, true); string mapperNS = this.txtMapperNS.Text.Trim(); string entityNS = this.txtEntityNS.Text.Trim(); string mapperName = shortName + "Mapper"; string entityName = shortName + "Entity"; string bak = tabs[0].desc.Replace("表", ""); int idx = this.dgvTab.CurrentRow.Index; TabInfo selectTabInfo = tabs[idx]; string colType = GetJavaType(selectTabInfo); string colName = NameConvert(selectTabInfo.col, false); string queryCol = colType + " " + colName; string colBak = selectTabInfo.bak; string xml = File.ReadAllText(Path.Combine(baseDir, "Template\\Mapper.java")); xml = xml .Replace("{mapperNS}", mapperNS) .Replace("{mapperName}", mapperName) .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{colName}", colName) .Replace("{colBak}", colBak) .Replace("{bak}", bak) .Replace("{queryCol}", queryCol); string path = Path.Combine(baseDir, "Generate"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string fileName = shortName + "Mapper.java"; File.WriteAllText(Path.Combine(path, fileName), xml); } private string GetJavaType(TabInfo ti) { string type = ti.type.Split(new char[] { '(' })[0]; switch (type) { case "timestamp": return "Timestamp"; case "float4": // float return "Float"; case "float8": // double return "Double"; case "bool": // boolean return "Boolean"; case "numeric": return "BigDecimal"; case "int8": // long return "Long"; case "int2": case "int4": // int return "Integer"; default: return "String"; } } private String GetType(TabInfo ti) { string type = ti.type.Split(new char[] { '(' })[0]; switch (type) { case "timestamp": return "Timestamp"; case "float4": return "float"; case "float8": return "double"; case "bool": return "boolean"; case "numeric": return "BigDecimal"; case "int8": return "long"; case "int2": case "int4": return "int"; default: return "String"; } } #endregion #region 生成 Entity.java private void entityJava_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateEntityJava(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void GenerateEntityJava(string name, List tabs) { name = name.Replace(this.txtTabPre.Text, ""); string shortName = NameConvert(name, true); string entityNS = this.txtEntityNS.Text.Trim(); string entityName = shortName + "Entity"; string bak = tabs[0].desc.Replace("表", ""); long uid = (long)Math.Floor((new Random()).NextDouble() * 1000000000000000000D); int idx = this.dgvTab.CurrentRow.Index; TabInfo selectTabInfo = tabs[idx]; string xml = File.ReadAllText(Path.Combine(baseDir, "Template\\Entity.java")); xml = xml .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{bak}", bak) .Replace("{uid}", uid.ToString()); StringBuilder sb = new StringBuilder(); foreach (TabInfo ti in tabs) { string type = GetType(ti); string colName = NameConvert(ti.col, false); sb.Append("\r\n private " + type + " " + colName + ";\r\n"); } sb.Append("\r\n public " + entityName + "() {\r\n }\r\n"); foreach (TabInfo ti in tabs) { string type = GetType(ti); string col1 = NameConvert(ti.col, true); string col2 = NameConvert(ti.col, false); sb.Append("\r\n public " + type + " get" + col1 + "() {\r\n return " + col2 + ";\r\n }\r\n"); sb.Append("\r\n public void set" + col1 + "(" + type + " " + col2 + ") {\r\n this." + col2 + " = " + col2 + ";\r\n }\r\n"); } sb.Append("}\r\n"); string path = Path.Combine(baseDir, "Generate"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } sb.Insert(0, xml); string fileName = shortName + "Entity.java"; File.WriteAllText(Path.Combine(path, fileName), sb.ToString()); } #endregion #region 生成 Service.java private void serviceJava_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateServiceJava(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void GenerateServiceJava(string name, List tabs) { name = name.Replace(this.txtTabPre.Text, ""); string shortName = NameConvert(name, true); string mapperNS = this.txtMapperNS.Text.Trim(); string entityNS = this.txtEntityNS.Text.Trim(); string serviceNS = this.txtServiceNS.Text.Trim(); string mapperName = shortName + "Mapper"; string minMapperName = NameConvert(name, false) + "Mapper"; string entityName = shortName + "Entity"; string serviceName = shortName + "Service"; string bak = tabs[0].desc.Replace("表", ""); int idx = this.dgvTab.CurrentRow.Index; TabInfo selectTabInfo = tabs[idx]; string colType = GetJavaType(selectTabInfo); string colName = NameConvert(selectTabInfo.col, false); string queryCol = colType + " " + colName; //string where = isString ? "\r\n " + colName + " = \"%\" + (StringHelper.isNull(" + colName + ") ? \"\" : " + colName + ".trim()) + \"%\";\r\n" : ""; string where = colType == "String" ? "\r\n " + colName + " = StringHelper.isNull(" + colName + ") ? null : \"%\" + " + colName + ".trim() + \"%\";\r\n" : ""; string xml = File.ReadAllText(Path.Combine(baseDir, "Template\\Service.java")); xml = xml .Replace("{mapperNS}", mapperNS) .Replace("{mapperName}", mapperName) .Replace("{minMapperName}", minMapperName) .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{serviceNS}", serviceNS) .Replace("{serviceName}", serviceName) .Replace("{bak}", bak) .Replace("{queryCol}", queryCol) .Replace("{colName}", colName) .Replace("{where}", where); string path = Path.Combine(baseDir, "Generate"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string fileName = shortName + "Service.java"; File.WriteAllText(Path.Combine(path, fileName), xml); } #endregion #region 生成 Controller.java private void controllerJava_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateControllerJava(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void GenerateControllerJava(string name, List tabs) { name = name.Replace(this.txtTabPre.Text, ""); string shortName = NameConvert(name, true); string mapperNS = this.txtMapperNS.Text.Trim(); string entityNS = this.txtEntityNS.Text.Trim(); string serviceNS = this.txtServiceNS.Text.Trim(); string controllerNS = this.txtControllerNS.Text.Trim(); string apiTag = this.txtApiTag.Text.Trim(); string mapperName = shortName + "Mapper"; string entityName = shortName + "Entity"; string serviceName = shortName + "Service"; string minServiceName = NameConvert(name, false) + "Service"; string controllerName = shortName + "Controller"; string bak = tabs[0].desc.Replace("表", ""); string apiName = NameConvert(name, false); int idx = this.dgvTab.CurrentRow.Index; TabInfo selectTabInfo = tabs[idx]; string colType = GetJavaType(selectTabInfo); string colName = NameConvert(selectTabInfo.col, false); string queryCol = colType + " " + colName; string colBak = selectTabInfo.bak; string xml = File.ReadAllText(Path.Combine(baseDir, "Template\\Controller.java")); xml = xml .Replace("{mapperNS}", mapperNS) .Replace("{mapperName}", mapperName) .Replace("{entityNS}", entityNS) .Replace("{entityName}", entityName) .Replace("{serviceNS}", serviceNS) .Replace("{serviceName}", serviceName) .Replace("{controllerNS}", controllerNS) .Replace("{controllerName}", controllerName) .Replace("{minServiceName}", minServiceName) .Replace("{queryCol}", queryCol) .Replace("{colName}", colName) .Replace("{colBak}", colBak) .Replace("{colType}", colType) .Replace("{apiTag}", apiTag) .Replace("{apiName}", apiName) .Replace("{bak}", bak); string path = Path.Combine(baseDir, "Generate"); if (!Directory.Exists(path)) { Directory.CreateDirectory(path); } string fileName = shortName + "Controller.java"; File.WriteAllText(Path.Combine(path, fileName), xml); } #endregion #region 生成所有文件 private void generateAll_Click(object sender, EventArgs e) { try { string name = this.tabList.SelectedItem as string; List tabs = (from p in _list where p.tab == name orderby p.num select p).ToList(); GenerateMapperXml(name, tabs); GenerateMapperJava(name, tabs); GenerateEntityJava(name, tabs); GenerateServiceJava(name, tabs); GenerateControllerJava(name, tabs); string path = Path.Combine(baseDir, "Generate"); OpenFolder(path); } catch (Exception ex) { MessageBox.Show(ex.Message); } } #endregion } }