程式碼自動生成(二)資料庫表字段生成mybaties 對映配置檔案**mapper.xml
上一篇寫的是根據資料庫欄位生成java bean,雖然有一些缺陷,但是大家可以根據字的需求進行優化,本篇部落格寫的是根據資料庫表字段生成mybaties 對映配置檔案**mapper.xml,之後還會陸續更新mybaties對應的介面。歡迎大家來點評,指出不足之處。
下面試freemarker工具類
java bean實體類結合上一篇生成的import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.Writer; import java.util.Locale; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class Freemarker { /** * 列印到控制檯(測試) * @param ftlName */ public static void print(String ftlName, Map<String,Object> root, String ftlPath) throws Exception{ try { Template temp = getTemplate(ftlName, ftlPath); //通過Template可以將模板檔案輸出到相應的流 temp.process(root, new PrintWriter(System.out)); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 輸出到輸出到檔案 * @param ftlName ftl檔案 * @param root 傳入的map * @param outFile 輸出後的檔案全部路徑 * @param filePath 輸出前的檔案上部路徑 */ public static void printFile(String ftlName, Map<String,Object> root, String outFile, String filePath, String ftlPath) throws Exception{ try { File file = new File( filePath + outFile); if(!file.getParentFile().exists()){ //判斷有沒有父路徑,就是判斷檔案整個路徑是否存�? file.getParentFile().mkdirs(); //不存在就全部建立 } Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "utf-8")); Template template = getTemplate(ftlName, ftlPath); template.process(root, out); //模版輸出 out.flush(); out.close(); } catch (TemplateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } /** * 通過檔名載入模�? * @param ftlName */ public static Template getTemplate(String ftlName, String ftlPath) throws Exception{ try { Configuration cfg = new Configuration(); //通過Freemaker的Configuration讀取相應的ftl cfg.setEncoding(Locale.CHINA, "utf-8"); cfg.setDirectoryForTemplateLoading(new File(ftlPath)); //設定去哪裡讀取相應的ftl模板檔案 Template temp = cfg.getTemplate(ftlName); //在模板檔案目錄中找到名稱為name的文�? return temp; } catch (IOException e) { e.printStackTrace(); } return null; } }
public class Student {
private String id;
private String name;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
這是freemarker模板檔案mapperMysqlTemplate.ftl
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="${objectName}Mapper"> <!-- 新增--> <insert id="save" parameterType="${pack}"> insert into ${table}( <#list fieldList as var> ${var}, </#list> ${id} ) values ( <#list fieldList as var> ${r"#{"}${var}${r"}"}, </#list> ${r"#{"}${id}${r"}"} ) </insert> <!-- 刪除--> <delete id="delete" parameterType="${pack}"> delete from ${table} where ${id} = ${r"#{"}${id}${r"}"} </delete> <!-- 修改 --> <update id="edit" parameterType="${pack}"> update ${table} set <#list fieldList as var> <#if var??> ${var} = ${r"#{"}${var}${r"}"}, </#if> </#list> where ${id} = ${r"#{"}${id}${r"}"} </update> <!-- 通過ID獲取資料 --> <select id="findById" parameterType="java.lang.String" resultType="${pack}"> select <#list fieldList as var> ${var}, </#list> ${id} from ${table} where ${id} = ${r"#{"}${id}${r"}"} </select> <!-- 列表(全部) --> <select id="listAll" resultType="${pack}"> select <#list fieldList as var> a.${var}, </#list> a.${id} from ${table} a </select> </mapper>
查詢資料庫表字段的工具類
import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class ReflectBean { private Connection connection; /*mysql url的連線字串*/ private static String url = "jdbc:mysql://127.0.0.1:3306/wechat?useUnicode=true&characterEncoding=UTF-8"; //賬號 private static String user = "root"; //密碼 private static String password = "123456"; //mysql jdbc的java包驅動字串 private String driverClassName = "com.mysql.jdbc.Driver"; //資料庫中的表名 private String table; public String getTable() { return table; } public void setTable(String table) { this.table = table; } //資料庫的列名稱 private String[] colnames; // 列名陣列 //列名型別陣列 private String[] colTypes; public String[] getColnames() { return colnames; } public void setColnames(String[] colnames) { this.colnames = colnames; } public String[] getColTypes() { return colTypes; } public void setColTypes(String[] colTypes) { this.colTypes = colTypes; } public Connection getConnection() { return connection; } public void setConnection(Connection connection) { this.connection = connection; } public ReflectBean(){ try {//驅動註冊 Class.forName(driverClassName); if (connection == null || connection.isClosed()) //獲得連結 connection = DriverManager.getConnection(url, user, password); } catch (ClassNotFoundException ex) { ex.printStackTrace(); System.out.println("Oh,not"); } catch (SQLException e) { e.printStackTrace(); System.out.println("Oh,not"); } } public List<String> doAction(){ String sql = "select * from "+table; List<String> list = new ArrayList<String>(); try { PreparedStatement statement = connection.prepareStatement(sql); //獲取資料庫的元資料 ResultSetMetaData metadata = statement.getMetaData(); ResultSet rs = connection.getMetaData().getPrimaryKeys(null, null, table); String id = ""; //獲取組鍵欄位 if(rs.next()){ id = rs.getString(4); } //資料庫的欄位個數 int len = metadata.getColumnCount(); //欄位名稱 colnames = new String[len+1]; //欄位型別 --->已經轉化為java中的類名稱了 colTypes = new String[len+1]; for(int i= 1;i<=len;i++){ //System.out.println(metadata.getColumnName(i)+":"+metadata.getColumnTypeName(i)+":"+sqlType2JavaType(metadata.getColumnTypeName(i).toLowerCase())+":"+metadata.getColumnDisplaySize(i)); //metadata.getColumnDisplaySize(i); colnames[i] = metadata.getColumnName(i); //獲取欄位名稱 list.add( colnames[i]); colTypes[i] = sqlType2JavaType(metadata.getColumnTypeName(i)); //獲取欄位型別 } list.add(id); } catch (SQLException e) { e.printStackTrace(); } return list; } /* * mysql的欄位型別轉化為java的型別*/ private String sqlType2JavaType(String sqlType) { if(sqlType.equalsIgnoreCase("bit")){ return "boolean"; }else if(sqlType.equalsIgnoreCase("tinyint")){ return "byte"; }else if(sqlType.equalsIgnoreCase("smallint")){ return "short"; }else if(sqlType.equalsIgnoreCase("int")){ return "int"; }else if(sqlType.equalsIgnoreCase("bigint")){ return "long"; }else if(sqlType.equalsIgnoreCase("float")){ return "float"; }else if(sqlType.equalsIgnoreCase("decimal") || sqlType.equalsIgnoreCase("numeric") || sqlType.equalsIgnoreCase("real") || sqlType.equalsIgnoreCase("money") || sqlType.equalsIgnoreCase("smallmoney")){ return "double"; }else if(sqlType.equalsIgnoreCase("varchar") || sqlType.equalsIgnoreCase("char") || sqlType.equalsIgnoreCase("nvarchar") || sqlType.equalsIgnoreCase("nchar") || sqlType.equalsIgnoreCase("text")){ return "String"; }else if(sqlType.equalsIgnoreCase("datetime") ||sqlType.equalsIgnoreCase("date")){ return "Date"; }else if(sqlType.equalsIgnoreCase("image")){ return "Blod"; }else if(sqlType.equalsIgnoreCase("timestamp")){ return "Timestamp"; } return null; } /*獲取整個類的字串並且輸出為java檔案 * */ public StringBuffer getClassStr(){ //輸出的類字串 StringBuffer str = new StringBuffer(""); //獲取表型別和表名的欄位名 this.doAction(); //校驗 if(null == colnames && null == colTypes) return null; //拼接 str.append("public class "+GetTuoFeng(table)+" {\r\n"); //拼接屬性 for(int index=1; index < colnames.length ; index++){ str.append(getAttrbuteString(colnames[index],colTypes[index])); } //拼接get,Set方法 for(int index=1; index < colnames.length ; index++){ str.append(getGetMethodString(colnames[index],colTypes[index])); str.append(getSetMethodString(colnames[index],colTypes[index])); } str.append("}\r\n"); //輸出到檔案中 File file = new File("E:/mengwx/【原始碼】mysql版本_spring4.0/FHMYSQL/src/com/fh/entity/"+GetTuoFeng(table)+".java"); BufferedWriter write = null; try { write = new BufferedWriter(new FileWriter(file)); write.write(str.toString()); write.close(); } catch (IOException e) { e.printStackTrace(); if (write != null) try { write.close(); } catch (IOException e1) { e1.printStackTrace(); } } return str; } /* * 獲取欄位字串*/ public StringBuffer getAttrbuteString(String name, String type) { if(!check(name,type)) { System.out.println("類中有屬性或者型別為空"); return null; }; String format = String.format(" private %s %s;\n\r", new String[]{type,name}); return new StringBuffer(format); } /* * 校驗name和type是否合法*/ public boolean check(String name, String type) { if("".equals(name) || name == null || name.trim().length() ==0){ return false; } if("".equals(type) || type == null || type.trim().length() ==0){ return false; } return true; } /* * 獲取get方法字串*/ private StringBuffer getGetMethodString(String name, String type) { if(!check(name,type)) { System.out.println("類中有屬性或者型別為空"); return null; }; String Methodname = "get"+GetTuoFeng(name); String format = String.format(" public %s %s(){\n\r", new Object[]{type,Methodname}); format += String.format(" return this.%s;\r\n", new Object[]{name}); format += " }\r\n"; return new StringBuffer(format); } //將名稱首字元大寫 private String GetTuoFeng(String name) { name = name.trim(); if(name.length() > 1){ name = name.substring(0, 1).toUpperCase()+name.substring(1); }else { name = name.toUpperCase(); } return name; } /* * 獲取欄位的get方法字串*/ private Object getSetMethodString(String name, String type) { if(!check(name,type)) { System.out.println("類中有屬性或者型別為空"); return null; }; String Methodname = "set"+GetTuoFeng(name); String format = String.format(" public void %s(%s %s){\n\r", new Object[]{Methodname,type,name}); format += String.format(" this.%s = %s;\r\n", new Object[]{name,name}); format += " }\r\n"; return new StringBuffer(format); } public static void main(String[] args) { ReflectBean bean = new ReflectBean(); System.err.println(bean.getClassStr()); } }
生成mapper.xml的工具類
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.mengwx.entiy.Student;
import com.mengwx.util.Freemarker;
import com.mengwx.util.ReflectBean;
public class CreateCodeController{
/**
* 生成程式碼
*/
public static void proCode(Object object,String table) throws Exception{
String objectName = object.getClass().getSimpleName();
String pack = object.getClass().getName();
ReflectBean re = new ReflectBean();
re.setTable(table);
List<String> list = re.doAction();
Map<String,Object> root = new HashMap<String,Object>();
String id = "";
if(list.size()>=1){//建立資料模型
id = list.get(list.size()-1);
}
root.put("packageName", objectName);
root.put("pack", pack); //包名
root.put("objectName", objectName); //類名
root.put("objectNameLower", objectName.toLowerCase()); //類名(全小寫)
root.put("objectNameUpper", objectName.toUpperCase()); //類名(全大寫)
root.put("nowDate", new Date()); //當前日期
root.put("table", table);
root.put("id", list.get(list.size()-1));
list.remove(list.size()-1);
list.remove(id);
root.put("fieldList", list);
String filePath = "C:/Users/huxf/workspace/createcode/src/com/mengwx/code/"; //存放路徑
String ftlPath = "C:/Users/huxf/workspace/createcode/src/com/mengwx/ftl"; //ftl路徑
/*生成mybatis xml*/
Freemarker.printFile("mapperMysqlTemplate.ftl", root, ""+Student.class.getSimpleName()+"Mapper.xml", filePath, ftlPath);
}
public static void main(String[] args) throws Exception {
proCode(new Student(),"student");
}
}
生成的mapper.xml檔案
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="StudentMapper">
<!-- 新增-->
<insert id="save" parameterType="com.mengwx.entiy.Student">
insert into student(
name,
id
) values (
#{name},
#{id}
)
</insert>
<!-- 刪除-->
<delete id="delete" parameterType="com.mengwx.entiy.Student">
delete from student
where
id = #{id}
</delete>
<!-- 修改 -->
<update id="edit" parameterType="com.mengwx.entiy.Student">
update student
set
name = #{name},
where
id = #{id}
</update>
<!-- 通過ID獲取資料 -->
<select id="findById" parameterType="java.lang.String" resultType="com.mengwx.entiy.Student">
select
name,
id
from
student
where
id = #{id}
</select>
<!-- 列表(全部) -->
<select id="listAll" resultType="com.mengwx.entiy.Student">
select
a.name,
a.id
from
student a
</select>
</mapper>
專案目錄結構 StudentMapper.xml是生成的檔案
相關推薦
程式碼自動生成(二)資料庫表字段生成mybaties 對映配置檔案**mapper.xml
上一篇寫的是根據資料庫欄位生成java bean,雖然有一些缺陷,但是大家可以根據字的需求進行優化,本篇部落格寫的是根據資料庫表字段生成mybaties 對映配置檔案**mapper.xml,之後還會陸續更新mybaties對應的介面。歡迎大家來點評,指出不足之處。 下面
程式碼自動生成(-)資料庫表字段轉換成java bean
最近做系統老做一些相同的工作,就想寫一自動生成程式碼的工具類來方便以後的開法,我從網上整理修改了一些方法感覺還不錯,接下來我還陸續跟新一些自動生成程式碼的工具類,希望對大家有用。覺得不好輕點噴。import java.io.BufferedWriter; import
Mybatis-Generator自動生成程式碼——Mybatis 深入淺出(二)
使用Mybatis-Generator ,可以自動生成Model、Dao、Mapping相關檔案 根據已建立的資料庫生成相映的檔案 ,每一個數據表可以自動生成一個對應的model(pojo類),呼叫Dao類中的方法就可以直接對資料庫進行增刪改查的操作。
生成對抗網路DCGAN+Tensorflow程式碼學習筆記(二)----utils.py
utils.py主要是定義了各種對影象處理的函式,主要負責影象的一些基本操作,獲取影象、儲存影象、影象翻轉,和利用moviepy模組視覺化訓練過程。相當於其他3個檔案的標頭檔案。 """ Some codes from https://github.com/Newmu/d
Native Client: 用於行動式,不受信任的x86本機程式碼的沙箱(二)
Native Client: 用於行動式,不受信任的x86本機程式碼的沙箱(二) Native Client: A Sandbox for Portable, Untrusted x86 Native Code 原文:https://static.googleuserconten
eclipse MAT (二)分析報告的生成和記憶體消耗分析三步曲
在文章eclipse MAT (二)進行OutOfMemoryError的診斷分析 生成了一個檔案java_pid3708.hprof,這個檔案 在你的專案的根目錄下 一,生成分析報告 首先,啟動前面安裝配置好的 Memory Analyzer tool , 然後選擇選單項 File-
PHP學習筆記(二)--資料庫操作
下面使用簡單的例子說下在PHP中操作MySql資料庫,內容包括連線資料庫、查詢操作、事務及儲存過程。 1、訪問MySql一般步驟 1)連線MySql伺服器 使用mysql_connect()函式建立與MySql伺服器的連線。 2)選擇MySql資料庫 使用mysql_select
GitHub超過4700星的TensorFlow(Amirsina Torfi博士)程式碼學習筆記(二)
上次的比較基礎,本章節(第二個檔案)主要是基礎機器學習模型學習。和筆記(一)相比較複雜,並且很多模型我都沒有引用成功。避免文章太長 ,所以本文只學習gradient_boosted_decision_tree.py,kmeans.py和linear_regression.py 完整程式碼連結
Android配置build.gradle編譯release包時以日期時間加序列號為Version Code且Version Code自動增長(二)
Android配置build.gradle編譯release包時以日期時間加序列號為Version Code且Version Code自動增長(二) Android官方推薦以一個自然增長的整數值為Version Code,比如以基礎數值1為基礎,每次發一個release包時候Version值
hibernate (二):主鍵生成策略
hibernate的主鍵生成器: generator元素:表示了一個主鍵生成器,它用來為持久化類例項生成唯一的標識 主鍵生成器: 1、程式設計師自己控制 assigned 提示:如果hibernate設定了程式設計師自己控制資料庫主鍵設定了自動增長也不會成功
gitlab之gitlab-runner自動部署(二)
轉載自:https://blog.csdn.net/hxpjava1/article/details/78514999 簡介 gitlab-ci全稱是gitlab continuous integration的意思,也就是持續整合。中心思想是當每一次push到gitlab的時候,都會觸發一次
第X屆智慧車攝像頭組程式碼全解析 ------(二)材料選型
作者:Sumjess 這篇部落格的開頭我想解釋下我的想法,本人是十三屆參賽選手,在十三屆的時候我做了下調研,一些國一、國二的3米大佬隊伍並沒有說在選型的器件上高階很多(這裡請貝殼等大佬學校繞行),都很普通。所以據此做了以下的選型。 車模:C車模(由於十
(學習中)資料庫表字段命名規範
原文連結:https://www.cnblogs.com/pangguoming/p/7126512.html 一、資料庫命名規範 採用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線'_'組成,命名簡潔明確,多個單詞用下劃線'_'分隔,一個專案一個數據
Spring Boot 之jpa(二)資料庫
關於配置application.yml spring: profiles: active: master datasource: driver-class-name: co
資料庫原理學習筆記(二)資料庫正規化
正規化可以理解成在設計資料表時的規範級別,常見的正規化有 第一正規化(1NF) 第二正規化(2NF) 第三正規化(3NF) BC正規化(BCNF) 第一正規化 要滿足第一正規化,要求資料表的每個屬性無法再分,也就是需要滿足原子性。可以把“不可再
安裝Centos7 、 Mysql8 叢集,實現讀寫分離 高可用(二)-- 資料庫安裝篇
零、寫在前面 為了嘗試新技術和業務需要,因此打算搞一套這樣的環境玩兒一下 伺服器的安裝請見上一篇一、硬體規劃 我用的是自己的本機(8核、16G),劃分出三臺虛擬機器(一主兩從--MyS
資料庫實踐操作(二)--資料庫遷移方案
例如:開發好的銀行系統進行遷移 介紹四種方法 1>分離附加法(常當前資料庫中分離) 前提:該資料庫不處於被訪問狀態 1>開啟要分離的資料庫檔案位置 右擊資料庫屬性–檔案–複製路徑–win+R開啟路徑 注意:開啟這一
Jenkins持續化構建Android專案(二)-構建Android專案生成apk(by 星空武哥)
Jenkins安裝完我們就可以新建專案了 首先開始新建一個專案,選擇型別為“構建一個自由風格的軟體專案” 新建完成,就是配置專案 開始配置“General” 構建觸發器 我們選擇Poll
Hinton關於RBM的程式碼註解之(二)backpropclassify.m
原始碼:http://www.cs.toronto.edu/~hinton/MatlabForSciencePaper.html 這個是關於RBM的微調步驟的程式碼,代價函式是交叉熵 % Version 1.000 %% Code provided by Ruslan
2014-10-27Android學習------SQLite資料庫操作(二)-----資料庫的建立--SQLiteHelper extends SQLiteOpenHelper
上篇有篇文章講了資料庫的操作 條件是:資料庫已經建好的了,我們只需要從裡面獲取資料(查詢)就可以了, 現在我們來看看第二種資料庫的操作: class SQLiteHelper extends SQLiteOpenHelper 封裝一個繼承SQLiteOpenHelpe