JAVA類型和SQL類型的匹配

來源:互聯網
上載者:User

已動態建立表為例

(1)
    public class DataType {
      private int code;
      private String SQLType;
      private String localType = null;
      private String params = null;
      private boolean needsSetting = true;
      public DataType(int code, String SQLType) {
       this.code = code;
       this.SQLType = SQLType;
       }
       public boolean needsToBeSet() {
       return needsSetting;
      }
       public int getCode() {
       return code;
      }
       public String getSQLType() {
       return SQLType;
      }
       public String getLocalType() {
       return localType;
      }
       public String getParams() {
       return params;
      }
     public void setLocalTypeAndParams(String local, String p) {
       if (needsSetting) {
        localType = local;
        params = p;
        needsSetting = false;
       }
      }
     }

(2)
   import java.sql.*;
   public class SQLTypesCreate {
      public static void main(String [ ] args) {
       String url="jdbc:oracle:thin:@localhost:1521:oral";
         String user="SYSTEM";
         String pass="manager";
       try {
        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
       } catch(Exception e){System.out.println(e);}
       try {
        Connection con = DriverManager.getConnection(url, user,pass);
        Statement     stmt = con.createStatement();
        String tableName;
                             // 建立表語句中的表名變數
        String columnName;
                             // 列名變數
        String sqlType;
                             // 資料類型變數
                             // 以上三個變數都是為了建立建表語句服務的
       DataType [ ] typeArray = {
   new DataType(java.sql.Types.BIT, "BIT"),
   new DataType(java.sql.Types.TINYINT, "TINYINT"),
   new DataType(java.sql.Types.SMALLINT, "SMALLINT"),
   new DataType(java.sql.Types.INTEGER, "INTEGER"),
   new DataType(java.sql.Types.BIGINT, "BIGINT"),
   new DataType(java.sql.Types.FLOAT, "FLOAT"),
   new DataType(java.sql.Types.REAL, "REAL"),
   new DataType(java.sql.Types.DOUBLE, "DOUBLE"),
   new DataType(java.sql.Types.NUMERIC, "NUMERIC"),
   new DataType(java.sql.Types.DECIMAL, "DECIMAL"),
   new DataType(java.sql.Types.CHAR, "CHAR"),
   new DataType(java.sql.Types.VARCHAR, "VARCHAR"),
   new DataType(java.sql.Types.LONGVARCHAR, "LONGVARCHAR"),
   new DataType(java.sql.Types.DATE, "DATE"),
   new DataType(java.sql.Types.TIME, "TIME"),
   new DataType(java.sql.Types.TIMESTAMP, "TIMESTAMP"),
   new DataType(java.sql.Types.BINARY, "BINARY"),
   new DataType(java.sql.Types.VARBINARY, "VARBINARY"),
   new DataType(java.sql.Types.LONGVARBINARY, "LONGVARBINARY"),
   new DataType(java.sql.Types.NULL, "NULL"),
   new DataType(java.sql.Types.OTHER, "OTHER"),
        };
        //建立一個數組用用jdbc SQl資料類型的代碼和名字初始化,其它為null
        //注意,以上出現的名字全部都是Types類中出現的
               DatabaseMetaData dbmd = con.getMetaData();
        //建立DatabaseMetaData對象,用來擷取資料庫的屬性
        ResultSet rs = dbmd.getTypeInfo();
        //擷取資料庫支援的SQL資料類型
        while (rs.next()){
         int codeNumber = rs.getInt("DATA_TYPE");
         String dbmsName = rs.getString("TYPE_NAME");
         String createParams = rs.getString("CREATE_PARAMS");
        // 以下是本機資料庫支援的資料類型在jdbc中的映射號,本地名,參數
        //System.out.println(codeNumber+" "+dbmsName+" "+createParams);
        for (int i = 0; i < typeArray.length; i++) {
          if (typeArray[i].getCode() == codeNumber) {
          // 如果typeArray中的元素代碼等於本機資料庫類型的代碼,
          // 就可以把typeArray中的類型名設成從DatabaseMetaData獲得的本地名
           typeArray[i].setLocalTypeAndParams(
             dbmsName, createParams);
             System.out.println("匹配的code,SQLType,localType,params有:");
             System.out.println(typeArray[i].getCode()+" "+
                            typeArray[i].getSQLType()+" "+
                            typeArray[i].getLocalType()+" "+
                            typeArray[i].getParams());
         }
          // 設定數組中的資料庫中的類型名和參數,列印出所有匹配的
         }
          // end for
        }//end while
        String tableNamePrompt = "輸入表名 " +  "並斷行符號 ";
        tableName = getInput(tableNamePrompt);
        String createTableString = "create table " + tableName + " (";
        String commaAndSpace = ", ";
        boolean firstTime = true;
        while (true){
              System.out.println("");
              String columnNamePrompt = "輸入列名 " +"或不輸入任何資料然後斷行符號: ";
         columnName = getInput(columnNamePrompt);
         if (firstTime) {
          if (columnName.length() == 0) {
           System.out.print("至少需要一列;");
           System.out.println(" 請重試");
           continue;
          } else {
           createTableString += columnName + " ";
           // 繼續形成建立表的字串
           firstTime = false;
          }
         } else if (columnName.length() == 0) {
           break;
           // 不輸入列時那麼建立語句的過程結束
         } else {
          createTableString += commaAndSpace
           + columnName + " ";
         }
         // 在成功接收到列名後,以下顯示可用的類型名
         System.out.println("");
         System.out.println("可用的類型名為:  ");
         for (int i = 0; i < typeArray.length; i++) {
          if (! typeArray[i].needsToBeSet()) {
          // 如果設定了本機資料庫中的名和參數,說明這個jdbc類型可以用
           System.out.println(typeArray[i].getSQLType());
          // 返回jdbc中對應的SQL類型名
          } 
         }
         System.out.println("");
      int index;
         while (true) {//迴圈直到輸入可用的類型
          String typePrompt = "從列表中輸入列的類型 " +
            "並斷行符號";
          sqlType = getInput(typePrompt);
          for (index = 0; index < typeArray.length; index++) {
           if (typeArray[index].getSQLType().
            equalsIgnoreCase(sqlType)){
           // 比較兩個字串是否相等,不區分大小寫
           // 如果有相等的說明輸入的類型是jdbc允許的類型,就跳出
            break;
           }
          }
          if (index < typeArray.length) {
           // 如果index小於typeArray數組的個數,說明有匹配的
           break;
           // 跳出while(true)迴圈
          }
          System.out.println("");
          System.out.print(sqlType + " 與允許的類型不符");
         
          System.out.println("");
         }
         String params;
         String localTypeName;
         params = typeArray[index].getParams();
           // 擷取類型的參數,此時的index是輸入的類型在數組中的索引
         localTypeName = typeArray[index].getLocalType();
           // 擷取資料庫中這種類型名
         String paramString;
             String parameterPrompt = "輸入 " + params + ":  ";
          paramString = "(" + getInput(parameterPrompt) + ")";
         createTableString += localTypeName + paramString;
           // 注意,形成建立表字串的是用本地類型名,不是用jdbc中的類型名
           // 前面輸入的時候用的是jdbc中的名字
        }
           // 建立語句輸入部分結束
        createTableString += ")";
        System.out.println("");
        System.out.print("你輸入的建立表的語句是:");
       
        System.out.println(createTableString);
        System.out.println("");
           stmt.execute(createTableString);
           // 執行建立表的語句
          rs=dbmd.getColumns(null,"SYSTEM",tableName.toUpperCase(),"%");
          System.out.println("表的資訊為:表名,列名,類型號,類型名");
          while(rs.next()) {
          System.out.print(rs.getString("TABLE_NAME")+" ");
          System.out.print(rs.getString("COLUMN_NAME")+" ");
          System.out.print(rs.getInt("DATA_TYPE")+" ");
          System.out.println(rs.getString("TYPE_NAME"));
          }
            rs.close();
        stmt.close();
        con.close();
       } catch(SQLException ex) {
        System.err.println("SQLException: " + ex.getMessage());
       } 
      }
      public static String getInput(String prompt) throws SQLException {
        System.out.print(prompt);
        System.out.flush();
    //清除所有字元
        try {
         java.io.BufferedReader bin;
    //建立從字元輸入資料流中讀取文本的對象
         bin = new java.io.BufferedReader(
    //字元流為參數
          new java.io.InputStreamReader(System.in));
    //位元組流為參數,轉化成字元流
             String result = bin.readLine();
        return result;
    //返回字串
       } catch(Exception e) {
        System.out.println(e);
        return "";
     }
      }
     }




相關文章

Alibaba Cloud 10 Year Anniversary

With You, We are Shaping a Digital World, 2009-2019

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。