JAVA类型和SQL类型的匹配

已动态创建表为例

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

时间: 2024-09-08 11:02:26

JAVA类型和SQL类型的匹配的相关文章

c++-C++ float类型和double类型的输出

问题描述 C++ float类型和double类型的输出 在VS2012下,用cout<<输出float和double,为什么精度都只有6位? 解决方案 http://blog.sina.com.cn/s/blog_a459dcf501013g39.htmlhttp://wenda.so.com/q/1371005504064718 解决方案二: setprecision Sets the decimal precision used to represent floating-point v

AIDL文件中 in类型和out类型数据的区别

  最近困惑于aidl文件中 in类型和out类型数据的区别.网上很多解释是:in 输入类型.out输出类型或者in在客户端赋值,out在服务端赋值.但更加具体的就没有了.这里我贴出我写的简单代码,大家尝试一下就会有所了解,希望大家能分享下自己的理解. in表示是输入参数,out表示是输出参数,可以传出某个参数值,inout表示输入输出参数,先传入参数,处理后传出 传值,      是把实参的值赋值给行参      那么对行参的修改,不会影响实参的值           传地址      是传值

全面了解java基本类型和封装类型的区别及应用_java

1. 基本类型只能按值传递,而每个基本类型对应的封装类是按引用传递的. 2. 从性能上说java中的基本类型是在堆栈上创建的,而所有的对象类型都是在堆上创建的,(对象的引用在堆栈上创建).比如 Integer i=new Integer(10); 其中new Integer()是在堆上创建的,而他的引用Integer i是在堆栈上. 封装类的出现,是为了更方便的使用一些基本类型不具备的方法,比如valueOf(),toString()等等.还有你如果想传递一个int对象的引用,而不是值,那只能用

Javascript中Date类型和Math类型详解_基础知识

Date类型 ECMASCript中的Date类型是在早期中Java中的java.util.Date类基础上构建的.为此Date类型使用自UTC(国际协调时间)1970年1月1日午夜(0时)开始经过的毫秒数来保存日期. 创建日期对象 1.创建当前日期.不需要传入参数 2.创建指定日期.需要传入参数,必须传入表示该日期的毫秒数(即从1970年1月1日午夜起至该日期止经过的毫秒数).为了简化这一计算过程,ECMAScript提供了两个方法:Date.parse()和Date.UTC(). var n

Win32类型和.net类型的对应表

习惯用C#写东西,但平时又会碰到很多要用win32 API的地方,所以经常要用DllImport,但win32函数的类型写法是很庞杂的,相信为之困扰的不止我一个,现在我整理一份我个人的理解如下,希望高人不吝赐教.我的基本原则有如下几点:1.下面都是针对32位系统的,所以int是32位.long也是32位:2.各种句柄类的(H开头),我认为一律是System.IntPtr,到目前为止没发现出错:如果哪位在使用中出错,请指出:3.LP和P,我实在不懂(对C++不太了解),对于LP和P开头的函数,如果

Redis String 类型和 Hash 类型学习笔记与总结_Redis

Linux 版本信息: 复制代码 代码如下: cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息) CentOS release 6.6 (Final) (一)String 类型 [定义]string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个 value,其上支持的操作与 Memcached 的操作类似.但它的功能更丰富. string 类型是二进制安全的.意思是 redi

02_NoSQL数据库之Redis数据库:string类型和hash类型

 Strings类型及操作    String是最简单的类型,一个key对应一个Value,String类型是二进制安全的.Redis的String可以包含任何数据,比如jpg图片或者序列化的对象.   Set 设置Key对应的值为string类型的value. 例如:我们添加一个name=lijie的键值对: 127.0.0.1:6379> set name toto OK   //获取name的值: 127.0.0.1:6379> get name "toto"  

ORACLE DATE类型和TIMESTAMP类型DUMP换算

date 类型: 十进制: 120,115,8,14,14,46,46  7 BYTE 120  世纪字节 +100存储 115  年字节   +100存储 8    月字节   源数据存储 14   日字节   源数据存储 14   小时字节 +1存储 46   分字节   +1存储 46   秒字节   +1存储 120-100=20 115-100=15 8-0=8 14-0=14 14-1=13 46-1=45 46-1=45 2015-08-14 13:45:45 timestamp类

类型不匹配错误。利用Java反射技术将查询结果封装为对象

问题描述 packagecom.jdbc;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;pub