分享
 
 
 

JAVA类型和SQL类型的匹配

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

已动态创建表为例

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

}

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有