1. 程式人生 > >用反射完畢學生管理系統(包含數據庫連接)

用反射完畢學生管理系統(包含數據庫連接)

幫我 循環輸出 .net into att reat 類別 學生管理系統 csdn

今天我最終將坑爹的萬能數據庫鏈接做好了第一步了,插入數據。 雖說非常easy。但還是應該總結一些問題。

一路的坎坷僅僅能如今表達了。 以下就是一些問題以及過程: 最重要的問題可能就是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);

小白一枚,有錯之處希望大家及時幫我改正。

用反射完畢學生管理系統(包含數據庫連接)