select轉insert語句

備註:select查詢出來的數據轉成insert語句,可以直接執行SQL

 

package com.ed.core.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

import com.ed.core.domain.PProject;

import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;

public class CreateInsert {

	 private static Pattern linePattern = Pattern.compile("_(\\w)");
	
    /**
     * 生成插入語句
     * @param tablename 表明
     * @param clazz 與數據庫中字段一一對應的類
     * @param t 有數據的實體
     * @param <T> 數據實體類型 如 User
     */
    public static  <T> String getInsertSql(String tablename, Class<T> clazz, T t){
        //insert into table_name (column_name1,column_name2, ...) values (value1,value2, ...)
        String sql = "";
        Field[] fields = ReflectUtil.getFieldsDirectly(clazz, false);
        StringBuffer topHalf = new StringBuffer("insert into "+tablename+" (");
        StringBuffer afterAalf = new StringBuffer("values (");
        for (Field field : fields) {
            /*if ("ID".equals(field.getName()) || "id".equals(field.getName())){
                continue;   //id 自動生成無需手動插入
            }*/
            topHalf.append(field.getName() + ",");
            if (ReflectUtil.getFieldValue(t, field.getName()) instanceof String) {
                afterAalf.append("'" + ReflectUtil.getFieldValue(t, field.getName()) + "',");
            } else {
                afterAalf.append(ReflectUtil.getFieldValue(t, field.getName()) + ",");
            }
        }
        topHalf = new StringBuffer(StrUtil.removeSuffix(topHalf.toString(), ","));
        afterAalf = new StringBuffer(StrUtil.removeSuffix(afterAalf.toString(), ","));
        topHalf.append(") ");
        afterAalf.append(") ");
        sql = topHalf.toString() + afterAalf.toString();
        return sql;
    }

    /**
     * 生成更新語句
     * 必須含有id
     * 數據實體中 null 與 空字段不參與更新
     * @param tablename 數據庫中的表明
     * @param clazz 與數據庫中字段一一對應的類
     * @param t 有數據的實體
     * @param <T> 數據實體類型,如 User
     */
    public static  <T> String getUpdateSql(String tablename, Class<T> clazz, T t){
        //UPDATE table_name SET column_name1 = value1, column_name2 = value2, ... where ID=xxx
        //or
        //UPDATE table_name SET column_name1 = value1, column_name2 = value2, ... where id=xxx
        String sql = "";
        String id = ""; //保存id名:ID or id
        Field[] fields = ReflectUtil.getFieldsDirectly(clazz, false);
        sql = "update "+tablename+" set ";
        for (Field field : fields) {
            StringBuffer tmp = new StringBuffer();
            if ("ID".equals(field.getName()) || "id".equals(field.getName())){
                id = field.getName();
                continue;//更新的時候無需set id=xxx
            }
            if (ReflectUtil.getFieldValue(t, field.getName()) != null && ReflectUtil.getFieldValue(t, field.getName()) != "") {
                tmp.append( field.getName() + "=");
                if (ReflectUtil.getFieldValue(t, field.getName()) instanceof String) {
                    tmp.append( "'" + ReflectUtil.getFieldValue(t, field.getName()) + "',");
                } else {
                    tmp.append(ReflectUtil.getFieldValue(t, field.getName()) + ",");
                }
                sql += tmp;
            }
        }
        sql = StrUtil.removeSuffix(sql, ",") + " where " + id + "='" + ReflectUtil.getFieldValue(t, id)+"'";
        return sql;
    }


    /**
     * //根據數據庫生成字段 例如 private Object a;
     * @param dbname 數據庫名
     * @param tablename 表名稱
     * @return 成員變量拼接後的字符串
     * @throws SQLException
     */
    public static <T> String getPirvateObjectXxx(String dbname,String tablename, T t) throws SQLException, ClassNotFoundException, IllegalAccessException, InstantiationException, ParseException {
        Class.forName("org.postgresql.Driver").newInstance();
        Connection conn = DriverManager.getConnection("jdbc:postgresql://xxx.xxx.x.xx:端口號/數據庫名", "用戶名", "密碼");/*獲取你的數據庫連接*/;
        Statement stat = conn.createStatement();
        //select COLUMN_NAME from information_schema.columns where table_schema='public' and table_name='p_project';
//        ResultSet rs = stat.executeQuery("select COLUMN_NAME,COLUMN_TYPE from information_schema.COLUMNS where table_name = '"+tablename+"' and table_schema = '"+dbname+"'");
        ResultSet rs = stat.executeQuery("select COLUMN_NAME from information_schema.columns where table_schema='public' and table_name='"+tablename+"'");
        StringBuffer topHalf = new StringBuffer("insert into "+tablename+" (");
        StringBuffer afterAalf = new StringBuffer("values (");
        while (rs.next()) {
//            sb.append("private Object "+rs.getObject(1)+";\n");
        	
        	/*加上id是因爲有些文件的路徑通過id來拼接的路徑
        	if(StringUtils.equals(rs.getObject(1).toString(), "id")) {
        		continue;
        	}*/
        	
        	topHalf.append(rs.getObject(1)+ ",");
//        	System.out.println("***"+rs.getObject(1));
        	
        	//只需要判斷string類型和data類型,string類型需要加引號(''),時間需要轉換並加引號
        	Field field = ReflectUtil.getField(t.getClass(), lineToHump(rs.getObject(1).toString()));
        	if (field.getGenericType().toString().equals("class java.lang.String")) {
        		afterAalf.append("'" + ReflectUtil.getFieldValue(t,lineToHump(rs.getObject(1).toString())) + "',");
        	}else if(field.getGenericType().toString().equals("class java.util.Date")){
                /**
                 * lineToHump(rs.getObject(1).toString() 獲取bean裏面的屬性
                 * ReflectUtil.getFieldValue(t, lineToHump(rs.getObject(1).toString()))  根據bean裏的屬性獲取具體的值
                 */
                Object fieldValue = ReflectUtil.getFieldValue(t, lineToHump(rs.getObject(1).toString()));
                if(fieldValue != null){
                    afterAalf.append("'" + CSTtoDate(fieldValue.toString()) + "',");
                }
            }else {
        		afterAalf.append(ReflectUtil.getFieldValue(t,lineToHump(rs.getObject(1).toString())) + ",");
        	}
        			                         
            //topHalf.append(rs.getObject(1)+";" + ",");
           /* if (ReflectUtil.getFieldValue(t, rs.getObject(1).toString()) instanceof String) {
                afterAalf.append("'" + ReflectUtil.getFieldValue(t,lineToHump(rs.getObject(1).toString())) + "',");
            } else {
                afterAalf.append(ReflectUtil.getFieldValue(t,lineToHump(rs.getObject(1).toString())) + ",");
            }*/
        }
        topHalf = new StringBuffer(StrUtil.removeSuffix(topHalf.toString(), ","));
        afterAalf = new StringBuffer(StrUtil.removeSuffix(afterAalf.toString(), ","));
        topHalf.append(") ");
        afterAalf.append(") ");
        String sql = topHalf.toString() + afterAalf.toString();
//        while (rs.next()) {
//            sb.append("private Object "+rs.getObject(1)+";\n");
//        }
//        System.out.print(sb.toString());
        rs.close();
        stat.close();
        conn.close();
//        return sb.toString();
        return sql;
    }

    ////getInsertSql生成insert語句測試
    public static void main(String[] args) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException, ParseException {
       
    	//String result = lineToHump("project_id");
    	
    	PProject project= new PProject();
        project.setPeojectId(1);
        project.setProjectName("測試項目");
        project.setProjectCode("cs001");
        project.setProjectDescribe("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaa");
        project.setStatus(1);
        project.setCreateDate(new Date(System.currentTimeMillis()));

        String insertSql = getInsertSql("p_project", PProject.class, project);
        System.out.println(insertSql);
        String insertSqlDataBase = getPirvateObjectXxx("public", "p_project", project);
        //System.out.println(insertSql);
        System.out.println(insertSqlDataBase);

        System.out.println(CSTtoDate("Thu Feb 27 22:14:18 CST 2020"));
    }

    /**
     * 獲取bean裏面的屬性
     * @param str
     * @return
     */
    public static String lineToHump(String str) {
        str = str.toLowerCase();
        Matcher matcher = linePattern.matcher(str);
        StringBuffer sb = new StringBuffer();
        while (matcher.find()) {
            matcher.appendReplacement(sb, matcher.group(1).toUpperCase());
        }
        matcher.appendTail(sb);
        return sb.toString();
    }

    /**
     * 時間轉換
     * @param dateStr
     * @return
     * @throws ParseException
     */
    public static String CSTtoDate(String dateStr) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US);

        Date date = (Date) sdf.parse(dateStr);

        String formatStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);

        return formatStr;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章