一路的坎坷仅仅能如今表达了。 以下就是一些问题以及过程: 最重要的问题可能就是sql语句了。今天弄了好久的sql语句中的错误。
一、我们须要先来总结我们的sql几个语句:
推断表是否存在: 方法: ResultSet getTables(String catalog,String schemaPattern,String tableNamePattern,String[] types)
參数: catalog - 类别名称,由于存储在数据库中,所以它必须匹配类别名称。
该參数为 "" 则检索没有类别的描写叙述。为 null 则表示该类别名称不应用于缩小搜索范围
schemaPattern - 模式名称的模式,由于存储在数据库中,所以它必须匹配模式名称。该參数为 "" 则检索那些没有模式的描写叙述,为 null 则表示该模式名称不应用于缩小搜索范围
tableNamePattern - 表名称模式。由于存储在数据库中。所以它必须匹配表名称
types - 要包含的表类型组成的列表,null 表示返回全部类型
返回:
ResultSet - 每一行都是一个表描写叙述
以下是代码: DatabaseMetaData meta = con.getMetaData(); ResultSet rsTable = meta.getTables(null, null, this.Clazz.getSimpleName(), null); if(rsTable.next()){ 表存在 }
推断完表后,我们就该做做下一步:假设没表,新建。添数据: 新建表的语句: CREAT TABLE tablename (id varchar(255) , age int(255)) 后面的參数是 : 你的变量名 变量类型(变量长度) , ......
加入数据的语句: insert into tablename (id , age) values (1,1) 这里就不具体解释了
其它的连接数据库直接上代码: //----------------------------- 连接数据库 --------------------------------------// public Connection ConnectingMysql() throws SQLException{ String drivename = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/dbhouse"; String userName = "root";//mysqlusername String password = "root";//mysql用户密码 try { Class.forName(drivename); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } connection = DriverManager.getConnection(url, userName, password); return connection; } //---------------------------------------------------------------------------------------//
还有个值得注意的地方: 关于最后运行sql语句的时候,statement这个接口下的三个带execute的方法,非常easy混淆。 mysql 中execute、executeQuery和executeUpdate之间的差别: http://blog.csdn.net/error/404.html?from=http%3a%2f%2fblog.csdn.net%2fmon_key_dt%2farticle%2fdetails%2f40516043
二、关于反射传递的数据 首先传入的是我要保存的对象名,通过newinstance()方法取出我的对象 Object object = this.Clazz.newInstance();
再来就是循环输出对象中的变量名和变量类型,提示输入 for (Field field : this.Clazz.getDeclaredFields()) System.out.println("please input "+field.getName()+"("+field.getType().getSimpleName()+"):"); String valueString = scanner.nextLine(); //输入数据 Object value = null; if(field.getType().equals(String.class)) //推断数据类型 { value = valueString; } ......还有非常多其它的类型推断我就不贴在这里了
每次输入完毕,保存对象信息 field.set(object, value); 最后。保存数据给全局变量,以便最后传给数据库做准备 dataName += field.getName() + ","; //全部数据的名字 if(field.getType().equals(Integer.class) || field.getType().equals(int.class)){ data[dataLength ++] = field.getName() + " int(255),"; //为数据库的creat table 做准备 dataType += "int,"; //数据类型 System.out.println("datatype : " + dataType); dataValue += valueString + ","; //数据值 System.out.println("datavalue : " + dataValue); } else { data[dataLength ++] = field.getName() + " varchar(255),"; dataType += "varchar,"; System.out.println("datatype : " + dataType); dataValue += valueString + ","; System.out.println("datavalue : " + dataValue); }
到这里。基本就已经完毕了。数据库中的insert 以及create table 也直接上代码 不上台面的方法大家就睁一仅仅眼闭一仅仅眼吧。
//新建表 String tableMessage = ""; for(int i = 0 ; i < dataLength ; i++){ tableMessage += data[i]; } String sql_newTable = "CREATE TABLE " + this.Clazz.getSimpleName() + "(" + tableMessage.substring(0, tableMessage.length() - 1) + ")"; System.out.println(sql_newTable); statement.execute(sql_newTable); //插入数据 String sql_add = "insert into " + this.Clazz.getSimpleName() + "(" + dataName.substring(0, dataName.length() - 1) + ") "//变量名 + "values(" + dataValue.substring(0, dataValue.length() - 1) +")";//(?
,?,?,?
)
System.out.println(sql_add); statement.executeUpdate(sql_add);小白一枚,有错之处希望大家及时帮我改正。
用反射完毕学生管理系统(包含数据库连接)
标签:get simple ada catch cal 长度 类别 statement turn