1. 程式人生 > >程式碼自動生成(二)資料庫表字段生成mybaties 對映配置檔案**mapper.xml

程式碼自動生成(二)資料庫表字段生成mybaties 對映配置檔案**mapper.xml

上一篇寫的是根據資料庫欄位生成java bean,雖然有一些缺陷,但是大家可以根據字的需求進行優化,本篇部落格寫的是根據資料庫表字段生成mybaties 對映配置檔案**mapper.xml,之後還會陸續更新mybaties對應的介面。歡迎大家來點評,指出不足之處。

下面試freemarker工具類

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;
	}
}
java bean實體類結合上一篇生成的
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星的TensorFlowAmirsina 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專案生成apkby 星空武哥

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