JAVA类型和SQL类型的匹配

原创 2005年05月28日 16:26:00
 

已动态创建表为例

(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 "";
     }
      }
     }

Java类型和SQL类型的匹配

本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》这本书中摘引来的。JavaSoft 目前正在准...
  • tong_xinglong
  • tong_xinglong
  • 2011年11月04日 14:24
  • 2980

JAVA类型和SQL类型的匹配

已动态创建表为例(1)    public class DataType {      private int code;      private String SQLType;      priv...
  • goldbox
  • goldbox
  • 2007年03月05日 11:27
  • 460

定位点类型和递归部分的类型不匹配,如何解决?

在对BOM表汇总查询的时候,做了一个小的改动,就出现了下面的我问题:服务器: 消息 240,级别 16,状态 1,行 1在递归查询 "Bom1" 的列 "UsedQty" 中,定位点类型和递归部分的类...
  • caobingyi
  • caobingyi
  • 2010年01月19日 16:07
  • 6176

关于Java类型不匹配的错误,至今才看懂

在java程序调试或运行的时候,经常会遇到java.lang.NoSuchMethodError或java.lang.ClassCastException的错误。接着是一堆如下的东西: [B can...
  • debbykindom
  • debbykindom
  • 2011年11月29日 14:22
  • 4564

SQL 类型到Java 类型的映射关系

ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean、getLong 等)。可以使用列的索引编号或列的名称获取值。一般情况下,使用列索引较为高效。列从 1 开始编号。为了...
  • mixiuali
  • mixiuali
  • 2012年09月14日 20:10
  • 1833

关于C++中输入与变量类型不匹配的解决办法

如何正确清空输入流数据,解决输入类型与变量类型不一致的问题。
  • huanghuihuang1991
  • huanghuihuang1991
  • 2017年06月06日 23:22
  • 267

解决:sql server 中date类型,检索出该类型发现日期被减少了两天

遇到的问题: 以前在使用sqlserver的时候一般日期类型我会选择使用datetime类型,最近有个项目中使用了date类型,我在数据库插入的日期是1994-07-08结果检索出来的结果是1994-...
  • SUN_song520
  • SUN_song520
  • 2016年11月13日 14:20
  • 1461

根据java编译器规则在Class中搜索匹配指定参数类型表的泛型方法(GenericMethod)

因为项目的需要,设计了一个满足特定需要的代码自动生成工具。在开发过程中需要根据方法名和方法参数类型数组在指定的类中根据java编译器的规则找到与之最匹配的泛型方法。 例如,对下面这个类 ,调用tes...
  • 10km
  • 10km
  • 2015年09月23日 14:49
  • 905

在SQL中的text或备注类型中实现模糊查询

例1 lc_memo=a SQLEXEC(1,"select * from factory where PATINDEX(%+?lc_memo+%,备注)>0")例2 ?SQLEXEC(1,"sele...
  • gdsimon
  • gdsimon
  • 2008年08月20日 13:49
  • 431

正则表达式匹配数值类型字符串

匹配数值类型字符串的正则表达式 public class Test { public static void main(String[] args) { String reg = "^-?(...
  • hu00848
  • hu00848
  • 2016年04月08日 16:36
  • 1180
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA类型和SQL类型的匹配
举报原因:
原因补充:

(最多只允许输入30个字)